新しいMVCでは動的バンドルはサポートされていないようです( link )。gulpタスクを使用して行う必要があります。 MVCはasp-append-version
と呼ばれるいくつかの新しい属性をサポートしますが、それがどのように機能するかについての説明はありません。ファイルの内容のハッシュを計算していると思われ、ファイルの変更後にそれを更新します。仕組みについてのドキュメントはありますか?
また、MVCがカミソリマークアップを解析するたびに、ファイルの変更を検出する方法や、ハッシュを再計算するだけなのか疑問に思っています。
LinkTagHelper
ソースコードを確認できます。ソースコードでは、基本的に FileVersionProvider
を介してhref値にバージョンクエリ文字列を追加しています。 =:
if (AppendVersion == true)
{
EnsureFileVersionProvider();
if (Href != null)
{
output.Attributes[HrefAttributeName].Value = _fileVersionProvider.AddFileVersionToPath(Href);
}
}
private void EnsureFileVersionProvider()
{
if (_fileVersionProvider == null)
{
_fileVersionProvider = new FileVersionProvider(
HostingEnvironment.WebRootFileProvider,
Cache,
ViewContext.HttpContext.Request.PathBase);
}
}
FileVersionProvider
は、SHA256
アルゴリズムを使用してファイル内容のハッシュを計算します。次に、URLエンコードして、次のようにクエリ文字列に追加します。
path/to/file?v=B95ZXzHiOuQJzhBoHlSlNyN1_cOjJnz2DFsr-3ZyyJs
ハッシュは、ファイルが変更されたときにのみ再計算されます。キャッシュに追加されますが、ファイル監視に基づく有効期限トリガーがあります。
if (!_cache.TryGetValue(path, out value))
{
value = QueryHelpers.AddQueryString(path, VersionKey, GetHashForFile(fileInfo));
var cacheEntryOptions = new MemoryCacheEntryOptions().AddExpirationToken(_fileProvider.Watch(resolvedPath));
_cache.Set(path, value, cacheEntryOptions);
}
このウォッチャーは、IFileProvider
を実装するHostingEnvironment.WebRootFileProvider
によって提供されます。
//
// Summary:
// Creates a change trigger with the specified filter.
//
// Parameters:
// filter:
// Filter string used to determine what files or folders to monitor. Example: **/*.cs,
// *.*, subFolder/**/*.cshtml.
//
// Returns:
// An Microsoft.Framework.Caching.IExpirationTrigger that is triggered when a file
// matching filter is added, modified or deleted.
IExpirationTrigger Watch(string filter);
注:IMemoryCache
の値を調べると、キャッシュされた値を自分で確認できます。
//give the link:
<link rel="stylesheet" asp-append-version="true" href="~/css/site.css" />
//You can check the cached version
this.Context.RequestServices.GetRequiredService<IMemoryCache>().Get("/css/site.css")
//Which will show a value like:
/css/site.css?v=B95ZXzHiOuQJzhBoHlSlNyN1_cOjJnz2DFsr-3ZyyJs
かみそりで
var fileVersion = @Context.AddFileVersionToPath("./path/to/resource");
拡張方法
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.DependencyInjection;
public static class HttpContextExtensions
{
public static string AddFileVersionToPath(this HttpContext context, string path)
{
return context
.RequestServices
.GetRequiredService<IFileVersionProvider>()
.AddFileVersionToPath(context.Request.PathBase, path);
}
}
かみそりで
var fileversion = '@this.AddFileVersionToPath("/js/components/forms.js")';
拡張方法
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.TagHelpers.Internal;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
public static class IRazorPageExtensions
{
public static string AddFileVersionToPath(this IRazorPage page, string path)
{
var context = page.ViewContext.HttpContext;
IMemoryCache cache = context.RequestServices.GetRequiredService<IMemoryCache>();
var hostingEnvironment = context.RequestServices.GetRequiredService<IHostingEnvironment>();
var versionProvider = new FileVersionProvider(hostingEnvironment.WebRootFileProvider, cache, context.Request.Path);
return versionProvider.AddFileVersionToPath(path);
}
}
FileVersionProvider の現在の実装によると、ハッシュは相対ファイルパスにのみ追加されます。 <script src="~/js/jquery.min.js" asp-append-version="true"></script>
絶対パスが使用される場合、例えばhttps://code.jquery.com/jquery-3.1.1.js
、ハッシュは追加されません。