[编辑2016-11-13]
还有另一种方式来提供 gzip 压缩文件来替代步骤 2 和 3。它基本上是相同的想法,但是有一个 nugetpackage https://www.nuget.org/packages/CompressedStaticFiles这一切都可以为您轻松完成。它基本上检查是否是.gz
or .br
与所请求的文件相匹配的文件。如果存在,它将返回并带有适当的标头。它确实验证请求是否具有相应算法的标头。如果你想自己编译的话Github代码是here https://github.com/AnderssonPeter/CompressedStaticFiles.
官方也有一个问题可以支持这一点存储库 https://github.com/aspnet/StaticFiles/issues/7,所以我真的希望微软能够有标准插件来做到这一点,因为现在使用它是相当普遍和合乎逻辑的。
我想我已经找到了提供压缩内容的最优化方式。主要思想是预压缩文件,由于默认的 ASP.NET 5 方式是使用 gulp 构建 js,因此很容易做到:
1. 添加 gulp 步骤来 gzip 捆绑的库:
gulp.task("buildApplication:js", function () {
return gulp.src(...)
...
.pipe(gzip())
...
});
这将在您的包文件夹中生成类似libraries.js.gz 的内容
2.在cshtml文件中引用libraries.js.gz而不是libraries.js
3.修改静态文件处理程序以修复返回的标头
我们需要添加Content-Encoding
并改变Content-Type
从默认application/x-gzip
to application/javascript
因为并非所有浏览器都足够聪明,可以正确读取 jsx-gzip
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = context =>
{
if (headers.ContentType.MediaType == "application/x-gzip")
{
if (context.File.Name.EndsWith("js.gz"))
{
headers.ContentType = new MediaTypeHeaderValue("application/javascript");
}
else if (context.File.Name.EndsWith("css.gz"))
{
headers.ContentType = new MediaTypeHeaderValue("text/css");
}
context.Context.Response.Headers.Add("Content-Encoding", "gzip");
}
}
});
现在,不再需要浪费 CPU 周期来始终对相同的内容进行 gzip,这是提供文件服务的最佳性能。为了进一步改进它,所有的 js 都必须在 gzip 之前被捆绑和缩小。另一个升级是在同一个OnPrepareResponse中设置CacheControl max Age缓存一年并添加asp-append-version="true"
在cshtml中。
附:如果您将托管在 IIS 之后,您可能需要关闭 js 和 css 的静态压缩而不是双重压缩,我不确定在这种情况下它会如何表现。