写点什么

基于 webpack 的应用治理

  • 2020-03-25
  • 本文字数:2543 字

    阅读完需:约 8 分钟

基于 webpack 的应用治理

当前市面上大部分前端应用都是基于 webpack 进行构建,而随着应用日益庞大,webpack 应用就会出现构建速度慢,构建结果体积大等一系列问题。

一、webpack 应用治理应该从哪个方向入手?

随着应用的不断迭代,webpack 应用最常见的两个问题就是:


  1. 构建速度慢;

  2. 构建体积大。


有一个很简单的划分方式,就是以构建(build)为分界线,分成前向治理和后向治理:


  • 前向治理:提升构建速度;

  • 后向治理:保证构建结果质量。


我们的治理方向,就是围绕前向治理和后向治理。


二、前向治理包含哪些内容?

前向治理的核心概念,就是一个字 `快`,目的就是提升构建速度,市面上大部分 webpack 优化文章都是这一类提升构建速度的文章,所以这里就简单介绍一些不错的实践


1. 利用 SMP 采集 webpack 数据指标



数据先行,通过 speed-measure-webpack-plugin 采集性能指标,可以得到 webpack 在整个编译过程中在 loader、plugin 上花费的时间,基于该数据可以专项的进行优化和治理。


2. 开启缓存


如果通过 SMP 分析得知在 loader 编译过程耗时较多,那么可以在核心 loader,例如 babel-loader 中添加缓存。


{  loader: 'babel-loader',    options: {      cacheDirectory: true    }}
复制代码


3. 开启 happyPack 多线程编译


如果通过 SMP 分析得知在 loader 编译过程耗时较多,还可以通过使用 happyPack,开启多线程编译,提升开发效率。


4. 使用 dll 技术


dll 可以简单理解成提前打包,例如 lodash、echarts 等大型 npm 包,可以通过 dll 将其提前打包好,这样在业务开发过程中就不用再重复去打包了,可以大幅缩减打包时间。


5. 升级到 webpack5


webpack5 利用 `持久缓存` 来提高构建性能,或许升级 webpack 后,前述的各种优化,都将成为历史。

三、后向治理包含哪些内容?

后向治理主要保证构建结果的质量


1. 可视化分析构建结果



很常见的就是 webpack-bundle-analyzeer,提供打包结果的可视化展示,如上图给予的决策帮助是:


  • 是否需要按需加载;

  • 是否需要提取公共代码;

  • 是否需要制定 cacheGroup 的策略。


2. 清理 deadcode


业务开发过程中,随着业务迭代,经常有些文件、模块及代码被废弃,这些废弃代码随着时间推移,将逐渐变为历史包袱,所以针对构建后结果,我们要做的就是清理其中的 deadcode。


前面 webpack-bundle-analyzeer 虽然是最常用的插件,但依旧有一些缺陷:


1)体积超小的 deadcode 模块引用,无法被准确识别。



例如上图:


lodash 体积大一下子就能被发现,就会意识到重复引用或者是未使用


但 deadcode 模块 c 体积很小,即便被 chunk1、chunk2 都引用了,也不一定能立刻发现,很容易被带到线上


而且这种 deadcode 也无法通过 splitchunk 来进行优化,因为 splitchunk 根据引用次数提取公共代码,无法分辨是否是废弃代码,所以对模块 c.js 这种的 deadcode 就无力了


2)tree-sharking 只保留有用的代码,但 deadcode 还在那里。


tree-sharking 大家都了解,摇掉不需要的代码,做为最终的输出结果,但反过来说,这些废弃代码依旧在本地真实不虚的存在着。


所以如何能准确的清理掉 deadcode 呢?这就需要通过 webpack 的 统计信息(stats) 来进行更细节的分析


3. 统计信息(stats)


stats 是通过 webpack 编译源文件时,生成的包含有关于模块的统计数据的 JSON 文件,这些统计数据不仅可以帮助开发者来分析应用的依赖图表,还可以优化编译的速度。


webpack --profile --json > compilation-stats.json
复制代码


通过上述全局命令即可输出统计信息,例如:


{  "version": "1.4.13", // Version of webpack used for the compilation  "hash": "11593e3b3ac85436984a", // Compilation specific hash  "time": 2469, // Compilation time in milliseconds  "filteredModules": 0, // A count of excluded modules when `exclude` is passed to the `toJson` method  "assetsByChunkName": {    // Chunk name to emitted asset(s) mapping    "main": "web.js?h=11593e3b3ac85436984a",    "named-chunk": "named-chunk.web.js",    "other-chunk": [      "other-chunk.js",      "other-chunk.css"    ]  },  "assets": [    // A list of asset objects  ],  "chunks": [    // A list of chunk objects  ],  "modules": [    // A list of module objects  ],  "errors": [    // A list of error strings  ],  "warnings": [    // A list of warning strings  ]}
复制代码


其中:modules:表示 module 的集合


  • module:webpack 依赖树中的真实模块;

  • chunks:表示 chunk 的集合;

  • chunk:包含 entry 入口、异步加载模块、代码分割(code spliting)后的代码块。


通过对 modules 和 chunks 加以分析,就可以得到 webpack 完整的依赖关系,从而梳理出废弃文件及废弃代码,同时也可以根据业务形态进行定制。


4. webpack-deadcode-plugin


前面提到分析 stats.json,但因为是原始数据,数据量比较大,有一定处理和清洗成本,所以可以使用开源的 webpack-deadcode-plugin 这个插件



通过 webpack-deadcode-plugin,可以快速筛选出:


1)未使用的文件;


