Nginx 静态资源的加载
技术验证
服务器开启 Gzip 和验证
警告
此处密钥信息请妥善留存, 请勿泄露
入口服务器需要开启 gzip, 否则数据返回是原始数据, 并且开启 vary 的缓存标识, 对于 Vary: Accept-Encoding 标识进行不同处理
shell
# 检测源服务器是否开启 gzip
curl -H 'Accept-Encoding:gzip' -I http://kejinshou-m-test.dd.sour-lemon.com/m/main/home/42/38?page=1
# 检测主服务器是否开启 gzip
curl -H 'Accept-Encoding:gzip' -I https://t.kejinshou.iliexiang.com/m/main/home/42/38?page=1查看是否存在这个 Header 返回
Content-Encoding: gzip
Vary: Accept-Encoding全站加速开启 brotli 压缩或者 gzip 压缩
警告
此处密钥信息请妥善留存, 请勿泄露
验证
shell
# 源服务器是否开启 gzip
curl --resolve xuan-t1.wulicode.com:80:47.96.30.211 -H 'Accept-Encoding:gzip' -I http://xuan-t1.wulicode.com/
# 主服务器是否开启 gzip
curl -H 'Accept-Encoding:gzip' -I https://xuan-t1.wulicode.com/开启 Etag 和验证
警告
此处密钥信息请妥善留存, 请勿泄露
检测是否开启 etag
shell
# 检测源服务器是否开启 etag
curl -I http://kejinshou-m-test.dd.sour-lemon.com/m/main/home/42/38?page=1
# 检测主服务器是否可以获取到 ETAG 标签
curl -I https://t.kejinshou.iliexiang.com/m/main/home/42/38?page=1缓存策略
不缓存 html, 不记录日志 no-cache = max-age=0,must-revalidate
# html, js, css files
location ~* \.(html)$ {
add_header Cache-Control "no-cache";
access_log off;
}对图片资源, 字体, js, css 采取 2h 缓存, 采用本地缓存过期之后 + 服务端变动验证, 并不对资源文件进行访问日志记录
# img, font files
location ~* \.(jpg|gif|js|css|png|jpeg|bmp|svg|eot|woff|woff2|ico)$ {
# max-age : 2 hour
add_header Cache-Control "public, max-age=7200, must-revalidate";
access_log off;
}开启策略
入口/分发服务器/aliyun
- 开启 gzip 或者 brotli 压缩
- 分流不走应用服务器, 减少应用服务器的转发
源服务器
- 开启 gzip 压缩
- 开启缓存策略
- 开启 etag
问题验证
打包配置
在使用 vite 打包之后发现第一次打包的 入口文件
diff
# 两次打包数据对比
build
- kr-xuan-dev
- assets
index.a8c2c83e.js # 入口文件 A
# 未拆分之前
index.62c39ce5.js # 资源文件 B
# 拆分入口文件之后
- index-1682560992-148907cd.js
+ index-1682561079-08317e99.js
- QrCode.7c1bcd26.js 变化
+ QrCode.d75672d4.js 增加
- QrCode-legacy.f9e63f06.js
+ QrCode-legacy.275b97b7.js
QrCode.f5f9758b.css 不变
match-url.js 匹配 URL, 不变
login-bg.d8a70d22.png 不变因为入口文件 index.a8c2c83e.js 缓存的是 js 部件, 所以需要 index 文件在打包的时候文件名称变化才能够读到最新的
javascript
// 入口文件 : index.a8c2c83e.js
[{
path: "",
component: Jr,
children: [{
path: "/order",
component: ()=>Fe(()=>import("./User.a1deb8a8.js"), ["assets/User.a1deb8a8.js", "assets/IconFont.91da436f.js", "assets/vant.5e7ee7d8.js", "assets/antdv.98a5a477.js", "assets/IconFont.89e22452.css", "assets/XNavBar.0e6122e0.js", "assets/arrow-left.ae6dbd59.js", "assets/XNavBar.879a3e23.css", "assets/lodash.53de391a.js", "assets/account.93cd528b.js", "assets/crypto.c73800d5.js", "assets/User.703e2baa.css", "assets/index.a3a521ba.css", "assets/index.e8224928.css", "assets/index.5987bc0e.css", "assets/index.f9f43572.css"]),
name: "order.home",
meta: {
title: "\u5305\u8D54\u4FE1\u606F"
}
}]
}]javascript
// 资源文件 B: index.62c39ce5.js
import{c as t,g as e}from"./vendor.fa32c04d.js";var n={exports:{}};
/*!
* clipboard.js v2.0.11
* https://clipboardjs.com/
*
* Licensed MIT © Zeno Rocha
*/const o=e(n.exports=function(){return function(){var t={686:function(t,e,n){n所以需要在 vite / rollup 的配置中加上入口文件的打包配置, 保证每次生成的入口文件都是唯一的, 避免出现内容页的改动导致命中缓存情况出现
javascript
const timestamp = Math.floor(Date.now() / 1000);
return {
build: {
rollupOptions: {
output: {
entryFileNames: '[name]-' + timestamp + '-[hash].js'
}
}
}
}速度对比
速度对比 - 一层转发(自建)
shell
# 未开启缓存
84 requests 1.5 MB transferred 2.5 MB resources Finish: 5.79 s DOMContentLoaded: 1.14 s Load: 1.39 s
# 开启缓存第二次请求
77 requests 31.3 kB transferred 2.2 MB resources Finish: 5.89 s DOMContentLoaded: 728 ms Load: 941 ms全站加速
shell
# 未开启缓存, 无 Gzip
33 requests 962 kB transferred 1.2 MB resources Finish: 6.46 s DOMContentLoaded: 1.17 s Load: 1.57 s
# 开启缓存, 无 gzip
34 requests 11.4 kB transferred 1.2 MB resources Finish: 769 ms DOMContentLoaded: 365 ms Load: 477 ms
# 无缓存, 开启 brotli
32 requests 505 kB transferred 1.2 MB resources Finish: 1.42 s DOMContentLoaded: 715 ms Load: 1.21 s
# 缓存 + broti
31 requests 9.1 kB transferred 1.2 MB resources Finish: 952 ms DOMContentLoaded: 421 ms Load: 546 ms可能问题
由于存在 oss 缓存, 如果 oss 文件变化之后是否会触发内容的变更
