Angular文件名哈希编码及字符范围咨询(Cache busting适配)
Angular新版带哈希文件名的哈希字符范围及ASP.NET Core缓存控制方案
新旧格式对比
旧版Angular哈希文件名
结构:[名称].[16位十六进制哈希].[扩展名]
示例:
runtime.59772ce71fd8c096.js polyfills.efe34593e33fb8e1.js scripts.109c3e02aa410456.js main.3645a30dcf6ebeb0.js
哈希部分为16位十六进制字符(0-9、a-f/A-F)。
新版Angular哈希文件名
结构:[名称]-[8位哈希].[扩展名]
示例:
styles-GCSEUS35.css chunk-NLN56U2H.js polyfills-UCPGG4LZ.js main-UFPD5ECZ.js
新版哈希字符范围
新版哈希采用自定义base32编码变种,允许的字符范围为:
- 大写英文字母:A-Z(包含Crockford base32排除的U字符)
- 数字:0-9
实际构建输出中,哈希部分仅由上述36个字符组成,无小写字母或特殊符号。
ASP.NET Core识别与缓存控制实现
要实现针对这类哈希文件的长期缓存,可通过正则表达式匹配文件名,并在静态文件中间件中设置缓存头:
正则匹配规则
使用以下正则表达式识别符合格式的文件:
^([a-z0-9-]+)-([A-Z0-9]{8})\.(js|css)$
^([a-z0-9-]+):匹配文件前缀(支持包含连字符的前缀,如chunk-vendors)-([A-Z0-9]{8}):匹配8位哈希段,限定为大写字母和数字\.(js|css)$:匹配常见的Angular静态文件扩展名
缓存控制代码示例
在ASP.NET Core的Startup/Program.cs中配置静态文件中间件:
app.UseStaticFiles(new StaticFileOptions { OnPrepareResponse = context => { var fileName = Path.GetFileName(context.File.Name); var hashFileRegex = new Regex(@"^([a-z0-9-]+)-([A-Z0-9]{8})\.(js|css)$"); if (hashFileRegex.IsMatch(fileName)) { // 设置长期缓存:1年有效期,标记为不可变,避免浏览器重新验证 context.Context.Response.Headers.Append( "Cache-Control", "public, max-age=31536000, immutable"); } } });
内容的提问来源于stack exchange,提问作者Jesús López
相关产品推荐
相关产品推荐