2)未使用的已暴露变量。


5. 结合 eslint、tslint 进行治理


lint 可以快速的扫描出未使用的变量,这能够极大的提升我们的 deadcode 清理效率。


1)首先通过 lint 对未使用变量进行清理;


2)再通过 webpack-deadcode-plugin 再扫描出未使用文件和未使用的导出变量。


顿时整个应用干干净净,舒舒服服!

四、参考

speed-measure-webpack-plugin:


https://github.com/stephencookdev/speed-measure-webpack-plugin


happyPack:


https://github.com/amireh/happypack


webpack-bundle-analyzeer:


https://github.com/webpack-contrib/webpack-bundle-analyzer


stats:


https://webpack.js.org/api/stats/


webpack-deadcode-plugin:


https://github.com/MQuy/webpack-deadcode-plugin


作者介绍


阿里影业高级开发工程师 百命


相关阅读


电影垂直行业的云智开放平台如何炼成?


阿里工程师带你了解 B 端垂类营销中心如何设计?


云智前端技术如何赋能场馆院线?


60 秒售出 5 万张票!电影节抢票技术揭秘


电影行业提升 DCP 传输效率,还能这样做!


超大型场馆的绘座选座解决方案


大型赛事稳定性保障:Dpath 为世界军人运动会护航


世界顶级赛事的票务支撑:百万座位与限时匹配


前端技术:Webpack 工程化最佳实践


电影票房数据查询服务高性能与高可用实践


2020-03-25 10:003312

评论

发布
暂无评论
发现更多内容

测试人生 | 双非学历入职名企大厂还薪资翻倍?

霍格沃兹测试开发学社

当面试官问你:如何才能带领好团队?

霍格沃兹测试开发学社

测试人生 | 毕业2年,拒绝独角兽入职名企大厂涨薪10万+,这个95后小姐姐好飒

霍格沃兹测试开发学社

测试人生 | (汇总篇)从小团队的业务到独角兽的测开,涨薪超过60%,90后小哥哥凤凰涅槃了

霍格沃兹测试开发学社

ClickHouse 在海量数据下的应用实践

移动云大数据

Clickhouse

测试人生 | 拿到多个 offer 从了一线互联网公司并涨薪70%,90后小哥哥免费分享面试经验~

霍格沃兹测试开发学社

从云原生实战峰会看2022年云原生发展动向

Lily

软件测试 | 测试开发 | JAR 文件规范详解

测吧(北京)科技有限公司

测试

测试面试 | Java 经典面试题汇总

霍格沃兹测试开发学社

测试人生 | 从传统行业到名企大厂,薪资翻倍,我做到了

霍格沃兹测试开发学社

测试面试 | 某个版本/模块问题很多,但上线时间紧迫怎么办?

霍格沃兹测试开发学社

测试面试真题|从手工到测开,一位测试媛宝妈的 BAT 大厂逆袭之旅

霍格沃兹测试开发学社

测试面试 | 某互联网大厂测试面试真题,你能回答出多少?

霍格沃兹测试开发学社

测试人生 | 30 而立之年的蜕变,6 个月完成从国企到 BAT 大厂测开的华丽转身

霍格沃兹测试开发学社

测试人生 | 双非院校、入职某知名电商公司薪资翻倍还有股票奖励,这个90后小姐姐也太飒了吧?

霍格沃兹测试开发学社

笔记 | 敏捷转型常见误区及避坑指南(文末附PPT)

嘉为蓝鲸

DevOps 研发 敏捷转型 蓝鲸 嘉为

测试面经 | 从测试螺丝钉到大厂测试开发,三点成长心得和面试经验

霍格沃兹测试开发学社

Apache Kafka 动态配置的原理与应用

移动云大数据

测试人生 | 半年涨薪10W+,从手工+外包是如何完成蜕变的?

霍格沃兹测试开发学社

测试面试真题|抖音的广告系统前后台,该如何测试?

霍格沃兹测试开发学社

测试人生 | 从小团队的业务到独角兽的测开,涨薪超过60%,90后小哥哥凤凰涅槃了

霍格沃兹测试开发学社

测试人生 | 做了低薪运营6年,妹纸靠什么转行拿下 20W 年薪?

霍格沃兹测试开发学社

测试人生 | 半年涨薪20W入职名企大厂,这个90后妹纸凭什么这么猛?

霍格沃兹测试开发学社

测试人生 | 突破“大专学历+半路转行”标签,从拉垮菜鸟到测试团队骨干,走到这一步很知足!

霍格沃兹测试开发学社

测试开发面试真题 | 测试老兵进阶突破,成功挑战大厂 P7 Offer!

霍格沃兹测试开发学社

测试人生 | 从跨专业手工测试转岗外包,再到 Python 测试开发,跳槽涨薪 85%!

霍格沃兹测试开发学社

开发者个人成长主题征文挑战赛正式启动!说出你的成长故事共谱青春乐章

InfoQ写作社区官方

个人成长 热门活动

测试人生 | 双非院校跨城重新开始,薪资翻了2倍还多,这个90后小姐姐好飒

霍格沃兹测试开发学社

开年见礼!云开发生态激励计划上线,近万元补贴等新年福利请查收

Lily

测试人生 | 年薪50w+ 并入职名企大厂,这是双非学历小哥哥给自己30岁的礼物

霍格沃兹测试开发学社

对话来自韩国 Kakao 的海外贡献者 | 我为什么要为 SeaTunnel 做贡献?

Apache SeaTunnel

基于 webpack 的应用治理_文化 & 方法_阿里巴巴文娱技术_InfoQ精选文章