前端资源合并与按需加载的权衡
该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!
引言
“把所有 JS 合并成一个文件减少请求数”是经典优化建议,但在 HTTP/2 时代这条建议需要重新审视。合并与拆分的权衡点变了:请求数不再是唯一变量,缓存粒度与并行加载同样重要。
一、合并的逻辑与时代变化
HTTP/1.1 时代浏览器同域名并发请求数有限(6 个左右),请求多了排队慢,合并成大文件确实有效。HTTP/2 多路复用下,同一连接可并发传输任意数量的请求,请求数不再是瓶颈;合并反而带来新问题:改一行代码导致整个大文件 hash 变化,用户缓存全部失效,重新下载整个 bundle。所以新权衡是:小变更频繁的代码少合并(利于缓存),首屏必需的核心代码适度合并(减少往返)。
二、按需加载(代码分割)的正确用法
现代构建工具(Vite/Webpack)支持代码分割:1. 路由级分割:每个页面/路由单独打包,访问哪页加载哪页,首屏只带首屏需要的代码——这是收益最大的分割;2. 按需加载重组件:图表、编辑器、大弹窗用动态 import(import('./chart.js'))在用到时才加载;3. Tree Shaking:确保构建时剔除未使用的导出,避免引入一个工具库把整个库都打进来(lodash 引入单个函数 vs 整个库差几十倍);4. 第三方脚本异步加载:统计、客服、地图等第三方脚本用 async/defer 或延迟加载,别让它阻塞首屏。
三、CSS 的处理
CSS 是渲染阻塞资源:浏览器要等 CSS 加载解析完才渲染。要点:① 关键 CSS 内联到 HTML(首屏必需的少量样式),其余异步加载;② 组件库按需引入样式(引入 Button 的样式而非整个库);③ 避免 @import 链式引入(串行加载),用 link 并行。
四、验证方法
优化必须 measurable:用 Lighthouse 跑分对比(关注 First Contentful Paint、Largest Contentful Paint、Total Byte);浏览器 DevTools 的 Network 面板看首屏加载了哪些资源、哪些可以延后;加缓存头后二次访问应命中缓存(from cache)。每次改动对比数据,避免“感觉优化了”。
总结
HTTP/2 时代的资源策略:路由级代码分割 + 组件按需加载 + Tree Shaking 剔除冗余 + 首屏关键资源优先。合并不再是万能药——缓存粒度与首屏体积的平衡才是核心。每次优化都看数据说话。