跳到主要内容

代码拆分要顺着路由和功能边界来,别把 import() 用成碎片化

· 阅读需 3 分钟
一介布衣
全栈开发者 / 技术写作者

webpack 开始提示包太大以后,很多人的第一反应是“那我多写几个 import() 吧”。动态导入当然是重要工具,但如果拆分点没有顺着页面路由和功能边界走,只会把一个大包拆成很多难管理的小包,首屏和切页体验未必真的更好。

拆包的目的,是延后用户暂时用不到的代码

如果一个页面第一次进入就肯定要加载某块逻辑,那把它硬拆成异步 chunk,未必有收益,反而会多一次请求和一次加载协调。真正适合拆出去的,通常是路由级页面、低频弹窗、大型编辑器、图表面板这类“不是每次访问都需要”的内容。

所以判断拆分点时,我更在意的是用户访问路径,而不是文件大小本身。代码大不大只是结果,关键在于它是不是首屏必需。

路由边界通常是最自然的第一层拆分

在后台系统和内容站点里,路由天然就是功能边界。列表页、详情页、设置页、报表页,本来就不会同时出现在第一次渲染里。先按路由切一层,通常比在组件内部四处零散写异步导入更稳,也更容易排查加载问题。

这样做还有一个好处:哪个页面慢、哪个 chunk 大,关系会更直观。你在分析构建结果和线上加载链路时,不需要先猜某个异步块到底服务哪部分交互。

公共依赖要稳定,不要每个页面都各带一份

拆分做得过碎时,另一个常见问题是公共依赖被来回打散。每个页面都各自引一部分 UI 组件、工具函数、编辑器插件,结果网络层看上去 chunk 变多了,缓存却不稳定,二次访问也没快多少。

所以代码拆分不是只管“切出去”,还要看“哪些东西应该稳定地留在公共层”。如果公共部分和页面私有部分没有边界,拆分越多,构建和缓存反而越难控制。

import() 是手段,不是指标

我现在不太会用“项目里写了多少个 import()”来判断拆分做得好不好。更有意义的问题是:首屏路径有没有明显变轻,低频功能有没有延迟加载成功,切换页面时新增请求是否合理,缓存是否比以前更稳定。

代码拆分真正服务的是访问体验和维护成本。顺着路由和功能边界来,webpack 的拆包结果才会像结构化设计;不然就只是把大问题切碎,并没有真正变简单。