在Angular中清除浏览器缓存

32

我有一个经常更新的Angular应用程序的问题。

我想避免浏览器缓存,尝试了几种替代方法,但都无效。

首先,当我上传新版本时,很难测试解决方案,因为有时候只需刷新页面就可以看到新版本,而其他时候我需要打开控制台并强制刷新清空缓存。

我尝试在请求头中包含Cache-Control: no-cache,如图所示,但对我没有用。

enter image description here

我还尝试过将其放入app.component.ts中。

templateUrl: './app.component.html? v1'

正如我在某些答案中看到的,但都不太对。

事实上,我十分绝望,因为当我提交我认为可行的东西时,当我向老板检查时,他没有刷新它 :-( ,而糟糕的是,就像我所说的,我不知道如何真正检查那个东西。每次进入网站时,都会从服务器请求最新版本。

感谢您的帮助。


你找到这个问题的解决方案了吗? - mahmoud abu-seini
1
这是我为 Angular 做的:https://dev59.com/n1MI5IYBdhLWcg3wxeW3#61473275 - Alejo JM
这是我为Angular所做的事情:https://dev59.com/n1MI5IYBdhLWcg3wxeW3#61473275 - Alejo JM
1
你找到解决这个问题的办法了吗? - Murugan
做了所有的事情,但还是不起作用。 - undefined
4个回答

48

当你使用 ng build 构建应用程序时,应使用以下标志:

--outputHashing=all

这是为了使缓存失效。它会给每一个构建后的文件添加一个哈希值,从而强制浏览器在您上传新版本到服务器时加载最新的版本。

因此,其中一种做法是运行以下命令:

ng build --prod --outputHashing=all

关于构建选项标志的更多信息,请查看此处

如果您不想在运行ng build时附加标志,则应在angular.json文件的配置中设置它。

"configurations": {
  "production": {
    "optimization": true,
    "outputHashing": "all",
     .
     .
     .
  }
}

1
非常感谢,但我已经在我的angular.json文件中设置了它,但我不知道为什么会这样 :-(“configurations”:{             “production”:{               “optimization”:true,               “outputHashing”:“all”,               “sourceMap”:false,               “extractCss”:true,               “namedChunks”:false,               “aot”:true,               “extractLicenses”:true,               “vendorChunk”:false,               “buildOptimizer”:true,               “fileReplacements”:[                 {` 但是我看到所有的构建文档都有一个又长又奇怪的名字... - Ulises 2010
1
@Ulises2010 我刚刚重新阅读了你的问题,我意识到你的老板不刷新浏览器?在这种情况下,我们俩都无能为力。这是因为如果他保持窗口打开且不进行任何操作(例如关闭或刷新它),它仍将运行先前的版本。浏览器获取更新的构建文件的唯一方法是刷新它。 - wentjun
1
非常感谢@wentjun。我没有表达清楚,我的英语不好。我的老板会重新访问已经关闭的页面,或者通过浏览器按钮刷新页面,但他看不到更改。我必须告诉他按F12,然后他可以右键单击同一个按钮,然后可以执行“清空缓存并强制重新加载”(也许不完全是这样,我的浏览器是西班牙语)。 - Ulises 2010
如果你的老板没有关闭应用程序或刷新它,请使用一些API调用并检查最新版本(如果有),在这种情况下,您可以清除缓存并刷新页面。但是,您必须经常调用API以检查最新版本。 - Sridhar Paiya
1
看起来选项已更改为--output-hashing=all。 - Phil Jollans
似乎我们已经在使用它,但有时仍然会遇到缓存问题。有更好的解决方案吗? - Harshal Yeole

6
尝试使用[window.]location.reload(true)
if (localStorage.getItem('refreshed') === null) {
    localStorage['refreshed'] = true;
    window.location.reload(true);
} else {
    localStorage.removeItem('refreshed');
}

根据w3schools的说法:
默认情况下,reload()方法从缓存重新加载页面,但是您可以通过将forceGet参数设置为true来强制它从服务器重新加载页面:location.reload(true)。

5
非常感谢 @KLMN 的建议,这可能是一个不错的解决方案,但它是一个单页应用程序,不应该重新加载。如果我让它在加载时自动执行,它就会不断地重新加载 :-( - Ulises 2010
4
location.reload(true)现在已经过时。 - Malachi Bazar
window.location.reload(true) 不会清除缓存。 - CodeMind

3
我每天都会更新我的应用程序,我使用它来通知用户应用程序已过时,并请求刷新页面。
constructor(
    private swUpdate: SwUpdate,){

    public checkForUpdates(): void {
    this.updateSubscription = this.swUpdate.available.subscribe(event => this.promptUser());

    if (this.swUpdate.isEnabled) {
      // Required to enable updates on Windows and ios.
      this.swUpdate.activateUpdate();
      interval(300000).subscribe(() => {
        this.swUpdate.checkForUpdate().then(() => {
         console.log('checked for updates');
        });
      });
    }}

    // Important: on Safari (ios) Heroku doesn't auto redirect links to their-
    //https which allows the installation of the pwa like usual
    // but it deactivates the swUpdate. So make sure to open your pwa on safari
    //like so: https://example.com then (install/add to home)
    
      }

      promptUser(): void {
        this.swUpdate.activateUpdate().then(() => {
          const snack = this.snackbar.open('A New Update Is Available Click To 
          Reload', 'Reload');
          snack
            .onAction()
            .subscribe(() => {
              window.location.reload();
            })

  
 

       });
      }

0
您可以使用以下命令强制重新加载页面:
window.location.replace('/path');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接