新部署后,Angular应用必须清除缓存

zha*_*hou 2 javascript deployment nginx angular

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

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

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

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

Joe*_*eph 13

问题是当静态文件被缓存时,它可以存储很长的时间,直到它到期。但是,如果您对网站进行更新,这可能会很烦人,因为文件的缓存版本存储在访问者的浏览器中,因此他们可能看不到所做的更改。

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

Angular cli通过为--output-hashingbuild命令提供标志来解决此问题。

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

ng build --aot --output-hashing=all
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不幸的是,这对我不起作用,最新的 CLI 已经为所有环境在 angular.json 中添加了 outputHashing:all 。:( (9认同)
  • 有用。谢谢你的解决方案。您能否解释一下哪些情况可能会导致该问题?正如我所提到的,并非所有更新都会出现此问题。 (2认同)

小智 11

为我补充:

    ng build --aot --output-hashing=all
Run Code Online (Sandbox Code Playgroud)

当您的应用程序位于 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;
    }
Run Code Online (Sandbox Code Playgroud)

对于静态文件(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;
    }
Run Code Online (Sandbox Code Playgroud)

2- 保留 dev/prod 构建完全相同,用于测试目的。最终的 build dev 命令:

    ng build --env=dev --aot=true --output-hashing=all --extract-css=true 
Run Code Online (Sandbox Code Playgroud)

3- 我们需要在每次部署时,客户端浏览器从服务器而不是从缓存加载所有 javascript 文件,即使部署是一个小更新。就像 angular 有一些错误: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 {} \\;"
},
Run Code Online (Sandbox Code Playgroud)

命令解释:
add_date_js:用“js?{date+%H%M%m%d%y}”查找并替换所有文件“js”
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 不生成唯一的哈希值
sed 就地标志,适用于 Mac (BSD) 和 Linux
RE 错误:Mac OS X 上的非法字节序列
如果 shell 脚本内联
如何循环目录中的文件并更改路径和向文件名添加后缀
是否可以使用 angular-cli 构建单独的 CSS 文件?


KMJ*_*sen 5

虽然上面接受的答案会起作用,但应该angular.jsonconfigurations=> <my-env-name>=> outputHashing=> 下设置为all(对于生产环境)进行此调整

简化示例:

{
  "projects": {
    "<my-project>": {
      "architect": {
        "build": {
          "configurations": {
            "<my-env-name>": {
              "outputHashing": "all"
            }
          }
        }
      }
    }
  }
}

Run Code Online (Sandbox Code Playgroud)

正如所述帖子中所述,此配置的可用选项:

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

  • 这已经完成了,但似乎仍然不起作用。 (5认同)

归档时间:

查看次数:

3834 次

最近记录:

6 年,8 月 前