使用占位组件
使用占位组件延迟加载自定义组件
使用
创建一个名称为index_addons
的一个组件分包
// app.json "subpackages": [ { "root": "index_addons", "pages": [] } ] 复制代码
修改主页配置
{ "componentPlaceholder": { "stopwatch": "view" // 欲用作占位组件 } } 复制代码
在stopwatch中添加代码
网络异常,图片无法展示
|
调试
- 设置为2g网
- 本地设置里,设置
懒注入占位组件调试
网络异常,图片无法展示
|
"lazyCodeLoading": [requiredComponents]
分包异步化
- require
- require.async 注意,只支持相对路径
使用
const { default: getNavList } = await require.async("../../../index_addons/compopnents/get_nav_list.js") 复制代码
视图代码优化技巧
动态列表渲染里优化wx:key的使用
确保wx:key
的值是唯一值
如果列表元素是单一的基本数据类型,并且是唯一的,这时候我们可以直接写成this,这里这个this,就代表当前数据列表里面的数据元素
<view wx:for="{{textList}}" wx:key="*this"></view> 复制代码
如果列表元素是静态的,只渲染一次,那么可以直接用index
<view wx:for="{{swipers}}" wx:key="index"></view> 复制代码
如果数据是从后台获取的,那么wx:key
需要有一个唯一值
<view wx:for="{{customerList}}" wx:key="{{index}}"></view> 复制代码
绑定视图事件
使用catch
代替bind
,减少dataset
的数据运输量,因为我们在大多数情况下,我们的事件不需要冒泡,所以bind
很浪费性能,catch
是不会冒泡的,事件传递某些信息的时候,需要什么传什么,不要一刀切,图省事,传递一个很大的对象,如果需要整个对象,建议使用index
进行传递
<view class="submit-btn" catchbind="onViewDetail" data-index="index">view detail</view> 复制代码
防抖&节流
节流
节流顾名思义就是控制某段JS代码的执行频率
function throttle(method, wait = 50) { let previous = 0 return function(...agrs) { let context = this let now = new Date().getTime() if(now - previouts > wait) { method.apply(context, args) previous = now } else { console.log("节流少许") } } } 复制代码
防抖
顾名思义就是防止抖动,避免把一次时间当做多次处理,敲击键盘就是一个经常都会遇到的防抖操作场景
function debounce(func, wait = 50) { let timer = null return function (...args) { const contest = this if(timer) { clearTimeout(timer) console.log("防抖少许") } timer = setTimeout(() => { func.call(context, ...args) }, wait) } } 复制代码
组件中使用
const {default:debounce} = require(../../../library/optimus/debounce.js) const {default:throttle} = require(../../../library/optimus/throttle.js) onScrolllToLower: throttle(function(e) { ... }) onTapCustomerItem: debounce(function(e) { .. }) 复制代码
尽量少的使用重渲染和wxml标签
官方建议:
总页面节点数少于1000个,节点树深度层级少于30层,子节点数不大于60个
所以,在开发过程中,能用<text>
,就不用<view>
,能用文本
,就不用<text>
,对于循环列表中,能用<block>
就不用<view>
网络异常,图片无法展示
|
WXSS优化技巧
给滚动组件开启惯性滚动
-webkit-overflow-scrolling: touch;; 复制代码
使用hover-class实现按钮的单击态
<button class="submit-btn" hover-class="submit-btn__hover"></button> 复制代码
.submit-btn { ... } .submit-btn__hover { ... } 复制代码
使用gulp工具删除无用的wxss样式代码
安装
npm install gulp -g npm install --save-dev gulp gulp-cleanwxss 复制代码
配置 /tools/gulpfile.js
const gulp = require("gulp") const cleanwxss = require("gulp-cleanwxss") // 处理父目录下的样式文件,输出到当前目录下的dist gulp.task("default", (done) => { group.src("../minniprogram/index/pages/*/*.wxss") .pipe(cleanwxss({ log: true })) .pipe(gulp.dest("./dist")) done() }) // 处理分包下的样式文件 gulp.task("goods", (done) => { group.src("../minniprogram/goods/pages/*/*.wxss") .pipe(cleanwxss({ log: true })) .pipe(gulp.dest("./dist")) done() }) 复制代码
执行
gulp default gulp goods 复制代码
CV
将生成出来的样式文件复制到对应目录即可
UI交互优化技巧
使用padding扩大可点击区域大小
.submit-btn { ... padding: 10px; } 复制代码
使用伪元素扩大可点击区域大小
.submit-btn { position: relative; ... } .submit-btn::after { content: '', position: absolute; top: -20px; right: -20px; bottom: -20px; left: -20px; } 复制代码
脚本优化技巧
清理定时器
clearTimeout(timer1) 复制代码
使用wx.onXxx全局绑定,有一个监听,必须有一个反监听
// 及时释放本页范围内添加的全局监听器 onLoad() { wx.onThemeChange(this.themeChangeHandler) } onUnload() { wx.offThemeChange(this.themeChangeHandler) } 复制代码
模拟器测试需要在app.json
中添加
"darkMode": "true" 复制代码
小心使用全局对象,适当时机清理
setData调用优化
不要多次分开调用setData,尽量合并
// bad if(this.data.gender === '1') { this.setData({ genderName: '男' }) } else if(this.data.gender === '0') { this.setData({ genderName: '女' }) } else { this.setData({ genderName: '未知' }) } // good let genderName = '未知' if(this.data.gender === '1') genderName = '男' if(this.data.gender === '0') genderName = '女' this.setData({ genderName, }) 复制代码
不准备渲染的数据,不要放在data对象中
Page({ allList: [], pageNum: 1, pageSize: 10, data: { list: [] } }) 复制代码
通过index局部更新列表数据
this.setData({ [this.data.customerList[index].title]: item.title+='---' }) 复制代码
网络请求优化技巧
减少不必要的网络请求,使用本地缓存数据
技术点:Storage
优化网络请求参数,提高网络请求效率
enableCache: true, enableHttp2: true, enableQuic: true 复制代码
优化网络请求的并发数,分优先级
npm i priority-async-queue 复制代码
request.js
const PriorityAsyncQueue = require('priority-async-queue') const queue = new PriorityAsyncQueue(10) // default 10 const low = "low", normal = "normal", mid = "mid", high = "high", "urgent" = "urgent" export const priority = { low, normal, mid, high, urgent } .... return new Promise((resolve, reject) => { queue.addTask({ priority }. () => { wx.request(Object.assgin(args,{ success: resolve, fail: reject }) }) }) 复制代码