资源加载过多会导致页面白屏时间变长、首屏渲染延迟、用户交互卡顿,并可能触发浏览器并发连接限制;HTTP/2虽缓解连接数问题,但大体积资源仍拖慢解析与执行。
Network 面板里大量 pending 状态就是典型信号。HTTP/2 虽缓解了连接数问题,但资源体积过大仍会拖慢解析、编译和执行——尤其是 JavaScript 文件未做代码分割时,main.js 动辄几 MB,首屏根本等不及。
中的首屏 CSS 可提取为内联 ,避免阻塞渲染;非关键 CSS 加 media="print" 或用 loadCSS() 异步加载
- 小于 10 KB 的 JS(如初始化逻辑)可内联进 ,但必须加 type="module" 或 defer,否则会阻塞 HTML 解析
- 图片资源优先用 + srcset 做响应式裁剪,而非加载大图后靠 CSS 缩放
- 避免在 里写多个 ,合并为一个带 async 或 defer 的请求更可控
webpack 时,splitChunks 配置要按路由或功能拆分,避免把 lodash 和业务代码全打进 vendor.js
- terser-webpack-plugin 默认已启用,但要注意 compress.drop_console: true 仅在生产环境开启,开发时保留调试信息
- 图片交给 image-minimizer-webpack-plugin,对 .png 用 oxipng,对 .jpg 用 mozjpeg,比单纯改后缀名压缩率高 30%+
- 字体文件慎用 woff2 子集化(fontmin 或 pyftsubset),中文字体即使子集也常超 500 KB,不如按需加载
import('./xxx.js') 动态导入,未配置 magicComments 会导致每个 chunk 单独请求,此时合并仍是有效兜底手段
- Service Worker 缓存策略依赖文
件粒度,合并后单个大文件更新会导致全部缓存失效,所以更推荐“语义化分包”(如 login.chunk.js、dashboard.chunk.js)而非物理合并
真正卡顿的往往不是请求数,而是单个资源的解析耗时。检查 Performance 面板里的 Script Evaluation 和 Layout 时间,比盯着 Waterfall 图上那几条线更有价值。