Angular 应用程序必须在新部署后清除缓存

新手上路,请多包涵

我们有一个 Angular 6 应用程序。它在 Nginx 上提供。并且 SSL 已开启。

当我们部署新代码时,大多数新功能都可以正常工作,但有些变化却不行。例如,如果前端开发人员更新服务连接并部署它,用户必须打开隐身窗口或清除缓存才能看到新功能。

哪些类型的更改不会自动更新?为什么他们与其他人不同?

避免该问题的常见解决方案是什么?

原文由 zhangjinzhou 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

问题是当静态文件被缓存时,它可以在过期之前存储很长时间。如果您对站点进行更新,这可能会很烦人,但是,由于文件的缓存版本存储在访问者的浏览器中,他们可能无法看到所做的更改。

缓存清除 通过使用唯一的文件版本标识符告诉浏览器文件的新版本可用来解决浏览器缓存问题。因此,浏览器不会从缓存中检索旧文件,而是向源服务器请求新文件。

Angular cli 通过为构建命令提供 --output-hashing 标志来解决这个问题。

查看官方文档: https ://angular.io/cli/build

示例(旧版本)

 ng build --prod --aot --output-hashing=all

以下是您可以传入的选项 --output-hashing

  • none:不执行散列
  • 媒体:仅向通过 [url|file]-loaders 处理的文件添加哈希
  • bundles:仅将哈希添加到输出包
  • all:向媒体和捆绑包添加哈希

更新

对于角度版本(例如 Angular 8、9、10),命令是:

 ng build --prod --aot --outputHashing=all

对于最新版本的 angular(从 angular 11 到 angular 14),命令恢复为旧格式:

 ng build  --aot --output-hashing=all

原文由 Joel Joseph 发布,翻译遵循 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 就地标志

RE 错误:Mac OS X 上的非法字节序列

内联 if shell 脚本

如何遍历目录中的文件并更改路径并为文件名添加后缀

是否可以使用 angular-cli 构建单独的 CSS 文件?

原文由 Alejo JM 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题