【问题标题】:Clear browser cache in Angular在 Angular 中清除浏览器缓存
【发布时间】:2019-04-04 13:21:37
【问题描述】:

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

我想避免浏览器缓存,我正在尝试几种替代方法,但它们都不起作用。

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

我尝试在请求标头中包含 Cache-Control: no-cache,正如您在图像中看到的那样,但这对我不起作用。

我也试过了,把app.component.ts放进去

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

正如我在 some answers 中看到的那样,但两者都没有。

事实是我很绝望,因为当我提供一些我认为有效的东西时,当我与我的老板核对它时,他并没有刷新它:-(,糟糕的是,正如我所说我不知道如何真正检查,每次我进入网络时,都会从服务器请求最新版本。

感谢您的帮助

【问题讨论】:

标签: angular browser browser-cache cache-control


【解决方案1】:

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

--outputHashing=all

这是为了启用缓存清除。这会为每个构建的文件添加一个哈希,这样每当您将新版本上传到服务器时,浏览器就会强制加载最新版本。

因此,一种方法是运行它:

ng build --prod --outputHashing=all

您可以通过here 阅读有关构建选项标志的更多信息。

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

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

【讨论】:

  • 非常感谢,但我在我的 angular.json 中有它,但我不知道它:-( "configurations": { "production": { "optimization": true, "outputHashing": "all", "sourceMap": false, "extractCss": true, "namedChunks": false, "aot": true, "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, "fileReplacements": [ { 但我看到我所有的构建文档都有一个又长又奇怪的名字...... .
  • @Ulises2010 我刚刚重新阅读了你的问题,我意识到你的老板没有刷新他的浏览器?在那种情况下,我们俩都无能为力。这是因为如果离开窗口并且不执行任何操作(例如关闭或刷新它),它仍将运行以前的版本。浏览器获取更新的构建文件的唯一方法是刷新它..
  • 非常感谢@wentjun。我没有很好地解释自己,我的英语说得不好。我的老板返回访问已经关闭的页面,或者使用浏览器按钮刷新页面,但他没有看到更改。我必须告诉他按 F12,然后他可以右键单击同一个按钮,然后他可以执行“清空缓存并强制重新加载”(可能不完全一样,我的浏览器是西班牙语)
  • 如果你的老板没有关闭应用程序或刷新它,请使用一些api调用并检查最新版本(如果有),在这种情况下,你可以清除缓存并刷新页面。但是你必须经常调用api来检查最新版本
【解决方案2】:

试试[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)。

【讨论】:

  • 非常感谢@KLMN 这可能是一个很好的解决方案,但它是一个 SPA,不应该重新加载,如果我让它在加载时自动执行,它会不断重新加载:- (
  • location.reload(true) 现已折旧。
  • window.location.reload(true) 不会清除缓存。
【解决方案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();
            })

  
 

       });
      }

【讨论】:

    【解决方案4】:

    您可以使用以下命令强制页面重新加载:

    window.location.replace('/path');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多