【小程序】爆肝 3 天总结的微信小程序优化指南(收藏夹吃灰吧!)🔥🔥(下)

简介: 前言大家好,我是HoMeTown,最近要做一个小程序的项目,项目启动之前,回顾自己之前做过的小程序,感觉做的还是不够好,最近学习了一下小程序优化方案,这块总结一份个人笔记,以便参考,同时分享给大家,共勉。

使用占位组件

使用占位组件延迟加载自定义组件

使用创建一个名称为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
        })
    })
})
复制代码

图片优化技巧

减少图片的请求次数

压缩图片大小

尽可能使用CDN图片或图片链接

尽可能使用webp格式图片

目录
相关文章
|
3天前
|
存储 小程序 前端开发
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
8 0
|
10天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的微信食堂线上订餐小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的微信食堂线上订餐小程序的详细设计和实现(源码+lw+部署文档+讲解等)
|
16天前
|
小程序 前端开发 JavaScript
微信小程序|铁路订票平台小程序的设计与实现
微信小程序|铁路订票平台小程序的设计与实现
|
16天前
|
小程序 前端开发 JavaScript
微信小程序|音乐播放器小程序设计与实现
微信小程序|音乐播放器小程序设计与实现
|
16天前
|
小程序 前端开发 JavaScript
微信小程序|网上花店微信小程序的设计与实现
微信小程序|网上花店微信小程序的设计与实现
|
16天前
|
小程序 前端开发 JavaScript
微信外卖小程序
微信外卖小程序
|
16天前
|
小程序 前端开发 JavaScript
微信小程序|英语学习交流平台小程序
微信小程序|英语学习交流平台小程序
|
16天前
|
小程序 前端开发 JavaScript
微信小程序|springboot“口腔助手”小程序的设计与实现
微信小程序|springboot“口腔助手”小程序的设计与实现
|
9天前
|
小程序 前端开发 Android开发
Android企业微信分享到小程序
Android企业微信分享到小程序
12 0
|
10天前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp的微信小程序评分小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的微信小程序评分小程序的详细设计和实现(源码+lw+部署文档+讲解等)