【问题标题】:Need cache-busting on CSS file in Blazor WebAssembly site需要在 Blazor WebAssembly 站点中对 CSS 文件进行缓存清除
【发布时间】:2021-11-19 14:16:38
【问题描述】:

我有一个 Blazor WASM .NET6 应用程序,它在其 index.html 中使用两个样式表:

<link href="css/app.min.css" rel="stylesheet" />
<link href="css/Client.min.css" rel="stylesheet" />

如何在构建时向文件添加一些版本号或日期,例如:

<link href="css/app.min.20211119.css" rel="stylesheet" />
<link href="css/Client.min.20211119.css" rel="stylesheet" />

触发浏览器下载新副本?

我的构建管道中已经设置了 PostCSS,所以我可以使用 npm 解决方案。

它需要创建新文件并更新 index.html

我发现了几个类似的问题,但都没有有效的解决方案。

更新
我找到了Replace in file npm 包,它似乎可以满足我的需要。将它与fs.rename npm 包结合使用,我应该能够在我的文件名中添加指纹并更改我的 index.html 中的链接。
我已经想出了如何为 index.html 中的链接执行此操作:

// in package.json
"fingerprint": "replace-in-file --configFile=fingerprint.config.js"

// in fingerprint.config.js
module.exports = {
    files: 'wwwroot/index.html',
    from: [/app.(min|[0-9]*).css/g, /Client.(min|[0-9]*).css/g],
    to: ['app.' + require('dayjs')().format('YYYYMMDDHHmm') + '.css', 'Client.' + require('dayjs')().format('YYYYMMDDHHmm') + '.css'],
};

这段代码在后期构建中运行,所以这段 javascript 中没有任何内容最终出现在最终代码中。

我整天都在尝试重命名实际的 CSS 文件。但不能让它工作。 我的尝试:

// In package.json
    "rename:fs": "node -e \"require('fs').rename('wwwroot/css/app.min.css', 'wwwroot/css/app.'+require('dayjs')().format('YYYYMMDDHHmm')+'.css', () => {})\"",
    "rename:2": "renamer --dry-run --find \"/^(app|Client).(min|[0-9]*).css$/\" --replace \"$1.bar.css\" \"wwwroot/css/*\"",
    "rename": "node -e rename.js"

// rename.js
const fs = require('fs');
const path = require('path');
//var args = process.argv.slice(2);
var dir = "wwwroot/css/";
var match = RegExp("^(app|Client).(min|[0-9]*).css$", 'g');
var fp = require('dayjs')().format('YYYYMMDDHHmm');
var replace = RegExp('$1.' + fp + '.css');
var files;

//reading the dir
files = fs.readdirSync(dir);
files.filter(function (file) {
    return file.match(match);
}).forEach(function (file) {
    var filePath = path.join(dir, file),
        newFilePath = path.join(dir, file.replace(match, replace));
    //using fs.rename function to rename files
    fs.renameSync(filePath, newFilePath);
});

重命名器版本rename:2 效果最好。我可以在查找部分使用 RegEx,但无法在替换部分使用。
现在我将坚持更改查询字符串,而不是我想要的解决方案。但现在已经足够了。

【问题讨论】:

    标签: browser-cache blazor-webassembly


    【解决方案1】:

    在开发过程中,我使用这个 javascript 解决方法。 它应该被我删除并替换为您原来的生产标记,尤其是当您可能试图在 webassembly 应用程序中避免使用 javascript 时。

    let dt=new Date();
    const lnk=document.createElement('link');
    lnk.setAttribute('href','css/app.min.css?u='+dt.getTime());
    lnk.setAttribute('rel','stylesheet');
    document.getElementByTagName('head')[0].appandChild('lnk');
    

    CSS 文件上的唯一查询字符串强制浏览器获取新副本,但应用程序只是忽略了额外的数据。

    【讨论】:

      【解决方案2】:

      更好的答案可能是在 Web 程序集中添加 css 标签:

      <link href="css/@(myawesomeappcss)" rel="stylesheet"/>
      <link href="css/@(myawesomeclientcss)" rel="stylesheet"/>
      

      然后使用以下内容:

      @code
      {
        private string myawesomeappcss = "app.min.css?u=";
        private string myawesomeclientcss = "client.min.css?u=";
      
        protected override async Task OnInitializedAsync()
        {
          DateTime dt= DateTime.Now;
          myawesomeappcss += ((DateTimeOffset)dt).ToUnixTimeSeconds();
          dt = dt.AddMilliseconds(1);
          myawesomeclientcss += ((DateTimeOffset)dt).ToUnixTimeSeconds();
        }
      }
      

      尽管 javascript 版本在发布之前会更容易删除。

      【讨论】:

      • 我不想在发布前删除它。对于我的用户,还需要下载最新的 CSS 文件。我在index.html。我还可以在该文件中使用 Blazor 代码吗?而且我知道添加查询字符串是不够的。应该更改文件名。
      • 您不能在 html 文件中使用 c# 代码。您可以很容易地将托管站点从静态 thml 页面更改为 .Net Razor 页面,然后使用 c# 更改 属性。您仍然需要在部署时更改文件名,这可能会在 CSS 缩小时使用 Node.js 完成。
      猜你喜欢
      • 2021-02-21
      • 2014-07-04
      • 2020-08-27
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2015-05-29
      • 2017-08-18
      相关资源
      最近更新 更多