【小程序】爆肝 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格式图片

目录
相关文章
|
2月前
|
存储 JSON 小程序
微信小程序入门之新建并认识小程序结构
微信小程序入门之新建并认识小程序结构
59 1
ly~
|
3月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
86 6
|
2月前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
1003 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
2月前
|
小程序 前端开发 数据可视化
微信商城小程序WeiMall
微信商城小程序WeiMall
38 0
|
3月前
|
小程序 前端开发 API
微信小程序 - 调用微信 API 回调函数内拿不到 this 问题(解决方案)
本文讨论了在微信小程序中调用API回调函数时无法获取到`this`上下文的问题,并提供了解决方案。在回调函数中,使用一个变量(如`that`)来保存当前的`this`引用,然后在回调内部使用这个变量来访问当前页面的数据和方法。
|
4月前
|
移动开发 小程序 前端开发
|
4月前
|
JSON 小程序 JavaScript
超详细微信小程序开发学习笔记,看完你也可以动手做微信小程序项目
这篇文章是一份全面的微信小程序开发学习笔记,涵盖了从小程序介绍、环境搭建、项目创建、开发者工具使用、文件结构、配置文件、模板语法、事件绑定、样式规范、组件使用、自定义组件开发到小程序生命周期管理等多个方面的详细教程和指南。
|
4月前
|
小程序 前端开发
微信小程序商城,微信小程序微店 【毕业设计参考项目】
文章推荐了一个微信小程序商城项目作为毕业设计参考,该项目在Github上获得18.2k星,提供了详细的使用教程和前端页面实现,适合学习微信小程序开发和作为毕业设计项目。
微信小程序商城,微信小程序微店 【毕业设计参考项目】
|
4月前
|
小程序 前端开发 JavaScript
微信小程序实现微信支付(代码和注释很详细)
微信小程序实现微信支付(代码和注释很详细)
|
4月前
|
小程序 开发者
第一个微信小程序的初始化过程、小程序微信开发平台的下载、如何注册一个微信小程序的账号
这篇文章介绍了微信小程序的初始化过程,包括如何注册微信小程序账号、下载微信小程序开发者平台,并指导了新建小程序的详细步骤。
第一个微信小程序的初始化过程、小程序微信开发平台的下载、如何注册一个微信小程序的账号