付嘉兴:百度小程序框架性能优化实践
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_jpg/ibnDKD3ktAob85tkk3wXuhZMoCia5mA1VUWURV5CUl8pzzKJ3JfwxTuMEO6U3ZYae1pMUt8NFxYHNxBbt4NT7vkw/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>作者 | 付嘉兴
编辑 | 冉叶兰、张笑菊
移动互联网中 Native App(NA) 和 H5 <span style="color: black;">始终</span>处在博弈状态,在性能体验和灵活性上艰难寻找着平衡,单从技术上<span style="color: black;">来讲</span>,小程序<span style="color: black;">便是</span> NA 和 H5 的又一次碰撞。小程序的灵活性已被证实,在性能方面,百度智能小程序从框架<span style="color: black;">起步</span>、小程序包下载、小程序包加载以及渲染等 4 个方面进行了<span style="color: black;">起步</span>速度优化。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在 <strong style="color: blue;">GMTC <span style="color: black;">全世界</span>大前端技术大会(深圳站)2019</strong> 上,百度技术经理付嘉兴结合百度侧和小程序<span style="color: black;">研发</span>者侧阐释了<span style="color: black;">提高</span><span style="color: black;">自己</span>小程序性能可采用的手段,并介绍了<span style="color: black;">做为</span>宿主<span style="color: black;">怎样</span>将小程序框架与<span style="color: black;">自己</span>技术整合。本文即<span style="color: black;">按照</span>付嘉兴的演讲整理而成。以下为正文:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">今天给<span style="color: black;">大众</span>讲的题目是《百度开源小程序框架架构演进和性能优化实践》。<span style="color: black;">这次</span>分享<span style="color: black;">包括</span>两部分,<span style="color: black;">第1</span>部分是百度智能小程序整体的框架及演进,<span style="color: black;">重点</span>讲百度小程序<span style="color: black;">研发</span>全流程概况、百度智能小程序框架,以及百度小程序多宿主运行<span style="color: black;">保证</span>;第二部分是百度小程序框架的性能优化,<span style="color: black;">重点</span>讲<span style="color: black;">全部</span>小程序的<span style="color: black;">起步</span>过程,以及从<span style="color: black;">研发</span>者<span style="color: black;">方向</span>,有<span style="color: black;">那些</span><span style="color: black;">要紧</span>的优化点。</p>
<span style="color: black;">百度智能小程序整体框架及演进</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">全部</span>移动互联网<span style="color: black;">始终</span>是在 NA 和 H5 之间寻找权衡,NA 的性能好、能力强;H5 灵活性更高。我认为渲染分为两派,一派<span style="color: black;">便是</span> NA 渲染派,一派叫做 H5 渲染派。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">NA 渲染派,比较有<span style="color: black;">表率</span>性的如 RN、Flutter;</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Web 渲染派,<span style="color: black;">例如</span>百度的轻应用,以及之后做的小程序。</p>
<span style="color: black;">1. <span style="color: black;">研发</span>全流程概览</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgysVoOQQ5icESib6brJDicJ3yHjFicAkqibPibHniaWRpxnf7VDxSeYjq9yavKw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">百度曾经做过的 Web 渲染派的三个<span style="color: black;">表率</span><span style="color: black;">制品</span>,分别是轻应用、直达号和小程序。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">轻应用,是 H5 + 端能力。它是一个标准的 H5,<span style="color: black;">增多</span>了<span style="color: black;">有些</span> NA 的 API,<span style="color: black;">例如</span>定位等。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">直达号,在技术层面跟轻应用是<span style="color: black;">同样</span>的。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">小程序,本质上是一个受限的 H5 + <span style="color: black;">海量</span>丰富的 API + UI 组件。<span style="color: black;">此刻</span>我们给小程序<span style="color: black;">供给</span>的 API 有 300 多个,组件有 30 多个,组件是有界面的。<span style="color: black;">例如</span>,视频、地图 。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">为何</span>小程序要受限,<span style="color: black;">重点</span>有两个<span style="color: black;">原由</span>:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">保持体验的一致性。H5 太过灵活,JS 随时<span style="color: black;">能够</span>去改变界面。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">安全<span style="color: black;">思虑</span>。<span style="color: black;">由于</span><span style="color: black;">咱们</span><span style="color: black;">供给</span>了<span style="color: black;">海量</span> API 和组件,且这些都是很底层的<span style="color: black;">有些</span>能力,<span style="color: black;">例如</span><span style="color: black;">tel</span>号码、账号,肯定<span style="color: black;">不可</span>轻易开放给<span style="color: black;">大众</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">怎么受限,<span style="color: black;">重点</span>有两点:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">编写语言,<span style="color: black;">再也不</span>是直接写 HTML ,而是用自定义语言 swan 来编写 。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">runtime 层有两个栈,一个是渲染栈,一个是 JS 执行栈,这两个栈从<span style="color: black;">理学</span>上隔离,以<span style="color: black;">保证</span>安全性。</p>
<span style="color: black;">2. 智能小程序框架</span>
(1)<span style="color: black;">研发</span>运行全流程 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgy8AsUGo0QalZeKYSxIsHQ9NQzYE2DobiaET2Gan1L1tAhgIPz5MzKmKQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">先简单介绍一下<span style="color: black;">全部</span>百度智能小程序的<span style="color: black;">研发</span>流程。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">首要</span>开发者用 swan 写布局;</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">接着<span style="color: black;">经过</span><span style="color: black;">研发</span>者<span style="color: black;">工具</span>打包,上传到<span style="color: black;">咱们</span>的小程序 B 端服务器;</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">而后</span>是小程序的审核流程,有机审、人审;</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">最后是用户点击小程序时,客户端请求小程序 C 端服务器,C 端服务器再从 B 端服务器获取小程序包。<span style="color: black;">全部</span>过程都是加密传输,<span style="color: black;">能够</span><span style="color: black;">保准</span>代码的安全。</p>(2)百度智能小程序框架 -SWAN<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgyNibzPN3MPicV4gzq7T8KpJvZf0KJR27RYaVpPHibFs6uFAofhS9X3NKHA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">上图是一个百度智能小程序的框架,<span style="color: black;">咱们</span>内部命名为 SWAN。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">分层结构如下:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">最上层是<span style="color: black;">研发</span>者<span style="color: black;">基本</span>库,命名为 swan-js ,<span style="color: black;">研发</span>者直接和这层打交道。swan-js 负责两件事情:(1)swan 代码转为 HTML,变成 WebView 可运行程序;(2)客户端端能力的封装暴露。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">再下一层是 swan-native。<span style="color: black;">这儿</span>面最核心的是 API 和组件的 NA 实现。其中双栈管理<span style="color: black;">亦</span>在这一层,<span style="color: black;">另一</span>标红的 Extension 用于<span style="color: black;">研发</span>者宿主<span style="color: black;">自己</span>能力扩展<span style="color: black;">运用</span>,<span style="color: black;">例如</span>,贴吧宿主期望<span style="color: black;">增多</span>个发帖能力,就<span style="color: black;">能够</span><span style="color: black;">经过</span>此机制。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">再下面这层叫 Porting Layer。这层是百度小程序为了实现开源,<span style="color: black;">增多</span>的一层与宿主的接口层。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">最下面这一层是宿主<span style="color: black;">基本</span>能力层。<span style="color: black;">倘若</span>宿主<span style="color: black;">无</span>这些能力,<span style="color: black;">能够</span>参考百度开源的参考实现,可直接集成到宿主<span style="color: black;">运用</span>。</p>
<span style="color: black;">3. 核心结构</span>
(1)前端<span style="color: black;">方向</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgyc6Ha0kjIPotHZVxPGCPSuE15SvPe9QVAJK77gdCcOYqooPibnEpLKbQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">咱们</span>从前端的视角来<span style="color: black;">瞧瞧</span>双栈结构。一个宿主客户端<span style="color: black;">能够</span>运行多个小程序,并且在一段时间内保持存活状态,<span style="color: black;">每一个</span>小程序都有一个 master 执行框架 JS 和小程序<span style="color: black;">研发</span>者的 JS,一个 master 对应多个 slave(slave <span style="color: black;">表率</span>一个用户可见的界面)。</p>
(2)客户端<span style="color: black;">方向</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgy3zWWtVmibAYibPCXJxha47hWXWjNQVhGT9EmzauQQstQxGfXFtvgjejQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">从客户端<span style="color: black;">方向</span>来看双栈结构,如上图所示,master 负责执行 JS,<span style="color: black;">能够</span>有两种实现方式,WebView 或 JS 引擎(V8/jscore),JS 引擎的效率更高;slave 的展现有 WebView,为了加快 WebView 的创建速度,设置 cache;master 和 slave 的通信<span style="color: black;">经过</span><span style="color: black;">信息</span>总线。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">master 不支持 BOM、DOM 和 WEB-API,小程序只能调用对外开放的能力。</p>
(3)小程序 NA 组件与界面关系 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgyHSvtPg79D2dLOG891dwF5BgNELqh1bH4Kae0icVAWMtWckDktfmXuFg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">从体验上看,小程序的体验要好于 H5,其中有一点<span style="color: black;">便是</span>小程序会把<span style="color: black;">有些</span> NA 的能力和 UI 融合到小程序里面去。小程序的主体渲染还是基于 H5 技术,接下来<span style="color: black;">咱们</span>讲一下 NA 元素<span style="color: black;">怎样</span>融入 UI 界面。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">NA 元素与 H5 的关系有两种,贴片关系、同层关系。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">贴片关系:NA 元素在 H5 不在同一层,NA 浮在 H5 之上,H5 所有元素都不<span style="color: black;">能够</span>放到 NA 元素之上。<span style="color: black;">由于</span>不在一层,就<span style="color: black;">必须</span>处理滚动联动,当检测到 WebView 滚动 n 个像素, NA 元素<span style="color: black;">亦</span><span style="color: black;">必须</span>滚动 n 个像素。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">同层关系:NA 元素在 H5 这一层,H5 的原生<span style="color: black;">能够</span>压在 NA 元素之上。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgyzmb7tyNSwC7Z3IBp06aE5SGc3ePZt0cadV0sqicP6rORGw1LsegjlmQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">贴片、同层的界面层级树如上。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgyOVk94GHSpuZ9RObpGKKk3M8frYVichllUoepiamTnOP6kLibNrPOT4FUw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">咱们</span>举一个视频组件同层的例子。视频组件比较<span style="color: black;">繁杂</span>,有 4 层。第 1 层是视频层,即原始视频的图像,第 2 层是弹幕层,第 3 层是用于视频<span style="color: black;">掌控</span>的控件层(<span style="color: black;">例如</span>,<span style="color: black;">起始</span>、暂停按键),第 4 层 Slot 层,视频上面漂的 H5 元素将被放到这层。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">同层处理机制,先在 H5(<span style="color: black;">研发</span>者写的 swan 会被转为 H5) 上打一个特殊的标记先占位,属性 inline;浏览内核把这个区域的 surface 拿出来给到 NA 层,<span style="color: black;">而后</span>,小程序框架会把这个区域 surface 塞给播放器,让播放器直接在 surface 上面绘制,达到同层。上面的弹幕、控件、Slot,都是 swanjs 层 H5 实现 ,Slot 层<span style="color: black;">能够</span>认为是一个容器,例如写一个 video,其所有的子元素都会放在 Slot。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">NA 的组件同层的技术<span style="color: black;">方法</span>还不太<span style="color: black;">同样</span>,安卓和 iOS <span style="color: black;">亦</span>是有些区别的。像在 iOS 上,<span style="color: black;">倘若</span>有些组件设置 over-flow ,它会天然支持这一套东西,<span style="color: black;">然则</span>安卓就<span style="color: black;">必须</span>浏览器内核来支持。</p>
<span style="color: black;">4. 小程序多宿主运行<span style="color: black;">保证</span></span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgyEGgTib07NY0UbwNb4HzymDOKT3WibWln3a1LiaiaRq6y3diagcxVEDdGIhA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">百度智能小程序是开放系统,<span style="color: black;">能够</span>运行在多宿主之上,那<span style="color: black;">怎样</span>在多宿主上<span style="color: black;">保准</span>小程序运行体验的一致性呢?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">各个宿主集<span style="color: black;">成为了</span>我们的小程序框架后,<span style="color: black;">首要</span>要跑 CTS 测试,<span style="color: black;">经过</span>之后才<span style="color: black;">能够</span>拿到小程序列表进行分发。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">针对</span>可选能力部分,各个宿主不是所有的能力都<span style="color: black;">必须</span>实现。<span style="color: black;">例如</span>,<span style="color: black;">有些</span> AI 能力、push 能力。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">倘若</span>一个小程序用到了可选能力怎么办?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">两个办法,一是小程序和宿主之间的双向<span style="color: black;">选取</span>机制,小程序<span style="color: black;">能够</span><span style="color: black;">选取</span>我要分发到<span style="color: black;">那些</span>平台,宿主<span style="color: black;">亦</span>有权利<span style="color: black;">选取</span>要分发到<span style="color: black;">那些</span>宿主。二是,小程序做兼容。</p>
Extension 机制 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgyQGBeFIeswjcttqu6EErqpicCeiaEnxrfmuOeYVexiaFOicEHjqqnJhKF0w/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">上图所示,标红的是 Extension 机制,当宿主有<span style="color: black;">有些</span>定制化的<span style="color: black;">需求</span>时,<span style="color: black;">能够</span><span style="color: black;">运用</span>此机制。<span style="color: black;">做为</span>宿主,<span style="color: black;">必须</span>做两件事情,一是在 JS 层<span style="color: black;">必须</span>写一套接口。二是在 Porting Layer 接口实现层实现一套能力。<span style="color: black;">倘若</span>宿主觉得这个能力是通用的,<span style="color: black;">能够</span>反馈提案,审核<span style="color: black;">经过</span>后,百度小程序团队会将提案合并到开源框架里。</p>
<span style="color: black;">5. 章节小结</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgyVXa25BDSKzCF1JgUkXnzaFxeJcHvCSLEn2b7cA9ibMoW5ffRQA4J7FQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<span style="color: black;">百度智能小程序框架性能优化实践</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">首要</span>从用户视角<span style="color: black;">瞧瞧</span>一个小程序的加载过程。</p>
<span style="color: black;">1. 百度智能小程序加载分<span style="color: black;">周期</span>过程</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkU9j7icRfJ1ZcpbKRG2fdqgyfLukDibnvo5QuXaPHq4kDqNf9delZRfiaKyL7vE08C0YAQS9zJ2gib9BQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">拿<span style="color: black;">博客</span>举例,如上图所示。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">首要</span>小程序被<span style="color: black;">起步</span>后,先是一个 Loading 的过程,上面的 title 和下面的 tab(框架 NA 实现)<span style="color: black;">表示</span>出来。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">第二张<span style="color: black;">照片</span><span style="color: black;">咱们</span>定义为 FP(First Paint )<span style="color: black;">周期</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">第三张图下面有搜索框了,这其实是小程序包里面的内容。它是<span style="color: black;">经过</span> initdate 接口初始化渲染出来的,此<span style="color: black;">周期</span><span style="color: black;">咱们</span>定义为 FCP( First Contentfull Paint )<span style="color: black;">周期</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">第四张图,是小程序从网上拉到了实时的内容,<span style="color: black;">而后</span>更新到界面,<span style="color: black;">咱们</span>将其定义为 FMP(First Meaningful Paint) <span style="color: black;">周期</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">最后一张图,所有的元素都<span style="color: black;">已然</span>拉下来并展示了,用户<span style="color: black;">能够</span>操作任何一个位置,<span style="color: black;">咱们</span>将其定义为 TTI (Time to Interative) <span style="color: black;">周期</span>。</p>
<span style="color: black;">2. 百度智能小程序</span>
(1)性能基线 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">百度小程序在 2019 年底<span style="color: black;">创立</span>了 FMP 指标,它在<span style="color: black;">研发</span>者平台展示的名字为“上屏时间”。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">咱们</span>统计了线上的一个 80 分位点,耗时是 1.9s。(什么是 80 分位点?<span style="color: black;">例如</span>,有 100 个请求过来了,<span style="color: black;">而后</span><span style="color: black;">咱们</span>把请求的耗时排序,第 80 个请求的耗时,<span style="color: black;">咱们</span>就认为是 80 分位点。)</p>
(2)性能历史曲线 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">如上图所示, 2019 年百度小程序性能优化的历史曲线。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">FP 框架层从接近 3s <span style="color: black;">始终</span>优化了<span style="color: black;">此刻</span>的 1.1s <span style="color: black;">上下</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">百度小程序的<span style="color: black;">目的</span>是让小程序<span style="color: black;">没</span>线接近 NA 体验。</p>
<span style="color: black;">3. <span style="color: black;">起步</span>流程</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">接下来,<span style="color: black;">咱们</span>从<span style="color: black;">研发</span>者<span style="color: black;">方向</span>看,还能优化什么?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">咱们</span>先看一下<span style="color: black;">起步</span>流程,所有的<span style="color: black;">起步</span><span style="color: black;">规律</span>简单串行<span style="color: black;">陈列</span>(<span style="color: black;">实质</span>是有<span style="color: black;">有些</span>步奏是并行的)。</p>
<span style="color: black;">4. 性能优化</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">研发</span>者能够做的性能优化<span style="color: black;">重点</span>有两部分。一是小程序包的体积,二是业务数据。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">接下来,我用三点<span style="color: black;">来讲</span>明<span style="color: black;">研发</span>者<span style="color: black;">能够</span>做什么。</p>
(1)包体积优化 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">意见</span>包体积保持在 1M 以内,<span style="color: black;">为何</span>呢?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">由于</span><span style="color: black;">咱们</span>统计了一下,<span style="color: black;">倘若</span>打开当次<span style="color: black;">必须</span>下载包,则这次的<span style="color: black;">起步</span>时长会占到<span style="color: black;">咱们</span><span style="color: black;">全部</span>时长的 60%。1M 的包,80 分位速度<span style="color: black;">必须</span> 1s+ <span style="color: black;">才可</span>下载完成。<span style="color: black;">因此</span>要<span style="color: black;">掌控</span>自己的包的体积。<span style="color: black;">况且</span><span style="color: black;">咱们</span><span style="color: black;">此刻</span>还只是看 80 分位,当<span style="color: black;">咱们</span>拉到 90 分位,99 分位,这个是一个非常陡的曲线,恶化很严重。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">包体优化机制</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">有两个技术:一是分包技术和独立分包技术,二是资源压缩。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">分包技术 & 独立分包技术</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">分包技术</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">一个小程序有<span style="color: black;">非常多</span>页面,但不是所有的页面都是高 PV 页面。<span style="color: black;">非常多</span>页面是用户很少点到的,<span style="color: black;">能够</span>把这些页面放到<span style="color: black;">咱们</span>的分包去,主包放<span style="color: black;">咱们</span>高 PV 的页面。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">分包<span style="color: black;">不可</span>够独立运行,<span style="color: black;">例如</span>,从搜索 feed 分发过去,它运行时<span style="color: black;">必须</span>把<span style="color: black;">咱们</span>主包下载下来,<span style="color: black;">然则</span><span style="color: black;">由于</span>它的概率低,不会影响绝大<span style="color: black;">都数</span><span style="color: black;">状况</span>。简而言之,<span style="color: black;">便是</span>用分包技术把非<span style="color: black;">重要</span>的页面剥离出去。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">用分包技术把非<span style="color: black;">重要</span>的页面剥离出去之后小程序包的体积还是大的话怎么办?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">独立分包技术</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">所说</span>独立,<span style="color: black;">便是</span>说下载完这个包之后就<span style="color: black;">能够</span>运行,<span style="color: black;">没</span>需下载主包。此时的主包和独立分包的区别<span style="color: black;">便是</span>,小程序总要有一个入口,这个入口的独立分包,<span style="color: black;">咱们</span>就命名为主包。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">经过</span>这两项技术来减小<span style="color: black;">咱们</span>的包体<span style="color: black;">体积</span>,将其保持在在 1M 以内。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">资源压缩</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">咱们</span>分析过<span style="color: black;">有些</span>小程序,<span style="color: black;">发掘</span>有的包体里包含 PC <span style="color: black;">照片</span>,这<span style="color: black;">没</span>疑<span style="color: black;">增多</span>了包的体积。<span style="color: black;">意见</span>如下:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">把<span style="color: black;">照片</span>放到服务器,不要放在包里面。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">压缩<span style="color: black;">照片</span>体积,<span style="color: black;">例如</span>,把 png 改为 jpeg 格式<span style="color: black;">这般</span>体积<span style="color: black;">能够</span>减少 90%(不<span style="color: black;">思虑</span>透明度<span style="color: black;">状况</span>)。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">剔除<span style="color: black;">没</span>用资源。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">App-js <span style="color: black;">必须</span><span style="color: black;">经过</span>分包来<span style="color: black;">处理</span>,<span style="color: black;">最后</span><span style="color: black;">咱们</span>要达到什么<span style="color: black;">目的</span>?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">单个包<span style="color: black;">掌控</span>在 1M 以内。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">文件数<span style="color: black;">掌控</span>在 200 个以内。</p>
(2) 数据拉取 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">数据拉取的目的是快速让界面有内容,减少用户的白屏时间。即<span style="color: black;">运用</span>户是断网的,<span style="color: black;">亦</span>给他离线缓存<span style="color: black;">有些</span>数据。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">如上图所示,<span style="color: black;">这儿</span>面<span style="color: black;">说到</span>了业务骨架屏和框架骨架屏。<span style="color: black;">此刻</span><span style="color: black;">非常多</span>小程序都会参考 H5 的实现,把 H5 的渐进式加载骨架屏用到<span style="color: black;">咱们</span>的小程序里面,用了这种技术之后,反而会让真实的内容展示的速度变慢,<span style="color: black;">咱们</span>统计大概有 300ms 延迟。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">为<span style="color: black;">认识</span>决骨架屏<span style="color: black;">引起</span>的内容展示延迟,<span style="color: black;">咱们</span>做了一套框架层的骨架屏机制。<span style="color: black;">根据</span><span style="color: black;">咱们</span>这个机制来实现骨架屏,对性能的影响就会大大减少。策略上<span style="color: black;">便是</span>在 master 做 appjs 执行时,就让 slave 加载框架骨架屏,并行执行。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">自己写的业务骨架屏,它什么时候才展示?如上图所示,当你把 App 、page、waitNotify <span style="color: black;">通告</span>到渲染线程,到了 Ready firstRender 的时候才会渲染自己做的业务骨架屏,这个过程当然很慢。虽然你用了骨架屏,<span style="color: black;">然则</span>骨架屏和用户点击的这段时间还有<span style="color: black;">海量</span>的白屏时间。用框架骨架屏,白屏时间问题就会<span style="color: black;">处理</span>。用框架骨架屏,或多或少都会耗一点时间,虽然是并行的,<span style="color: black;">然则</span>依然在抢占手机的资源。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">因此</span>整体来看,站在客户端<span style="color: black;">或</span>站在框架的<span style="color: black;">方向</span>,<span style="color: black;">咱们</span>是不<span style="color: black;">意见</span>用,<span style="color: black;">然则</span><span style="color: black;">亦</span>不反对用。<span style="color: black;">倘若</span>要用就用框架骨架屏,影响最小。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">request 的优化,我总结<span style="color: black;">重点</span>是两点,<span style="color: black;">第1</span>要早,第二要少。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">“早”又<span style="color: black;">能够</span>分两部分<span style="color: black;">来讲</span>,一是提早发,二是不阻塞。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">第1</span>是提早发,请求得太晚,展示当然比较慢了。<span style="color: black;">意见</span>把网络请求放在 onlaunch 里面,这是<span style="color: black;">咱们</span>给小程序开放的<span style="color: black;">第1</span>个事件,<span style="color: black;">非常多</span>小程序会放到 page unload 里面,这个就比较慢了。这两个时间在线上 80 分位,大概差 200ms~300ms。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">第二个是不阻塞,经常看到<span style="color: black;">有些</span>小程序,<span style="color: black;">一块</span>来以后,它要等用户的授权、定位。<span style="color: black;">一般</span>定位<span style="color: black;">触及</span> XY 坐标,<span style="color: black;">然则</span>定位一旦<span style="color: black;">触及</span>高度,就<span style="color: black;">必须</span>打开 GPS,<span style="color: black;">这般</span>性能又会慢 2s~3s。<span style="color: black;">倘若</span>不<span style="color: black;">必须</span>高度就不要去设置,否则非常慢。还有的小程序在<span style="color: black;">运用</span>的时候会让用户授权,<span style="color: black;">倘若</span>不授权下面什么<span style="color: black;">亦</span>不展示,阻塞了。<span style="color: black;">倘若</span><span style="color: black;">能够</span>的话,<span style="color: black;">意见</span>在<span style="color: black;">必须</span>授权的时候再提示用户,<span style="color: black;">这般</span>用户<span style="color: black;">亦</span>不反感,<span style="color: black;">亦</span>能加快<span style="color: black;">起步</span>的速度。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">“少”,<span style="color: black;">重点</span>分为两点,一是非<span style="color: black;">重要</span>请求延后,二是只拉取一屏数据。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">一个小程序运行后,可能有几十<span style="color: black;">乃至</span>上百个网络请求,小程序除了自己的业务还要打点,这会很大程度上影响<span style="color: black;">咱们</span>的网络速度。<span style="color: black;">由于</span><span style="color: black;">通常</span>的宿主在底层的网络库都会设置线程池,请求多了就要排队。小程序框架<span style="color: black;">基本</span>不<span style="color: black;">晓得</span>某个请求是核心请求还是非核心请求,只能排队。要是一上来全是<span style="color: black;">有些</span>打点的,业务就阻塞了。总之,<span style="color: black;">全部</span>页面<span style="color: black;">必须</span><span style="color: black;">表示</span>的数据先请求,非<span style="color: black;">重要</span>请求延后。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">二是只拉一屏数据,分段加载。</p>
(3)渲染 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">setData 操作是较为昂贵的,<span style="color: black;">尽可能</span>减<span style="color: black;">少许</span>据量和次数。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">如上图所示,setData 是一个非常核心的 API, 当网络数据回来,<span style="color: black;">仅有</span>经过 setData 驱动渲染,内容<span style="color: black;">才可</span><span style="color: black;">表示</span>到界面上。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">上图是一个优化前和优化后的对比。<span style="color: black;">咱们</span><span style="color: black;">能够</span>看到,即使是 1K 的数据,<span style="color: black;">亦</span><span style="color: black;">必须</span> 20ms <span style="color: black;">上下</span>的时间。<span style="color: black;">倘若</span> js 是用 WebView 来执行,<span style="color: black;">首要</span>一个 JS string,到了浏览器有 Renderer 线程、Browser 线程,变为 C 层的 string,<span style="color: black;">而后</span>再到<span style="color: black;">咱们</span> NA ,<span style="color: black;">经过</span> Java interface,变成一个 Java string。<span style="color: black;">而后</span>到了 slave 以后还要再反过来,<span style="color: black;">因此</span>快不了。虽然<span style="color: black;">咱们</span>做了<span style="color: black;">有些</span>优化,<span style="color: black;">经过</span>内核让它变成一个内存指针优化切换,<span style="color: black;">然则</span>还是很昂贵。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">发掘</span>有些小程序在<span style="color: black;">运用</span>的过程中, setData <span style="color: black;">运用</span>有<span style="color: black;">非常多</span><span style="color: black;">欠妥</span>之处,以下是<span style="color: black;">运用</span> setdata 要<span style="color: black;">重视</span>的几点 。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">减少调用 setData 次数。goodcase:将多次 setData 合并成一次 setData 调用。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">减少 setData 数据量。badcase:新一页数据添加上之前页面数据后再调用 setData。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">变量变化只更新变量不更新对象。</p>
<span style="color: black;">5. 性能自查</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">性能自查<span style="color: black;">重点</span>有三个<span style="color: black;">周期</span>,即<span style="color: black;">研发</span><span style="color: black;">周期</span>、测试<span style="color: black;">周期</span>和上线后。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在<span style="color: black;">研发</span><span style="color: black;">周期</span>这部分,<span style="color: black;">咱们</span>有三个手段去性能自查,分别是工<span style="color: black;">详细</span>验评分、性能面板(在客户端上性能面板<span style="color: black;">能够</span>提示<span style="color: black;">全部</span>性能<span style="color: black;">起步</span>的耗时)以及打点系统。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在测试<span style="color: black;">周期</span><span style="color: black;">咱们</span>有两个手段,一是录屏,二是高速摄像头,这两个手段<span style="color: black;">能够</span>真实地反应用户的体验。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">上线之后,有<span style="color: black;">研发</span>者平台。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">怎样</span>获取技术的官方支持途径?<span style="color: black;">意见</span>去<span style="color: black;">研发</span>者文档和社群去获取技术支持。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
6. 章节小节 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">研发</span>者可从包体积、数据请求、渲染三方面去优化性能。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">包体:1M 内。分包技术、压缩<span style="color: black;">照片</span>、<span style="color: black;">没</span>用资源剔除。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">骨架屏:<span style="color: black;">倘若</span>要<span style="color: black;">运用</span>,<span style="color: black;">意见</span>采用框架骨架屏。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">setData:减少频度、减<span style="color: black;">少许</span>据量。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">整体回顾如下图。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
作者介绍 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">付嘉兴,百度技术经理,2010 年西安交通大学计算机硕士,毕业后加入百度,先后负责百度 App、Feed、小程序方面的技术工作,现任百度智能小程序客户端技术经理,核心工作<span style="color: black;">重点</span>集中在<span style="color: black;">连续</span>优化小程序体验,<span style="color: black;">没</span>限接近 Native app 体验,以及繁荣百度小程序开源联盟。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">2020 年,小程序的热度有增<span style="color: black;">没</span>减,<span style="color: black;">那样</span>又有<span style="color: black;">那些</span>新实践呢?<strong style="color: blue;">GMTC <span style="color: black;">全世界</span>大前端技术大会(北京站)2020</strong> 设置“小程序实战与优化“专题,邀请知名互联网<span style="color: black;">机构</span>的专家来分享<span style="color: black;">她们</span>的<span style="color: black;">处理</span><span style="color: black;">方法</span>,<span style="color: black;">期盼</span>能够<span style="color: black;">帮忙</span><span style="color: black;">大众</span><span style="color: black;">处理</span>工作中遇到的技术问题。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">大会<span style="color: black;">日前</span> 8 折优惠报名,限时立减 960 元!详情可咨询票务经理鱼丸:13269078023(同<span style="color: black;">微X</span>)</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">查看<span style="color: black;">更加多</span>大会信息可扫描下图二维码或点击【阅读原文】</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="data:image/svg+xml,%3C%3Fxml version=1.0 encoding=UTF-8%3F%3E%3Csvg width=1px height=1px viewBox=0 0 1 1 version=1.1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=none stroke-width=1 fill=none fill-rule=evenodd fill-opacity=0%3E%3Cg transform=translate(-249.000000, -126.000000) fill=%23FFFFFF%3E%3Crect x=249 y=126 width=1 height=1%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E" style="width: 50%; margin-bottom: 20px;"></p>
楼主发的这篇帖子,我觉得非常有道理。 你说得对,我们一起加油,未来可期。
页:
[1]