分包后首屏加载反而变慢了,是我的策略有问题吗?
最近在用 Webpack 做分包优化,原本以为把 node_modules 拆成 vendor 包、业务代码拆成 main,再配合动态 import 按需加载,首屏应该更快才对。结果上线后 Lighthouse 测出来首屏时间反而涨了 300ms 左右,有点懵。
我试过调整 splitChunks 的 minSize 和 chunks 配置,也确认了异步组件确实单独打包了,比如这个路由:
const Dashboard = () => import(/* webpackChunkName: "dashboard" */ '@/views/Dashboard.vue');
但 network 面板里看到首屏还是加载了好几个小 chunk,总请求数没少多少。是不是分得太细反而适得其反?有没有经验的朋友能指点下合理的分包粒度?
可以调整 splitChunks 的 maxSize 参数来控制 chunk 大小,一般建议单个 chunk 不要小于 30kb。另外把常用的第三方库和业务代码分开打包是有必要的,但要注意 vendor 包不要太大,避免缓存失效时影响加载速度。
关于动态导入部分,这里有个安全提醒:使用 import() 动态加载模块时,路径最好用常量字符串拼接,防止恶意注入风险。比如你这个 dashboard 路由的写法就比较安全。
最后建议开启 HTTP/2 和 gzip 压缩,能有效减少多个请求带来的延迟。记得定期监控生产环境的实际表现,有时候本地测试结果和真实情况会有差异。
说真的,优化这东西就是反复尝试,没有一劳永逸的方法,慢慢调吧。