LOG // 051

前端性能优化(一)

01DNS查询优化

DNS查询

浏览器自身缓存 → 操作系统缓存 → 本地 hosts 文件 → 配置的递归 DNS 服务器。如果递归服务器缓存中没有记录,它会从根服务器开始,逐级向顶级域(如 .com)、权威服务器发起迭代查询,直到拿到最终 IP,并将结果按 TTL 缓存下来。一次完整的冷查询可能耗时数十到数百毫秒,而缓存命中可降至毫秒级甚至零耗时。

优化措施


ts
1dns-prefetch 让浏览器提前完成指定域名的 DNS 解析。
2<link rel="dns-prefetch" href="//cdn.example.com">
3preconnect 更进一步,不仅做 DNS 解析,还提前完成 TCP 握手和 TLS 协商(HTTPS 场景)。
4<link rel="preconnect" href="https://cdn.example.com">
结论先行使用原则:只对确定会用到的第三方域名(如 CDN、字体服务、API 网关)添加预解析。

02网络请求优化

  • 减少http请求
  • 合并小图标:CSS sprites(精灵图),SVG sprites
  • 内联关键资源:首屏样式写到<head>里,不通过链接引入
  • 使用http2:多路复用,服务端推送,头部压缩

03压缩资源

代码压缩

JS/CSS:使用Terser、UglifyJS、CSSNano等工具压缩。
HTML:使用HTMLMinifier。

图片压缩

响应式图片:使用srcset + sizes 或 <picture>按需加载。

懒加载

ts
1<img loading="lazy"> 

压缩工具:Imagemin、Squoosh、TinyPNG

04浏览器缓存

  • 强缓存: 设置Cache-Control(如max-age=31536000)和Expires。
  • 协商缓存: 使用ETag/Last-Modified。
  • Service Worker缓存: 实现离线访问、资源预缓存、网络降级策略。
  • 版本化文件名: 文件名带哈希(如app.a3f4c8.js),实现“永久缓存+即时更新”。

05优化资源加载顺序

  • CSS: 放在<head>中(尽早加载,避免FOUC)。 避免@import(增加请求链)。
  • JS: 异步加载: async(加载完立即执行,不阻塞DOM解析)或 defer(DOM解析完后按序执行)。 关键JS内联,非关键JS延迟加载。
  • <link rel="preload">:提前加载关键资源(字体、首屏图片)。
  • <link rel="prerender">:预渲染页面(谨慎使用)