uniapp性能优化专题

news2024/11/15 23:41:48

运行原理

逻辑层和视图层分离,且非 H5 端通信有折损

逻辑层详解

视图层详解

逻辑层和视图层分离的利与弊

app-vue 和小程序的数据更新,分页面级和组件级

优化建议

避免使用大图

优化数据更新

长列表

展示全部

#性能优化专题

#运行原理

#逻辑层和视图层分离,且非 H5 端通信有折损

uni-app 在非 H5 端运行时,从架构上分为逻辑层和视图层两个部分。逻辑层负责执行业务逻辑,也就是运行 js 代码,视图层负责页面渲染。

虽然开发者在一个 vue 页面里写 js 和 css,但其实,编译时就已经将它们拆分了。

#逻辑层详解

逻辑层是运行在一个独立的 jscore 里的,它不依赖于本机的 webview,所以一方面它没有浏览器兼容问题,可以在 Android4.4 上跑 es6 代码,另一方面,它无法运行 windowdocumentnavigatorlocalstorage 等浏览器专用的 js API。

jscore就是一个标准 js 引擎,标准 js 是可以正常运行的,比如 if、for、各种字符串、日期处理等。js 和浏览器的区别要注意区分开来。 `

  • 所谓浏览器的 js 引擎,就是 jscore 或 v8 的基础上新增了一批浏览器专用 API,比如 dom;
  • node.js 引擎,则是 v8 基础上补充一些电脑专用 API,比如本地 io;
  • 那么 uni-app 的 App 端和小程序端的 js 引擎,其实是在 jscore 上补充了一批手机端常用的 JS API,比如扫码。

#视图层详解

h5 和小程序平台,以及 app-vue,视图层是 webview。而 app-nvue 的视图层是基于 weex 改造的原生渲染视图。

关于 webview,在 iOS 上,只能使用 iOS 提供的 Webview(默认是 WKWebview)。它有一定的浏览器兼容问题,iOS 版本不同,它的表现有细微差异(一般可忽略)。

Android 上小程序大多自带了一个几十 M 的 chromium webview,而 App 端没办法带这么大体积的三方包,所以 App 端默认使用了 Android system webview,这个系统 webview 跟随手机不同而有差异。当然 App 端也支持使用腾讯 X5 引擎,此时可以在 Android 端统一视图层。

所以 uni-app 的 js 基本没有不同手机的兼容问题(因为 js 引擎自带了),而视图层的 css,在 app-vue 上使用系统 webview 时会有手机浏览器的 css 兼容问题。此时或者不要用太新的 css 语法,或者集成腾讯 x5 引擎。

#逻辑层和视图层分离的利与弊

逻辑层和视图层分离,好处是 js 运算不卡渲染,最简单直接的感受就是:窗体动画稳。

如果开发者使用过 App,应该有概念,webview 新窗体一边做进入动画,一边自身渲染,很容易卡动画。而 uni-app 则无需写预载代码,新窗体渲染快且动画稳定。

但是两层分离也带来一个坏处,这两层互相通信,其实是有损耗的。

iOS 还好,但 Android 低端机上,每次通信都要耗时几十毫秒。平时看不出来影响,但有几个场景表现明显。

  1. 连续高帧率绘制 canvas 动画,会发现还不如 webview 内部绘制流畅
  2. 视图层滚动、跟手操作,不停反馈给逻辑层,js 再处理逻辑并通知视图层做对应更新。此时会发现交互不跟手或卡

不管小程序还是 app,不管 app-vue 还是 app-nvue,都有这个两层通信损耗的问题。

解决这类问题,在 webview 渲染和原生渲染引用了不同的做法:

  • webview 渲染的视图层

在 app-vue 和微信小程序上,提供了一种运行于视图层的专属 js,微信叫做wxs。

wxs 中可以监听手势,以 uni ui 的 swiperAction 组件为例,手指拖动,侧边的列表菜单项要跟手滑出,此时就需要使用 wxs 才能实现流畅效果。还有插件市场里一些自定义下拉刷新的插件,通过 wxs 实现了更高的性能体验。

uni-app 支持把 wxs 编译到微信小程序、App 和 H5 中。

微信里对 wxs 限制较多,只能实现有限的功能。app 端提供了更强大的renderjs,并兼容到 H5 平台。

比如 canvas 动画,微信的 canvas 无法通过 wxs 操作,js 不停绘制 canvas 动画因通信折损而无法流畅。uni-app 的 app-vue 里的 canvas 对象设计在 webview 视图层的,通过 renderjs 可以在视图层直接操作 canvas 动画,将不再有通信折损,实现更流畅的效果,详见:renderjs

  • 原生渲染的视图层

在 app-nvue 里,逻辑层和视图层的折损一样存在。包括 react native 也有这个问题。所以也千万别以为原生渲染就多么高级。

weex 提供了一套 bindingx 机制,可以在 js 里一次性传一个表达式给原生层,由原生层解析后根据指令操作原生的视图层,避免反复跨层通信。这个技术在 uni-app 里也可以使用。

bindingx 作为一种表达式,它的功能不及 js 强大,但手势监听、动画还是可以实现的,比如 uni ui 的 swiperAction 组件在 app-nvue 下运行时会自动启用 bindingx,以实现流畅跟手。

#app-vue 和小程序的数据更新,分页面级和组件级

对于复杂页面,更新某个区域的数据时,需要把这个区域做成组件,这样更新数据时就只更新这个组件,否则会整个页面的数据更新,造成点击延迟卡顿。

比如微博长列表页面,点击一个点赞图标,赞数要立即+1,此时这个点赞按钮一定要做成组件。否则这个+1 会引发页面级所有数据的从 js 层向视图层的同步。

app-nvue 和 h5 不存在此问题。造成差异的原因是小程序目前只提供了组件差量更新的机制,不能自动计算所有页面差量。

#优化建议

#避免使用大图

页面中若大量使用大图资源,会造成页面切换的卡顿,导致系统内存升高,甚至白屏崩溃。

尤其是不要把多张大图缩小后显示在一个屏幕内,比如上传图片前选了数张几 M 体积的照片,然后缩小在一个屏幕中展示多张几 M 的大图,非常容易白屏崩溃。

对大体积的二进制文件进行 base64,也非常耗费资源。

#优化数据更新

在 uni-app 中,定义在 data 里面的数据每次变化时都会通知视图层重新渲染页面。所以如果不是视图所需要的变量,可以不定义在 data 中,可在外部定义变量或直接挂载在 vue 实例上,以避免造成资源浪费。

#长列表

  • 长列表中如果每个 item 有一个点赞按钮,点击后点赞数字+1,此时点赞组件必须是一个单独引用的组件,才能做到差量数据更新。否则会造成整个列表数据重载。
  • 长列表中每个 item 并不一定需要做成组件,取决于你的业务中是否需要差量更新某一行 item 的数据,如没有此类需求则不应该引入大量组件。(点击 item 后背景变色,属于 css 调整,没有更新 data 数据和渲染,不涉及这个问题)
  • 单个组件中存在大量数据时(比如长列表),在 App 和小程序端数据更新时会消耗较多时间,建议使用组件对数据进行分页,将变更限制更小范围。可以参考:长列表优化示例
  • app 端 nvue 的长列表应该使用 list 组件,有自动的渲染资源回收机制。vue 页面使用页面滚动的性能,好于使用 scroll-view 的区域滚动。uni ui 封装了 uList 组件,在 app-nvue 下使用了 list 组件,在其他环境使用页面滚动,自动适配,强烈推荐开发者使用,避免自己写的不好产生性能问题。
  • 如需要左右滑动的长列表,请在 HBuilderX 新建 uni-app 项目选新闻模板,那是一个标杆实现。自己用 swiper 和 scroll-view 做很容易引发性能问题。

#减少一次性渲染的节点数量

页面初始化时,逻辑层如果一次性向视图层传递很大的数据,使视图层一次性渲染大量节点,可能造成通讯变慢、页面切换卡顿,所以建议以局部更新页面的方式渲染页面。如:服务端返回 100 条数据,可进行分批加载,一次加载 50 条,500ms 后进行下一次加载。

#减少组件数量、减少节点嵌套层级

深层嵌套的节点在页面初始化构建时往往需要更多的内存占用,并且在遍历节点时也会更慢些,所以建议减少深层的节点嵌套。

有些 nvue 页面在 Android 低端机上初次渲染时,会看到从上到下的渲染过程,这往往都是因为组件过多导致的。每个组件渲染时都会触发一次通信,太多组件就会阻塞通信。

#避免视图层和逻辑层频繁进行通讯

  • 减少 scroll-view 组件的 scroll 事件监听,当监听 scroll-view 的滚动事件时,视图层会频繁的向逻辑层发送数据;
  • 监听 scroll-view 组件的滚动事件时,不要实时的改变 scroll-top/scroll-left 属性,因为监听滚动时,视图层向逻辑层通讯,改变 scroll-top/scroll-left 时,逻辑层又向视图层通讯,这样就可能造成通讯卡顿。
  • 注意 onPageScroll 的使用,onPageScroll 进行监听时,视图层会频繁的向逻辑层发送数据;
  • 多使用 css 动画,而不是通过 js 的定时器操作界面做动画
  • 如需在 canvas 里做跟手操作,app 端建议使用 renderjs,小程序端建议使用 web-view 组件。web-view 里的页面没有逻辑层和视图层分离的概念,自然也不会有通信折损。

#优化页面切换动画

  • 页面初始化时若存在大量图片或原生组件渲染和大量数据通讯,会发生新页面渲染和窗体进入动画抢资源,造成页面切换卡顿、掉帧。建议延时 100ms~300ms 渲染图片或复杂原生组件,分批进行数据通讯,以减少一次性渲染的节点数量。
  • App 端动画效果可以自定义。popin/popout 的双窗体联动挤压动画效果对资源的消耗更大,如果动画期间页面里在执行耗时的 js,可能会造成动画掉帧。此时可以使用消耗资源更小的动画效果,比如 slide-in-right/slide-out-right。
  • App-nvue 和 H5,还支持页面预载,uni.preloadPage,可以提供更好的使用体验

#优化背景色闪白

HBuilder X 3.6.9+ 已支持暗黑模式。详情

  1. 如果是新页面进入时背景闪白
  • 如果页面背景是深色,在 vue 页面中可能会发生新窗体刚开始动画时是灰白色背景,动画结束时才变为深色背景,造成闪屏。这是因为 webview 的背景生效太慢的问题。此时需将样式写在 App.vue 里,可以加速页面样式渲染速度。App.vue 里面的样式是全局样式,每次新开页面会优先加载 App.vue 里面的样式,然后加载普通 vue 页面的样式。
  • app 端还可以在 pages.json 的页面的 style 里单独配置页面原生背景色,比如在 globalStyle->style->app-plus->background 下配置全局背景色
"style": {
    "app-plus": {
        "background":"#000000"
    }
}

复制代码

  • 另外 nvue 页面不存在此问题,也可以更改为 nvue 页面。
  • 注意:以上优化方案在 HBuilderX 2.7.7 以上版本时运行在 iOS12 以下系统效果较差,请等待优化。
  1. 如果是老页面消失时背景闪白 Android 上 popin 动画时,老窗体会有一个半透明消失的效果。这个半透明效果的背景色,可以根据需要调节为暗色系。 在 pages.json 里 globalStyle 下或指定页面下,配置 app-plus 专属节点,然后配置 animationAlphaBGColor 属性。

#使用 nvue 代替 vue

在 App 端 uni-app 的 nvue 页面可是基于 weex 升级改造的原生渲染引擎,实现了页面原生渲染能力、提高了页面流畅性。若对页面性能要求较高可以使用此方式开发,详见:nvue。

#优化启动速度

  • 工程代码越多,包括背景图和本地字体文件越大,对小程序启动速度有影响,应注意控制体积。组件引用的前景图不影响性能。
  • App 端的 splash 关闭有白屏检测机制,如果首页一直白屏或首页本身就是一个空的中转页面,可能会造成 splash 10 秒才关闭,可参考此文解决 uni-app 启动界面(splash)参数配置说明 | 启动慢的原因 - DCloud问答
  • App 端,首页为 nvue 页面时,并设置为 fast 启动模式,此时 App 启动速度最快。
  • App 设置为纯 nvue 项目(manifest 里设置 app-plus 下的 renderer:"native"),这种项目的启动速度更快,2 秒即可完成启动。因为它整个应用都使用原生渲染,不加载基于 webview 的那套框架。
  • 分包。app也支持分包,分包可以让启动时只加载部分js。对于工程下js非常多的情况比较合适。详见

#优化包体积

  • uni-app 发行到小程序时,自带引擎只有几十 K,主要是一个定制过的 vue.js 核心库。如果使用了 es6 转 es5、css 对齐的功能,可能会增大代码体积,可以配置这些编译功能是否开启。
  • uni-app 的 H5 端,自带了 vue.js、vue-router 及部分 es6 polyfill 库,这部分的体积 gzip 后只有 92k,和 web 开发使用 vue 基本一致。而内置组件 ui 库(如 picker、switch 等)、小程序的对齐 js api 等,相当于一个完善的大型 ui 库。但大多数应用不会用到所有内置组件和 API。由此 uni-app 提供了摇树优化机制,未摇树优化前的 uni-app 整体包体积约 500k,服务器部署 gzip 后 162k。开启摇树优化需在 manifest 配置,详情。
  • uni-app 的 App 端,因为自带了一个独立 v8 引擎和小程序框架,所以比 HTML5Plus 或 mui 等普通 hybrid 的 App 引擎体积要大。Android 基础引擎约 9M。App 还提供了扩展模块,比如地图、蓝牙等,打包时如不需要这些模块,可以裁剪掉,以缩小发行包体积。在 manifest.json-App 模块权限 里可以选择。
  • App 端支持如果选择纯 nvue 项目(manifest 里设置 app-plus 下的 renderer:"native"),包体积可以进一步减少 2M 左右。
  • uni-app 的 App-Android 端有 so 库的概念,支持不同的 cpu 类型的 so 库越多,包越大。在 HBuilderX 2.7 以前,Android app 默认包含 arm32 和 x86 两个 cpu 的支持 so 库。包体积比较大。如果你在意体积控制,可以在 manifest 里去掉 x86 cpu 的支持(manifest 可视化界面-App 其他设置里选择 cpu),这可以减少包体积到 9M。从 HBuilderX 2.7 起,默认不再包含 x86,如有需求请自行在 manifest 里勾选后打包。一般手机都是 arm 的,涉及 x86 cpu 场景很少,包括:个别少见的 Android pad、AS 的模拟器里选择 x86 类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LDR6020,单C口OTG,充放一体新潮流!

PD(Power Delivery)芯片实现单Type-C接口输入和输出OTG(On-The-Go)功能,主要是通过支持USB Power Delivery规范和OTG功能的特定硬件和软件设计来实现的。以下是对这一过程的具体解释: 一、PD芯片基础功能 …

海外最新外太空投资理财系统源码

海外最新外太空投资理财系统源码 源码下载:https://download.csdn.net/download/m0_66047725/89744826 更多资源下载:关注我。

ARTS Week 38

Algorithm 本周的算法题为 2432. 处理用时最长的那个任务的员工 共有 n 位员工,每位员工都有一个从 0 到 n - 1 的唯一 id 。 给你一个二维整数数组 logs ,其中 logs[i] [idi, leaveTimei] : idi 是处理第 i 个任务的员工的 id ,…

openmpi 的应用编译使用方式的探讨

0&#xff0c;源码 hello_openmpi.c #include <stdio.h> #include <mpi.h>int main(int argc, char **argv) {printf("1 Hello, world! \n");MPI_Init(&argc, &argv);int rank;MPI_Comm_rank(MPI_COMM_WORLD, &rank);printf("2 Hello…

Java语法1

注释 单行注释// 多行/* */ 字面量 同C \n \t不需要加单引号 数据的存储 十进制转二进制 除2取余法 数据在计算机中的最小存储单位字节1B8b KB MB GB TB 相邻的转换 2的10次方等于1024 字符存进去则存ASSIC编码对应的数,比如49对应’1’,65对应’A’,97对应’a’ 图片,声音…

基于YOLO V8的学生上课行为检测系统【python源码+Pyqt5界面+数据集+训练代码】有报告

目的是利用YOLOV8这一先进的深度学习技术&#xff0c;开发一个自动化的学生上课行为检测系统。通过对上课行为数据集进行深入分析和标注&#xff0c;我们训练了YOLOV8模型&#xff0c;使其能够精确识别学生在课堂上的各种行为状态。这一系统能够实时监控并分析学生的行为&#…

从词到句,可以让你快速无忧看日文的翻译软件

不知道你喜欢看日漫吗&#xff0c;可能是身边的氛围吧&#xff0c;打小身边就很多这类的书籍。但是因为语言的问题基本都是把它当小人书了。但是现在看书就方便多了&#xff0c;有不少支持日语翻译的工具可以帮我们解决这个语言问题。 1.福昕在线翻译 链接直达>>https:…

『功能项目』事件中心【43】

我们打开上一篇42怪物的有限状态机的项目&#xff0c; 本章要做的事情是利用事件中心&#xff08;和观察者模式相仿&#xff09;将Update()函数中写的GameObject.Find()这些语句替换掉&#xff0c;因为在Update()函数中每帧的执行频率非常快&#xff0c;如果在Update()函数中写…

Centos入门必备基础知识

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个开源的Linux发行版&#xff0c;基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建。以下是CentOS入门必备的一些基础知识&#xff1a; 前言 本文由浪浪云赞助发布&#xff0c;…

设计模式 桥接模式(Bridge Pattern)

文章目录 桥接模式简绍桥接模式的核心概念包括以下几个部分&#xff1a;桥接模式的工作流程桥接模式优缺点桥接模式优点桥接模式缺点 UML图代码示例适用场景 桥接模式简绍 桥接模式&#xff08;Bridge Pattern&#xff09;是对象结构型设计模式中的一种&#xff0c;它将抽象与…

艾丽卡的区块链英语小课堂

系列文章目录 IT每日英语&#xff08;三&#xff09; 文章目录 系列文章目录前言1.principle2.efficient3.implement4.accumulated5,occupation6.phases7.validator8.nominated9.commissions10.significantly 前言 欢迎来到艾丽卡的区块链英语小课堂&#xff0c;在这里&…

650人微软员工被裁,动视暴雪制作团队调整,游戏行业风云再起

易采游戏网9月14日消息&#xff1a;微软宣布将裁员650人&#xff0c;这一消息在游戏行业引起了广泛的关注和讨论。此次裁员主要集中在微软的子公司动视暴雪&#xff0c;涉及到《魔兽大作战》和《使命召唤&#xff1a;战争地带》这两个备受瞩目的游戏团队。尽管裁员让很多玩家感…

基于python+django+vue的二手电子设备交易平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的二…

wget不管用的情况下,如何在centos中手动安装yum

wget不管用的情况下&#xff0c;如何在centos中手动安装yum 1、卸载python和yum2、手动下载需要的包3、更换yum源4、清理yum缓存&#xff0c;并生成新的缓存5、更新yum6、最后试试安装wget 问题背景&#xff0c;我在使用yum遇到了问题&#xff0c;想着重新安装一下&#xff0c;…

生成式人工智能(AIGC)对职业院校“云课堂”的赋能路径与价值边界

一、前言 随着教育技术的快速发展&#xff0c;生成式人工智能&#xff08;Artificial Intelligence General Content, AIGC&#xff09;正在成为推动教育改革的重要力量。生成式人工智能&#xff08;AIGC&#xff09;技术的应用&#xff0c;为职业院校的“云课堂”提供了新的教…

Oracle数据库软件的下载与安装步骤(适用于初学者)

目录 背景: 安装过程&#xff1a; 验证是否安装成功&#xff1a; 背景: Oracle&#xff0c;全程Oracle Corporation(甲骨文公司)&#xff0c;是全球领先的企业级软件公司&#xff0c;其最著名的产品是Oracle数据库&#xff0c;Oracle数据库是一款关系型数据库系统(RDBMS)&am…

世界主要国家跨境数据流动的政策法规及其启示

文章目录 前言一、主要国家加强跨境数据流动的监管措施二、全球跨境数据流动的关键问题三、中国跨境数据流动治理的不足与对策前言 随着数据成为全球经济发展的战略资源,各国政府正积极构建安全有效的治理体系,以扩大数据的社会和经济效益,探讨世界主要国家跨境数据流动的政…

LeetCode题练习与总结:翻转二叉树--226

一、题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1…

可维护性例题2

答案&#xff1a;C 解析&#xff1a; 选项A 维护性是软件质量的重要指标 选项B 软件开发受软件开发文档因素影响&#xff0c;因此受开发文档影响 选项C 维护占软件开发的比较长的时期 选项D 说法正确

【Python爬虫系列】_020.异步协程asyncio

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈…