代码拆分要顺着路由和功能边界来,别把 import() 用成碎片化
webpack 开始提示包太大以后,很多人的第一反应是“那我多写几个 import() 吧”。动态导入当然是重要工具,但如果拆分点没有顺着页面路由和功能边界走,只会把一个大包拆成很多难管理的小包,首屏和切页体验未必真的更好。
拆包的目的,是延后用户暂时用不到的代码
如果一个页面第一次进入就肯定要加载某块逻辑,那把它硬拆成异步 chunk,未必有收益,反而会多一次请求和一次加载协调。真正适合拆出去的,通常是路由级页面、低频弹窗、大型编辑器、图表面板这类“不是每次访问都需要”的内容。
所以判断拆分点时,我更在意的是用户访问路径,而不是文件大小本身。代码大不大只是结果,关键在于它是不是首屏必需。
路由边界通常是最自然的第一层拆分
在后台系统和内容站点里,路由天然就是功能边界。列表页、详情页、设置页、报表页,本来就不会同时出现在第一次渲染里。先按路由切一层,通常比在组件内部四处零散写异步导入更稳,也更容易排查加载问题。
这样做还有一个好处:哪个页面慢、哪个 chunk 大,关系会更直观。你在分析构建结果和线上加载链路时,不需要先猜某个异步块到底服务哪部分交互。
公共依赖要稳定,不要每个页面都各带一份
拆分做得过碎时,另一个常见问题是公共依赖被来回打散。每个页面都各自引一部分 UI 组件、工具函数、编辑器插件,结果网络层看上去 chunk 变多了,缓存却不稳定,二次访问也没快多少。
所以代码拆分不是只管“切出去”,还要看“哪些东西应该稳定地留在公共层”。如果公共部分和页面私有部分没有边界,拆分越多,构建和缓存反而越难控制。
import() 是手段,不是指标
我现在不太会用“项目里写了多少个 import()”来判断拆分做得好不好。更有意义的问题是:首屏路径有没有明显变轻,低频功能有没有延迟加载成功,切换页面时新增请求是否合理,缓存是否比以前更稳定。
代码拆分真正服务的是访问体验和维护成本。顺着路由和功能边界来,webpack 的拆包结果才会像结构化设计;不然就只是把大问题切碎,并没有真正变简单。
