taro之--性能优化

性能优化

虚拟列表

在帖子列表组件(ThreadList)中,我们直接渲染从远程得来的数据。这样做没有什么问题,但如果我们的数据非常庞大,或者列表渲染的 DOM 结构异常复杂,这就可能会产生性能问题。

为了解决这一问题,Taro 内置了虚拟列表(VirtualList)功能,比起全量渲染所有列表数据,我们只需要渲染当前可视区域(visable viewport)的视图:

  • React
  • Vue

app.js

// 在入口文件新增使用插件
import VirtualList from '@tarojs/components/virtual-list'
Vue.use(VirtualList)

src/components/row.vue

<template>
  <thread
    :key="thread.id"
    :node="thread.node"
    :title="thread.title"
    :last_modified="thread.last_modified"
    :replies="thread.replies"
    :tid="thread.id"
    :member="thread.member"
  />
</template>

<script>
  import Thread from './thread.vue'
  export default {
    components: {
      thread: Thread,
    },
    props: ['index', 'data', 'css'],
    computed: {
      thread() {
        return this.data[this.index]
      },
    },
  }
</script>

src/components/thread_list.vue

<template>
  <view className="thread-list">
    <loading v-if="loading" />
    <virtual-list
      v-else
      :height="500"
      :item-data="threads"
      :item-count="threads.length"
      :item-size="100"
      :item="Row"
      width="100%"
    />
  </view>
</template>

<script>
  import Vue from 'vue'
  import Loading from './loading.vue'
  import Thread from './thread.vue'
  import Row from './row.vue'
  export default {
    components: {
      loading: Loading,
      thread: Thread,
    },
    props: {
      threads: {
        type: Array,
        default: [],
      },
      loading: {
        type: Boolean,
        default: true,
      },
    },
  }
</script>

了解更多

在文档虚拟列表 你可以找到虚拟列表的一些高级用法,例如:无限滚动、滚动偏移、滚动事件等。

预渲染

现在我们来实现最后一个页面:节点列表页面。这个页面本质说就是渲染一个存在本地的巨大列表:

  • React
  • Vue

src/pages/nodes/nodes.vue

<template>
  <view class="node-container">
    <view v-for="item in allNodes" :key="item.title" class="container">
      <view class="title">
        <text style="margin-left: 5px">{{item.title}}</text>
      </view>
      <view class="nodes">
        <navigator v-for="node in item.nodes" :key="node.full_name" class="tag" :url="node | url">
          <text>{{node.full_name}}</text>
        </navigator>
      </view>
    </view>
  </view>
</template>

<script>
  import Vue from 'vue'
  import allNodes from './all_node'
  import api from '../../utils/api'
  import './nodes.css'

  function getURL(node) {
    return `/pages/node_detail/node_detail${api.queryString(node)}`
  }

  export default {
    data() {
      return {
        allNodes,
      }
    },
    filters: {
      url(node) {
        return getURL(node)
      },
    },
  }
</script>

这个时候我们整个应用就完成了。但如果你把这个应用放在真机小程序中,尤其是一些性能不高的真机中,切换到此页面的时间可能会比较长,会有一段白屏时间。

这是由于 Taro 的渲染机制导致的:在页面初始化时,原生小程序可以从本地直接取数据渲染,但 Taro 会把初始数据通过 React/Vue 渲染成一颗 DOM 树,然后将这颗 DOM 树序列化之后交给小程序渲染。也就是说,比起原生小程序 Taro 会在页面初始化时多一次调用 setData 函数的支出——而大部分小程序的性能问题是 setData 数据过大导致的。

为了解决这个问题,Taro 引入了一种名为预渲染(Prerender)的技术,和服务端渲染一样,在 Taro CLI 直接将要渲染的页面转换为 wxml 字符串,这样就获得了与原生小程序一致甚至更快的速度。

使用预渲染也非常简单,我们只要进行简单的配置即可:

config/prod.js

const config = {
  ...
  mini: {
    prerender: {
      include: ['pages/nodes/nodes'], // `pages/nodes/nodes` 也会参与 prerender
    }
  }
};

// 我们这里在编译生产模式时才开启预渲染
// 如果需要开发时也开启,那就把配置放在 `config/index` 或 `config/dev`
module.exports = config
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Taro 是一款多端开发框架,可以将小程序、H5、React Native 等多端应用进行统一开发和管理。Taro 可以通过以下方式来提升小程序的性能: 1. 代码压缩 在 Taro 中,可以通过配置 `terser` 插件来进行 JavaScript 代码压缩,从而减少代码的体积,提升小程序的加载速度。 2. 开启 Tree Shaking Tree Shaking 是一种 JavaScript 代码优化技术,可以通过静态分析的方式来删除无用的代码,从而减少代码的体积。在 Taro 中,可以通过配置 `webpack-chain` 来开启 Tree Shaking。 3. 图片压缩 在 Taro 中,可以使用 `taro-plugin-imagemin` 插件来对图片进行压缩,从而减少图片的大小,提升小程序的加载速度。 4. 避免在组件中频繁使用 `setState` 在 Taro 中,频繁地使用 `setState` 会导致页面的重绘和回流,影响小程序的性能。可以通过使用 `useMemo`、`useCallback` 等 React Hooks 来减少不必要的组件渲染。 5. 使用 Taro UI Taro UI 是一款基于 Taro 开发的 UI 组件库,可以提供一些高效、易用、美观的 UI 组件,从而减少开发者自己编写组件的时间和精力,提升小程序的开发效率和性能。 6. 避免过多的 HTTP 请求 在 Taro 中,可以通过合并请求、缓存数据、使用图片懒加载等方式来减少 HTTP 请求次数,从而提升小程序的性能。 总之,Taro 可以通过代码压缩、Tree Shaking、图片压缩、避免频繁使用 `setState`、使用 Taro UI 等方式来提升小程序的性能。同时,开发者也需要关注小程序的网络请求、数据处理、DOM 操作等方面,从多个方面来考虑和实践性能优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞬间的醒悟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值