Taro:高性能小程序的最佳实践 | 京东云技术团队
字数 1184 2025-08-10 08:28:13

Taro 高性能小程序开发最佳实践

前言

Taro 是一个开放式的跨端跨框架解决方案,在小程序和 H5 应用中广泛应用。Taro 3 相比前代版本更加注重运行时而轻量化编译时,虽然提供了更高效的代码编写方式和更丰富的生态系统,但在性能方面可能存在一些损耗。本文详细介绍如何通过最佳实践提升 Taro 小程序的性能表现。

一、提升初次渲染性能

预渲染功能(Prerender)

当初次渲染数据量很大时,可能导致页面白屏。Taro 提供了预渲染功能来解决这个问题。

配置方法
在项目配置文件(index.js/dev.js/prod.js)中添加以下配置:

const config = {
  mini: {
    prerender: {
      match: 'pages/shop/**',  // 匹配路径
      include: ['pages/any/way/index'],  // 包含特定页面
      exclude: ['pages/shop/index/index']  // 排除特定页面
    }
  }
};
module.exports = config;

二、提升更新性能

Taro 使用小程序的 template 进行渲染,所有 setData 更新都需要由页面对象调用,当页面结构复杂时性能可能下降。

1. 全局配置项 baseLevel

对于不支持模板递归的小程序(微信、QQ、京东等),当 DOM 层级达到一定数量后,Taro 会使用原生自定义组件辅助递归渲染。

配置方法

// 建议设置为 8 或 4
const config = {
  mini: {
    baseLevel: 8
  }
};

注意事项

  • 跨原生自定义组件时,flex 布局会失效
  • 在 SelectorQuery.select 方法中,跨组件后代选择器需要增加 >>>.the-ancestor >>> .the-descendant

2. 使用 CustomWrapper 组件

CustomWrapper 创建原生自定义组件,用于调用后代节点的 setData 方法,实现局部更新。

示例

import { View, Text } from '@tarojs/components'

export default function() {
  return (
    <View className="index">
      <Text>Demo</Text>
      <CustomWrapper>
        <GoodsList />
      </CustomWrapper>
    </View>
  )
}

三、提升长列表性能

1. VirtualList 组件(虚拟列表)

只渲染当前可见区域视图,提高长列表滚动流畅性。

示例

import VirtualList from '@tarojs/components/virtual-list'

function buildData(offset = 0) {
  return Array(100).fill(0).map((_, i) => i + offset)
}

const Row = React.memo(({ id, index, data }) => {
  return (
    <View id={id} className={index % 2 ? 'ListItemOdd' : 'ListItemEven'}>
      Row {index}: {data[index]}
    </View>
  )
})

export default class Index extends Component {
  state = {
    data: buildData(0)
  }
  
  render() {
    const { data } = this.state
    const dataLen = data.length
    return (
      <VirtualList
        height={800}  // 列表高度
        width="100%"  // 列表宽度
        item={Row}    // 列表单项组件
        itemData={data}  // 渲染数据
        itemCount={dataLen}  // 数据长度
        itemSize={100}  // 单项高度
      />
    )
  }
}

2. VirtualWaterfall 组件(虚拟瀑布流)

示例

import { VirtualWaterfall } from '@tarojs/components-advanced'

// 使用方式与VirtualList类似

四、避免 setData 数据量过大

1. 谨慎处理节点删除

问题示例

<View>
  <Slider />
  <Goods />
  {isShowModal && <Modal />}
</View>

isShowModal 从 true 变为 false 时,Modal 的兄弟节点(Slider + Goods)都会被更新。

优化方案

<View>
  <Slider />
  <Goods />
  <View>
    {isShowModal && <Modal />}
  </View>
</View>

2. 保持基础组件属性引用

问题示例

<Map 
  latitude={22.53332} 
  longitude={113.93041} 
  markers={[
    { latitude: 22.53332, longitude: 113.93041 }
  ]} 
/>

