Webpack 分包优化首屏加载
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天
背景:
由于项目中使用 monorepo
来改变了项目结构,分出了两个包ui-components
、common-lib
,整体迁移完成后,跑单独项目的build发现,first-load-js bundle size
比改造项目之前还要大
重构之前:
重构之后:
随后使用webpack-bundle-analyzer
分析,发现了以下几个问题:
- 分出来的这两个包,作为依赖被打入
_app bundle
,但未对这两个包进行tree-shaking
导致很多未被使用的包被打进来。 - 有些组件并未做懒加载处理
tree-shaking 公共包
使用sideEffects:false
:
sideEffects:false
的含义:设置在确定无副作用的包 packag.json 中,webpack 在分析依赖时就会去识别 package.json 中的副作用标记 (sideEffects),以跳过那些未被使用且不包含副作用的导出模块。
ui-components
都是展示组件,可以确定无副作用,故可以设置。common-lib
多为公共方法,且在 ESLint 等规则的加持下,不会存在具有副作用的方法被tree-shaking
的情况,故可以设置。
sideEffects: true
sideEffects: false
组件懒加载
由于使用 next.js 框架,该框架可使用 next/dynamic 做到动态引入从而达到组件懒加载的效果,所以主要对业务中 Modal
等popUp
组件,这种不需要立即在页面上展示的组件进行处理。对一些可以做懒加载的进行优化:
对 app.tsx 引入改变
import { xxx } from '@helper/index'
=> import { xxx } from '@helper/request'
lodash 是否需要做优化
lodash 全部引入
lodash 按需引入 ↓ 5%
结论
不推荐优化:
- 优化幅度很小 5%
- 代码中会用到一些链式调用,例如 _.chain(),因为链式会包含 lodash 中其他方法,所以该链式方法不支持使用按需引入,做替换成本较高。
- 不清楚会不会有类似问题,但是成本较高,故去除该优化zhuanlan.zhihu.com/p/349260482
Lighthouse测试
优化前
优化后
总结
本文目的是如何通过webpack-bundle-analyzer
并结合业务分析出优化点,通过分包把page
、first-load-js bundle
的包大小减小,以减少加载时间。优化幅度不大,主要是总结出优化思路、验证概念。
参考资料
【NextJS】一文了解 NextJS 并对性能优化做出最佳实践 - 掘金
转载自:https://juejin.cn/post/7178676874590683197