ASP.NET Core 中 Razor 檔案的先行編譯
副檔名為 .cshtml
的 Razor 檔案會在使用 Razor SDK 的組建和發佈時間進行編譯。 您可以透過設定專案,選擇性地啟用執行階段編譯。
Razor 編譯
Razor SDK 預設會啟用 Razor 檔案的建置和發佈階段編譯。 啟用時,執行階段編譯可補充建置時間編譯,以允許在應用程式執行時編輯 Razor 檔案。
使用 .NET 熱重新載入也支援應用程式執行的同時,在開發期間更新 Razor 檢視和 Razor Pages。
注意
啟用時,執行階段編譯會停用 .NET 熱重新載入。 建議您在開發期間使用熱重新載入,而不是 Razor 執行階段編譯。
為所有環境啟用執行階段編譯
若要為所有環境啟用執行階段編譯:
安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。
在
Program.cs
中呼叫 AddRazorRuntimeCompilation:var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages() .AddRazorRuntimeCompilation();
有條件的啟用執行階段編譯
執行階段編譯可以有條件地啟用,以確保已發佈的輸出:
- 使用編譯的檢視。
- 不會在生產環境中啟用檔案監看員。
若要只針對開發環境啟用執行階段編譯:
安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。
當目前的環境設定為 [開發] 時呼叫
Program.cs
中的 AddRazorRuntimeCompilation:var builder = WebApplication.CreateBuilder(args); var mvcBuilder = builder.Services.AddRazorPages(); if (builder.Environment.IsDevelopment()) { mvcBuilder.AddRazorRuntimeCompilation(); }
執行階段編譯也可以使用裝載啟動組件來啟用。 若要在特定啟動設定檔的開發環境中啟用執行階段編譯:
- 安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。
- 在
launchSettings.json
中修改啟動設定檔的environmentVariables
區段:確認
ASPNETCORE_ENVIRONMENT
設為"Development"
。將
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
設定為"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
。 例如,下列launchSettings.json
會啟用ViewCompilationSample
和IIS Express
啟動設定檔的執行階段編譯:{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:7098", "sslPort": 44332 } }, "profiles": { "ViewCompilationSample": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "applicationUrl": "https://localhost:7173;http://localhost:5251", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" } }, "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" } } } }
使用此方法時,不需要在 Program.cs
中變更程式碼。 在執行階段中,ASP.NET Core 會在 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
中搜尋組件層級 HostingStartup 屬性。 屬性 HostingStartup
會指定要執行的應用程式啟動程式碼,且該啟動程式碼會啟用執行階段編譯。
啟用 Razor 類別庫的執行階段編譯
假設 Razor Pages 專案參考名為 MyClassLib 的 Razor 類別庫 (RCL)。 RCL 包含 MVC 和 Razor Pages 專案所使用的 _Layout.cshtml
檔案。 若要啟用該 RCL 中 _Layout.cshtml
檔案的執行階段編譯,請在 Razor Pages 專案中進行下列變更:
使用條件式啟用執行階段編譯中的指示來啟用執行階段編譯。
在
Program.cs
中設定 MvcRazorRuntimeCompilationOptions:var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages(); builder.Services.Configure<MvcRazorRuntimeCompilationOptions>(options => { var libraryPath = Path.GetFullPath( Path.Combine(builder.Environment.ContentRootPath, "..", "MyClassLib")); options.FileProviders.Add(new PhysicalFileProvider(libraryPath)); });
上述程式碼會建置 MyClassLib RCL 的絕對路徑。 PhysicalFileProvider API 可用來找出位於該絕對路徑的目錄和檔案。 最後,
PhysicalFileProvider
執行個體會新增至檔案提供者集合,以允許存取 RCL 的.cshtml
檔案。
其他資源
副檔名為 .cshtml
的 Razor 檔案會在使用 Razor SDK 的組建和發佈時間進行編譯。 您可以透過設定專案,選擇性地啟用執行階段編譯。
Razor 編譯
Razor SDK 預設會啟用 Razor 檔案的建置和發佈階段編譯。 啟用時,執行階段編譯會補充建置時間編譯,以允許更新 Razor 檔案 (如果該檔案已被編輯)。
在專案建立時啟用執行階段編譯
RazorPages 和 MVC 專案範本包含一個選項,可在建立專案時啟用執行階段編譯。 此選項只有在 ASP.NET Core 3.1 和更新版本中才支援。
在 [建立新的 ASP.NET Core Web 應用程式] 對話方塊中:
- 選取 Web 應用程式或 Web 應用程式 (Model-View-Controller) 專案範本。
- 選取 [啟用 Razor 執行階段編譯] 核取方塊。
在現有專案中啟用執行階段編譯
若要為現有專案中的所有環境啟用執行階段編譯:
安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。
更新專案的
Startup.ConfigureServices
方法以包括對 AddRazorRuntimeCompilation 的呼叫。 例如:public void ConfigureServices(IServiceCollection services) { services.AddRazorPages() .AddRazorRuntimeCompilation(); // code omitted for brevity }
有條件的在現有專案中啟用執行階段編譯
您可以啟用執行階段編譯,使其僅適用於本機開發。 以這種方式有條件的啟用,可確保已發佈的輸出:
- 使用編譯的檢視。
- 不會在生產環境中啟用檔案監看員。
若要只在開發環境中啟用執行階段編譯:
- 安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。
- 修改
launchSettings.json
中的啟動設定檔environmentVariables
區段:- 確認
ASPNETCORE_ENVIRONMENT
已設定為"Development"
。 - 將
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
設定為"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
。
- 確認
在下列範例中,IIS Express
和 RazorPagesApp
啟動設定檔的開發環境中會啟用執行時間編譯:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:57676",
"sslPort": 44364
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
}
},
"RazorPagesApp": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
}
}
}
}
專案類別 Startup
中不需要變更程式碼。 在執行階段中,ASP.NET Core 會在 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
中搜尋組件層級 HostingStartup 屬性。 屬性 HostingStartup
會指定要執行的應用程式啟動程式碼。 該啟動程式碼會啟用執行階段編譯。
啟用 Razor 類別庫的執行階段編譯
假設 Razor Pages 專案參考名為 MyClassLib 的 Razor 類別庫 (RCL)。 RCL 包含您小組所有 MVC 和 Razor Pages 專案的 _Layout.cshtml
檔案。 您想要在該 RCL 中啟用 _Layout.cshtml
檔案的執行時間編譯。 在 Razor Pages 專案中進行下列變更:
使用條件式啟用現有專案中的執行時間編譯來啟用執行時間編譯。
在
Startup.ConfigureServices
中設定執行時間編譯選項:public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.Configure<MvcRazorRuntimeCompilationOptions>(options => { var libraryPath = Path.GetFullPath( Path.Combine(HostEnvironment.ContentRootPath, "..", "MyClassLib")); options.FileProviders.Add(new PhysicalFileProvider(libraryPath)); }); }
在上述程式碼中,會建構 MyClassLib RCL 的絕對路徑。 PhysicalFileProvider API 可用來找出位於該絕對路徑的目錄和檔案。 最後,
PhysicalFileProvider
執行個體會新增至檔案提供者集合,以允許存取 RCL 的.cshtml
檔案。