构建慢、包体大和页面运行慢,应该分别怎么优化?

先理解原理和示例,再练习完整口述与追问。

三类指标分开测;先 profile 再改;构建缓存与处理范围;产物分析与按需拆分;运行时看主线程和网络。

构建耗时、下载体积与运行时性能是相关但不同的问题。构建慢先分清首次冷构建、热构建和 HMR,记录耗时、CPU、内存、Loader/Plugin 阶段及缓存命中;再缩小编译范围,避免重复转译依赖,按目标环境减少无用转换,在兼容的工具版本中使用持久化缓存。开启多进程还会增加启动、序列化和内存成本,小项目可能更慢,不能看到老资料就默认加 HappyPack 或 DllPlugin。

包体大需要分析真正进入产物的依赖与重复版本,检查按需导入、Tree Shaking 条件、sideEffects 标记、语言包、重复 polyfill、图片与字体体积。路由级拆包减少首屏必须下载和执行的内容,但拆得太碎也会增加请求和调度开销;gzip/Brotli 降低传输字节,不能消除解压后 JavaScript 的解析与执行成本。

运行慢则用 Performance、网络瀑布、Web Vitals 和真实设备数据判断是长任务、重复渲染、布局抖动、资源阻塞还是接口延迟。每次改动前后保持设备、数据与缓存条件可比,同时记录收益和副作用。优化验收应对应目标指标,不能仅以“配置项更多”或“构建通过”作为完成依据。

冷构建 40 秒、增量 1 秒时,先确认慢是否只在依赖处理或压缩阶段;若线上首屏卡,则看下载、解压、解析与执行,不用构建缓存替代运行时优化。分别记录构建耗时、压缩前后体积和真实交互指标,才能知道方案改善了哪一部分。

并行构建有进程启动和序列化成本,越多不一定越快。开发依赖分类也不直接决定某代码是否进入浏览器 bundle。

构建耗时、下载体积与运行时性能是相关但不同的问题。构建慢先分清首次冷构建、热构建和 HMR,记录耗时、CPU、内存、Loader/Plugin 阶段及缓存命中;再缩小编译范围,避免重复转译依赖,按目标环境减少无用转换,在兼容的工具版本中使用持久化缓存。开启多进程还会增加启动、序列化和内存成本,小项目可能更慢,不能看到老资料就默认加 HappyPack 或 DllPlugin。