我们有一个 Angular 6 应用程序。它在 Nginx 上提供。并且 SSL 已开启。
当我们部署新代码时,大多数新功能都可以正常工作,但有些变化却不行。例如,如果前端开发人员更新服务连接并部署它,用户必须打开隐身窗口或清除缓存才能看到新功能。
哪些类型的更改不会自动更新?为什么他们与其他人不同?
避免该问题的常见解决方案是什么?
原文由 zhangjinzhou 发布,翻译遵循 CC BY-SA 4.0 许可协议
我们有一个 Angular 6 应用程序。它在 Nginx 上提供。并且 SSL 已开启。
当我们部署新代码时,大多数新功能都可以正常工作,但有些变化却不行。例如,如果前端开发人员更新服务连接并部署它,用户必须打开隐身窗口或清除缓存才能看到新功能。
哪些类型的更改不会自动更新?为什么他们与其他人不同?
避免该问题的常见解决方案是什么?
原文由 zhangjinzhou 发布,翻译遵循 CC BY-SA 4.0 许可协议
为我添加:
ng build --aot --output-hashing=all
当您的应用程序位于 CDN 和良好的缓存 nginx 配置后面时,仅执行构建命令是不够的。
1- 第一件事是删除 html 文件的缓存 (nginx):
location ~ \.(html)$ {
add_header Pragma "no-cache";
add_header Cache-Control "no-store";
add_header strict-transport-security "max-age=31536000";
add_header X-Frame-Options "SAMEORIGIN";
try_files $uri $uri/ /index.html;
}
对于静态文件(js/css …)让缓存正常工作(网络性能/可用性):
location ~ \.(css|htc|less|js|js2|js3|js4)$ {
expires 31536000s;
add_header Pragma "public";
add_header Cache-Control "max-age=31536000, public";
try_files $uri $uri/ /index.html;
}
2- 出于测试目的,让开发/生产构建完全相同。最终构建开发命令:
ng build --env=dev --aot=true --output-hashing=all --extract-css=true
3- 我们需要在每次部署时客户端浏览器从服务器而不是缓存加载所有 javascript 文件,即使部署是一个小更新。就像角度有一些错误: https ://github.com/angular/angular-cli/issues/10641 发生在我身上。
我结束了使用 bash 的强大功能,这是我使用 package.json 文件在每个开发(prod/dev)中杀死缓存的脚本:
"scripts": {
...
"deploy_dev": "ng build --env=dev --aot=true --output-hashing=all --extract-css=true && npm run add_date",
"deploy_prd": "ng build --prod && npm run add_date",
"add_date": "npm run add_date_js && npm run add_date_css && npm run rm_bak_files",
"add_date_js": "for i in dist/*; do if [ -f $i ]; then LC_ALL=C sed -i.bak 's:js\":js?'$(date +%H%M%m%d%y)'\":g' $i; fi done",
"add_date_css": "sed -i.bak 's:css\":css?'$(date +%H%M%m%d%y)'\":g' dist/index.html",
"rm_bak_files": "find dist -name '*.bak' -exec rm -Rf {} \\;"
},
命令解释:
add_date_js:查找并替换所有文件“js”为“js?{date+%H%M%m%d%y}”
add_date_css:在 dist/index.html 中查找并替换“css”为“css?{date+%H%M%m%d%y}”
rm_bak_files:删除所有.bak文件(网络性能)
这些 sed 命令适用于 GNU/BSD/Mac。
链接:
Angular - Prod Build 不生成唯一的哈希值
在 Mac (BSD) 和 Linux 上都有效的 sed 就地标志
是否可以使用 angular-cli 构建单独的 CSS 文件?
原文由 Alejo JM 发布,翻译遵循 CC BY-SA 4.0 许可协议
13 回答12.8k 阅读
7 回答2k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答918 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
问题是当静态文件被缓存时,它可以在过期之前存储很长时间。如果您对站点进行更新,这可能会很烦人,但是,由于文件的缓存版本存储在访问者的浏览器中,他们可能无法看到所做的更改。
缓存清除 通过使用唯一的文件版本标识符告诉浏览器文件的新版本可用来解决浏览器缓存问题。因此,浏览器不会从缓存中检索旧文件,而是向源服务器请求新文件。
Angular cli 通过为构建命令提供
--output-hashing
标志来解决这个问题。查看官方文档: https ://angular.io/cli/build
示例(旧版本)
以下是您可以传入的选项
--output-hashing
更新
对于角度版本(例如 Angular 8、9、10),命令是:
对于最新版本的 angular(从 angular 11 到 angular 14),命令恢复为旧格式: