示例实践

更新时间:

本节会通过一些实际项目代码,带大家分析一下代码可优化部分。

manifest 分析

优化 1

[分析] 经过代码检索,发现下面的一些 features 能力并未都使用,这个会占用应用的首屏时间。

[建议] 用不到的 features 配置需要删除,在代码改动和拷贝其他项目配置时尤为注意。

[收益] 减少代码体积。。

[图例 1] sample_eg1

优化 2

[分析] 下两图代码中,template/officalconfig.logLevel 配置在文档中并不存在。display 的配置也没有启动作用。

[建议] 确保配置其他能力清楚熟悉,再使用,防止无效配置。

[收益] 减少代码体积。

[图例 2] sample_eg2

[图例 3] sample_eg3

app.ux 文件分析

优化 1

[分析] 图例 4 中在 app.ux 中引入了 sportContext.js 文件,我们从 app.ux 的打包结果 app.js 来看 [图例 5],源代码量非常少的 app.ux 打包后体积十分庞大,由于 sportContext.js 的引入使得 app.js 体积巨大,这会严重占用应用的创建时间。

[建议] 去掉 app.ux 中 js 的引入,改由需要的页面按需引入。

[收益] 减少代码体积。

优化 2

[分析] 同样地使用 eventemitter3 也有和 sportContext.js 相似问题,虽然没有那么明显,但经过测试 eventemitter3 也约有 >3k 的体积。

[建议] eventemitter3 为项目中基础能力,且必须使用,可以封装精简下,不使用第三方的功能。eventemitter3

[收益] 减少代码体积。

优化 3

[分析] sportContext.js 是通过 require 引入的,require 属于 CommonJS 规范对 treeShaking 不友好。无法通过打包减少体积。

[建议] 使用 import/export 代替 require/module.exports。

[收益] 减少代码体积。

[图例 4]

sample_eg5

[图例 5]

sample_eg22

page.ux 文件分析

优化 1

[分析] 下面 [图例 6] id = "list" 并未在后面使用。因为有 id 的设置,会使得创建 dom 节点耗费更长的时间。

[建议] 1、不需要使用的 id 要删除。 2、不要使用 id 作为选择器。(id 是给 js 使用,class 是给 css 使用)

[收益] 减少 dom 创建时间。

[图例 6]

sample_eg6

优化 2

[分析] [图例 7]中 import sportDataModule from './sportDataModule' 是将 sportDataModule 全部导入到页面中。而可以看到 [图例 8] 中 sportDataModule.js 有 1800 多行,但页面仅需要使用其中两个方法。所以此时仅需要导入需要用到的两个方法即可。

[建议] 按需引入需要的 js,这里也要配合 sportDataModule.js 的修改,见后面 js 的分析。

[收益] 减少代码体积。

[图例 7]

sample_eg7

[图例 8]

sample_eg23

优化 3

[分析] [图例 9]、[图例 10]、[图例 11] 中存在大量相似的代码逻辑,这里也将其封装成函数,如 [图例 12]。

[建议] 可共用的方法抽象提取

[收益] 提高代码质量 & 减少代码体积。

[图例 9]

sample_eg8

[图例 10]

sample_eg9

[图例 11]

sample_eg10

[图例 12]

sample_eg10

优化 4

[分析] [图例 13] 中过多的使用了调试的 log,这些 log 并不是关键 log,是可以删除的。

[建议] 删除无效 log & 配置 lint 检查。

[收益] 提高代码质量 & 减少代码体积。

优化 5

[分析] [图例 13] 中使用了 JSON.stringify,此操作属于高耗时操作,即便在 log 中也不建议使用。

[建议] 不使要 JSON.stringify。

[收益] 避免了运行高耗时操作。

[图例 13]

sample_eg12

优化 6

[分析] [图例 14] 中使用了 new Object() ,并给其属性赋值,这里属于低效率的 js 操作,耗时也会比字面量方式创建更久。

[建议] js 对象字面量创建比 new 创建更快

[收益] 避免了运行高耗时操作 & 提高代码质量。

[图例 14]

sample_eg13

优化 7

[分析] [图例 15] 中方法没有引用,应该是测试代码没有删除,并且 log 也是测试代码。

[建议] 删除无效方法、测试方法。

[收益] 减少代码体积 & 提高代码质量。

[图例 15]

sample_eg14

优化 8

[分析] [图例 16] 中 if (simulateMode == true) { ... } 中的逻辑属于 mock 代码,在手表上不会触发。如果需要区分两种环境可以由后面打包提供能力支持。不应该由运行时去判断。现在的做法会多引入一套无效的代码。

[建议] 开发环境和手表环境应由编译时区分,而非代码运行时。

[收益] 减少代码体积 & 提高代码质量。

优化 9

[分析] [图例 16] 中 sportListModule.jni_GetSportMenuList() 返回的数据还有再由 getSportObjectArray(sportMenuObject.menu_list) 去处理一遍。这样子的处理多走一次 js 的长数据处理,不利于性能。

[建议] native 模块尽量将业务数据处理完,不应再由 js 二次高耗时处理。

[收益] 减少代码体积 & 减少运行时间 & 提高代码质量。

[图例 16]

sample_eg15

优化 10

[分析] [图例 17] 中 storage 只能存储 String 类型,如果要取出来还要使用 JSON.parse 把 String 转换为 Object。JSON.parse 是耗时操作。然后这里使用 that 作为外层的 this,实际上只要使用箭头函数就可以了。

[建议] 避免使用 JSON.parse,使用箭头函数。

[收益] 避免耗时操作 & 提高代码质量。

[图例 17]

sample_eg17

优化 11

[分析] [图例 18] 中 sportLength、sportOta1Data 并不是视图中使用的数据,尤其是 sportOta1Data 数据量大。这些放在 data 上会造成过度无效的响应式追踪。另外 sportOta1Data 的数据类型是 Array 也不应该初始化为空字符串。

[建议] 不需要渲染的数据放在 data 外面声明

[收益] 避免框架耗时。

[图例 18]

sample_eg17

优化 12

[分析] [图例 19] 中 .item-title3 在代码中检索已经没有用到了。应该是调整 dom 没有删去对应样式。

[建议] 排查删除样式冗余 & 调整 dom 时要同步删除样式。

[收益] 减少代码体积。

[图例 19]

sample_eg19

js 模块分析

优化 1

[分析] [图例 20] 中 通过 export default 将整个对象全量导出,使得被使用界面无法按需导入。

[建议] 使用 export 单个方法,使其可以被 Treeshaking

[收益] 减少代码体积 & 提高代码质量。

[图例 20]

sample_eg20

优化 2

[分析] [图例 21] 中 写法可以更精炼为箭头函数。

[建议] 尽量使用箭头函数

[收益] 减少代码体积 & 提高代码质量。

[图例 21]

sample_eg21

优化 3

[分析] [图例 22] 中 存在许多重复的数据,这些都可以定义为常量去引用。

[建议] 尽量使用常量

[收益] 减少代码体积 & 提高代码质量。

[图例 22]

sample_eg22

以上内容对您是否有帮助?
  • 毫无帮助
  • 帮助不大
  • 一般
  • 很好
  • 非常好
意见反馈