Web 应用交付优化
· 阅读需 5 分钟
两个黄金法则:最小化 1) 延迟 2) 负载
最小化延迟…
-
减少 DNS 查询
- 使用快速的 DNS 提供商,平均响应时间(cloud flare < DNS Made Easy < AWS Route 53 < GoDaddy < NameCheap)。注意:某些地区的结果可能有所不同
- DNS 缓存。TTL 权衡 = 性能 <> 时效性
- 减少第三方域名数量或使用快速 DNS 的服务(与 HTTP1 的域名分片优化冲突)
- ==DNS 预取==
<link rel="dns-prefetch" href="//www.example.com/" >
-
重用 TCP 连接。
- 尽可能利用连接保持活动。
- 使用 NGINX 作为 HTTP 服务器的加速代理
-
最小化 HTTP 重定向数量
- 不要有重定向链,例如 www.example.com -> http://example.com -> https://example.com -> 网络服务
-
使用 CDN
- 例如,Netflix 开发自己的硬件并与 本地 ISP 合作提供 CDN
-
消除不必要的资源
- 懒加载,例如 仅在必要时加载 JS。当有地图时加载谷歌地图 API。
- 代码分割,例如 按路由,按使用频率
-
- HTTP 缓存头
- cache-control 用于 max-age
- 注意,对于 JS 文件:确保浏览器获取更改的简单方法是使用带有哈希的 output.filename 替换。Webpack 缓存
- expires
- 如果同时设置了 Expires 和 max-age,则 max-age 将优先。
- cache-control 用于 max-age
- last-modified,ETag 头以验证自上次加载以来资源是否已更新
- 基于时间的
Last-Modified响应头(不常用,因为 nginx 和微服务) - 基于内容的 ETag(实体标签)
- 当最后修改日期难以确定时,此标签非常有用。
- 通过哈希生成
- 基于时间的
- 一个常见的错误是只设置上述两个中的一个
- HTTP 缓存头
-
在传输过程中压缩资产
- 使用 JPEG、WebP 而不是 PNG
- HTTP2 自动压缩头部
- nginx gzipped