数组更新视图不刷新问题

在uni-app中使用数组更新相关的操作, 视图却不更新, 可以通过同时更新一个辅助变量进行更改:

  1. <template lang='pug'>
  2. view
  3. view {{arr}}
  4. button(@click='click') click me
  5. </template>
  6. <script>
  7. export default {
  8. data () {
  9. return {
  10. arr: [1,2,3],
  11. status: false
  12. }
  13. },
  14. methods: {
  15. click () {
  16. this.status = !this.status
  17. this.arr.push(4)
  18. }
  19. }
  20. }
  21. </script>

这个uni-app的bug很神叨, 这个解决方案也是偶然摸索中得出, 希望官方在后续更新中解决。

在uni-app中添加模板支持

用惯了 pug 和 stylus 的编码形式,就对 html 和 css 心生嫌弃。在 HBuilderX 中添加这些语言的支持是很容易的。

选择 菜单栏 -> 插件 -> 插件安装
001.png

然后到 HBuilderX 安装目录下的 plugins 目录下安装相应插件,比如 pug 和 stylus:

  1. npm i pug pug-loader stylus stylus-loader --save

即可在代码区写相关的代码了。

unable to locate

  1. [copy-webpack-plugin] WARNING - unable to locate 'D:\Datas\uni-app\static'

早上重装了系统,从 Coding 拉下项目来,运行时报了那么一个警告,很是郁闷,检查了半天,发现根目录下的 static 文件夹不见了,由于 git 提交时忽略了空目录,所以拉下来才报这个错。

解决方案:在项目根下创建 static 文件夹即可。

… exceed the max of “500KB”

006.png
npm 装上 lodash 之后,引入后会报这个错误,说是包太大了。

新版 lodash 是可以分包的,其实我只是想使用 throttle 而已,于是就重新装了个 lodash.throttle 即可。

另外,经测试很多 npm包是不能使用的,比如 JQuery、axios 等等。

vendor.js 过大的处理方式

小程序工具提示vendor.js过大,已经跳过es6向es5转换。这个转换问题本身不用理会,因为vendor.js已经是es5的了。

关于体积控制,参考如下:

  • 使用运行时代码压缩
    • HBuilderX创建的项目勾选运行-->运行到小程序模拟器-->运行时是否压缩代码
    • cli创建的项目可以在pacakge.json中添加参数--minimize,示例:"dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch --minimize"
  • 使用分包优化,关于分包优化的说明

参考:vendor.js 过大的处理方式


除了官方的解决方案,还可以配置webpack开启gzip进一步缩小打包体积。

首先安装 [compression-webpack-plugin](https://www.npmjs.com/package/compression-webpack-plugin)

  1. yarn add -D compression-webpack-plugin@1.1.12

然后创建一个 vue.config.js 文件:

  1. const path = require('path')
  2. const CompressionWebpackPlugin = require('compression-webpack-plugin')
  3. const productionGzipExtensions = ['js', 'css']
  4. // 这是配置路径引用的,可以不要
  5. // function resolve(dir) {
  6. // return path.join(__dirname, dir)
  7. // }
  8. module.exports = {
  9. chainWebpack: config => {
  10. // 配置路径引用
  11. // config.resolve.alias.set('@', resolve('/src'))
  12. },
  13. configureWebpack: {
  14. plugins: [
  15. new CompressionWebpackPlugin({
  16. filename: '[path].gz[query]',
  17. algorithm: 'gzip',
  18. test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'), // 匹配文件名
  19. threshold: 102400, // 对10K以上的数据进行压缩
  20. minRatio: 0.8,
  21. deleteOriginalAssets: false // 是否删除源文件
  22. })
  23. ]
  24. }
  25. }

再次执行打包命令,可以看到包体积变小一些了。

参考:

不同包下的组件引用问题

如果在A包下引入B包下的组件,编译后会出现很奇怪的问题,建议将不同包都需要引用的组件放到 components下,使用easycom的方式引入。


微信小程序官方当前正在处理的问题:
https://developers.weixin.qq.com/community/develop/issueList?type=&status=develop&search=

vue3+vite+pug模板引入问题

如果项目是使用vue3+vite创建的,并且引入了pug模板,编译到小程序端,局部引入的组件将无法正确渲染。
比如:

  1. <template lang='pug'>
  2. view
  3. view {{count}}
  4. CompA
  5. </template>
  6. <script>
  7. import CompA from './comp-a.vue'
  8. export default {
  9. components: { CompA },
  10. data() {
  11. return {
  12. count: 0
  13. }
  14. },
  15. }
  16. </script>

这样引入的话,CompA将无法正确渲染。

解决方案:使用script setup引入

  1. <template lang='pug'>
  2. view
  3. view {{count}}
  4. CompA
  5. </template>
  6. <script setup>
  7. import CompA from './comp-a.vue'
  8. </script>
  9. <script>
  10. export default {
  11. data() {
  12. return {
  13. count: 0
  14. }
  15. },
  16. }
  17. </script>

富文本解析问题

对于rich-text组件,各个小程序端支持情况不同。微信和头条支持文本类型的nodes节点,支付宝只支持DOM树节点列表。

以下为各家小程序官方文档对于rich-text组件的说明。
微信小程序:
Snipaste_2022-01-12_16-54-42.png
字节跳动小程序:
Snipaste_2022-01-12_16-55-33.png
支付宝小程序:
Snipaste_2022-01-12_16-57-09.png

如果服务端返回的富文本为一段HTML,则需要通过mini-html-parsernpm)解析为DOM树节点列表。

使用方法如下:
安装:

  1. yarn add mini-html-parser2

引入:

  1. import parse from 'mini-html-parser2'
  2. let htmlStr = '<div>123</div>'
  3. // 使用插件进行html代码转换(htmlStr为html代码,htmlNodes是转换后的数组)
  4. parse(htmlStr, (err, htmlNodes) => {
  5. console.log(err, htmlNodes)
  6. })

解析结果:

  1. [
  2. {
  3. "name": "div",
  4. "children": [
  5. {
  6. "type": "text",
  7. "text": "123"
  8. }
  9. ],
  10. "attrs": {}
  11. }
  12. ]