坦途的博客

vuePress-theme-reco 坦途    2020 - 2025
坦途的博客 坦途的博客
主页
博客
  • 开发实践
  • 技术笔记
  • 技术实践
  • 前端优化
  • 鉴权
  • 心情物语
  • 杂谈游记
  • 前端
标签
时间轴
关于
author-avatar

坦途

22

文章

33

标签

主页
博客
  • 开发实践
  • 技术笔记
  • 技术实践
  • 前端优化
  • 鉴权
  • 心情物语
  • 杂谈游记
  • 前端
标签
时间轴
关于

微信小程序开发实战:高性能与最佳实践

vuePress-theme-reco 坦途    2020 - 2025

微信小程序开发实战:高性能与最佳实践

坦途 2023-09-22 微信小程序前端开发性能优化

摘要

本文将深入探讨微信小程序开发中的关键技术点,包括高性能渲染、数据管理、网络请求优化、组件化开发,以及常见的坑和解决方案。

# 一、微信小程序架构与运行机制

# 1.1 小程序的双线程架构

微信小程序采用 WebView + JSBridge + Native 的双线程架构,分为 逻辑层(JS 运行环境) 和 视图层(WebView 渲染)。

  • 逻辑层:负责数据处理、业务逻辑执行,运行在 JavaScriptCore(iOS)或 V8(Android)环境。
  • 视图层:负责 UI 渲染,运行在 WebView。
  • 通信机制:逻辑层与视图层通过 JSBridge 进行数据传递,异步操作会有一定的延迟。

理解小程序的架构,有助于在开发过程中避免不必要的性能损耗,例如避免频繁的 setData 以减少通信开销。

# 二、高性能小程序开发

# 2.1 setData 优化策略

setData 是小程序开发的核心 API,但不合理的使用可能会导致性能下降。

问题点:

  • 每次 setData 都会触发 JSON 解析、序列化,数据量大时会导致 UI 卡顿。
  • 传递的数据会经过 JSBridge,不必要的数据更新会增加通信开销。

优化方案:

  1. 减少 setData 频率,仅更新变化的数据。
  2. 避免 setData 传输大数据,例如直接修改 this.data 中的对象,而不是传递整个对象。
  3. 使用局部刷新技术,例如 this.setData({ ['list[0].name']: '新值' }),而不是 this.setData({ list: newList })。

# 2.2 组件化开发与 WXS 优化

微信小程序支持组件化开发,合理拆分组件有助于提高代码复用性和可维护性。

WXS(WeChat Script) 是小程序提供的一种 高性能脚本语言,运行在视图层,适用于数据计算、格式化等操作。

使用 WXS 的优势:

  • 运行在 WebView 端,不会阻塞 JS 线程。
  • 比 setData 更高效,适用于模板数据格式化。

示例:

// utils.wxs
function formatPrice(price) {
  return (price / 100).toFixed(2);
}
module.exports = { formatPrice };
<!-- 组件中使用 -->
<view>{{ price | formatPrice }}</view>
<script>
const utils = require("../utils.wxs");
</script>

# 2.3 使用 virtual-list 优化长列表

问题点:

  • 小程序默认的列表渲染方式会在 DOM 中保留所有节点,导致 长列表卡顿。

解决方案:

  • 使用 wx.createIntersectionObserver() 进行懒加载。
  • 使用 virtual-list(虚拟列表) 只渲染可视范围的元素。

示例:

<scroll-view scroll-y>
  <view wx:for="{{visibleList}}" wx:key="id">{{ item.name }}</view>
</scroll-view>
Page({
  data: {
    allData: [],
    visibleList: [],
  },
  onLoad() {
    this.loadData();
  },
  loadData() {
    const rawData = fetchData();
    this.setData({
      visibleList: rawData.slice(0, 20),
    });
  },
});

# 三、网络请求优化

# 3.1 避免过多的 HTTP 请求

小程序对 并发请求数 有限制(一般为 10 个),如果请求过多,会导致后续请求被阻塞。

优化策略:

  • 使用 requestTask:在请求未完成前,可调用 requestTask.abort() 终止。
  • 批量请求:如果需要一次请求多个数据,建议 合并请求 以减少 HTTP 连接数。
  • 本地缓存:减少对接口的重复请求,例如使用 wx.getStorageSync。

示例:

wx.request({
  url: 'https://api.example.com/products',
  success(res) {
    wx.setStorageSync('products', res.data);
  }
});

# 3.2 WebSocket 长连接

如果需要实时数据(如聊天、股票行情),建议使用 WebSocket,避免频繁轮询。

const socket = wx.connectSocket({
  url: 'wss://example.com/socket',
});

socket.onMessage((msg) => {
  console.log('收到消息:', msg.data);
});

# 四、异常处理与兼容性

# 4.1 兼容不同机型

小程序需要适配 不同屏幕尺寸 和 低版本微信。

适配方案:

  • flex + rpx 实现自适应布局。
  • 使用 wx.canIUse 检测 API 兼容性。
if (!wx.canIUse('button.open-type.getUserInfo')) {
  console.warn('当前微信版本过低,不支持 getUserInfo');
}