每次渲染都会创建新的 markers 对象,触发不必要的更新。

优化方案

<Map 
  latitude={22.53332} 
  longitude={113.93041} 
  markers={this.state.markers}
/>

五、更多最佳实践

1. 阻止滚动穿透

方法一:使用样式(推荐)

{
  overflow: hidden;
  height: 100vh;
}

方法二:使用 catchMove

<View catchMove />

2. 跳转预加载

示例

// 当前页面
Taro.preload(fetchSomething())
Taro.navigateTo({ url: '/pages/detail' })

// 目标页面
console.log(getCurrentInstance().preloadData)

3. 缓存 Taro.getCurrentInstance() 结果

示例

class Index extends React.Component {
  inst = Taro.getCurrentInstance()
  
  componentDidMount() {
    console.log(this.inst)
  }
}

六、即将推出的 CompileMode

CompileMode 在编译阶段将 JSX/Vue template 代码提前编译为小程序模板代码,减少虚拟 DOM 树节点数量,提高渲染性能。

使用方法

function GoodsItem() {
  return (
    <View compileMode>
      ...
    </View>
  )
}

结语

通过以上最佳实践,可以显著提升 Taro 小程序的性能表现。未来 Taro 将持续探索更多优化方案,为开发者提供更高效的开发体验。

Taro 高性能小程序开发最佳实践 前言 Taro 是一个开放式的跨端跨框架解决方案,在小程序和 H5 应用中广泛应用。Taro 3 相比前代版本更加注重运行时而轻量化编译时,虽然提供了更高效的代码编写方式和更丰富的生态系统,但在性能方面可能存在一些损耗。本文详细介绍如何通过最佳实践提升 Taro 小程序的性能表现。 一、提升初次渲染性能 预渲染功能(Prerender) 当初次渲染数据量很大时,可能导致页面白屏。Taro 提供了预渲染功能来解决这个问题。 配置方法 : 在项目配置文件( index.js / dev.js / prod.js )中添加以下配置: 二、提升更新性能 Taro 使用小程序的 template 进行渲染,所有 setData 更新都需要由页面对象调用,当页面结构复杂时性能可能下降。 1. 全局配置项 baseLevel 对于不支持模板递归的小程序(微信、QQ、京东等),当 DOM 层级达到一定数量后,Taro 会使用原生自定义组件辅助递归渲染。 配置方法 : 注意事项 : 跨原生自定义组件时,flex 布局会失效 在 SelectorQuery.select 方法中,跨组件后代选择器需要增加 >>> : .the-ancestor >>> .the-descendant 2. 使用 CustomWrapper 组件 CustomWrapper 创建原生自定义组件,用于调用后代节点的 setData 方法,实现局部更新。 示例 : 三、提升长列表性能 1. VirtualList 组件(虚拟列表) 只渲染当前可见区域视图,提高长列表滚动流畅性。 示例 : 2. VirtualWaterfall 组件(虚拟瀑布流) 示例 : 四、避免 setData 数据量过大 1. 谨慎处理节点删除 问题示例 : 当 isShowModal 从 true 变为 false 时,Modal 的兄弟节点(Slider + Goods)都会被更新。 优化方案 : 2. 保持基础组件属性引用 问题示例 : 每次渲染都会创建新的 markers 对象,触发不必要的更新。 优化方案 : 五、更多最佳实践 1. 阻止滚动穿透 方法一:使用样式(推荐) 方法二:使用 catchMove 2. 跳转预加载 示例 : 3. 缓存 Taro.getCurrentInstance() 结果 示例 : 六、即将推出的 CompileMode CompileMode 在编译阶段将 JSX/Vue template 代码提前编译为小程序模板代码,减少虚拟 DOM 树节点数量,提高渲染性能。 使用方法 : 结语 通过以上最佳实践,可以显著提升 Taro 小程序的性能表现。未来 Taro 将持续探索更多优化方案,为开发者提供更高效的开发体验。