ASP.NET Core 中的 Razor 文件编译Razor file compilation in ASP.NET Core

本文内容

作者:Rick Anderson

调用相关的 MVC 视图时,Razor 文件在运行时进行编译。不支持在生成时发布 Razor 文件。可以使用预编译工具,在发布时选择编译 Razor 文件并将其与应用一起部署。

调用相关的 Razor 页和 MVC 视图时,Razor 文件在运行时进行编译。不支持在生成时发布 Razor 文件。可以使用预编译工具,在发布时选择编译 Razor 文件并将其与应用一起部署。

调用相关的 Razor 页和 MVC 视图时,Razor 文件在运行时进行编译。在生成时和发布时使用 Razor SDK 编译 Razor 文件。

在生成和发布时均使用 Razor SDK 编译扩展名为 .cshtml 的 Razor 文件。通过配置应用程序,可以选择启用运行时编译。

Razor 编译Razor compilation

Razor SDK 默认启用 Razor 文件的生成时和发布时编译。启用后,运行时编译将补充生成时编译,允许更新 Razor 文件(如果对其进行编辑)。

Razor SDK 默认启用 Razor 文件的生成时和发布时编译。Razor 文件更新后,支持在生成时编辑这些文件。默认情况下,只有编译 Razor 文件所需的编译的 Views.dll(而非 .cshtml)文件或引用程序集随应用一起部署。

重要

已弃用预编译工具,并且将在 ASP.NET Core 3.0 中删除该工具。建议迁移到 Razor Sdk

仅当项目文件中未设置特定于预编译的属性时,Razor SDK 才有效。例如,通过将 .csproj 文件的 MvcRazorCompileOnPublish 属性设置为 true 来禁用 Razor SDK。

如果项目面向 .NET Framework,请安装 Microsoft.AspNetCore.Mvc.Razor.ViewCompilation NuGet 包:

  1. <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation"
  2. Version="2.0.4"
  3. PrivateAssets="All" />

如果项目面向 .NET Core,则无需进行任何更改。

默认情况下,ASP.NET Core 2.x 项目模板将 MvcRazorCompileOnPublish 属性隐式设置为 true因此,可以从 .csproj 文件中安全地删除此元素。

重要

已弃用预编译工具,并且将在 ASP.NET Core 3.0 中删除该工具。建议迁移到 Razor Sdk

在 ASP.NET Core 2.0 中执行独立部署 (SCD) 时,无法使用 Razor 文件预编译。

MvcRazorCompileOnPublish 属性设置为 true,然后安装 Microsoft.AspNetCore.Mvc.Razor.ViewCompilation NuGet 包。以下 .csproj 示例突出显示了这些设置:

  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2. <PropertyGroup>
  3. <TargetFramework>netcoreapp1.1</TargetFramework>
  4. <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
  5. </PropertyGroup>
  6. <ItemGroup>
  7. <PackageReference Include="Microsoft.AspNetCore" Version="1.1.0" />
  8. <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.0" />
  9. <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.0" />
  10. <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="1.1.0-*" />
  11. </ItemGroup>
  12. </Project>

使用 .NET Core CLI 发布命令,让应用做好框架依赖型部署的准备。例如,在项目根目录中执行以下命令:

  1. dotnet publish -c Release

预编译成功后,将生成包含已编译 Razor 文件的 <project_name>.PrecompiledViews.dll 文件。例如,以下屏幕截图描述了 WebApplication1.PrecompiledViews.dll 中 Index.cshtml 的内容:

DLL 中的 Razor 视图

运行时编译Runtime compilation

通过 Razor 文件的运行时编译补充生成时编译。当 .cshtml 文件的内容发生更改时,ASP.NET Core MVC 将重新编译 Razor 文件。

通过 Razor 文件的运行时编译补充生成时编译。RazorViewEngineOptionsAllowRecompilingViewsOnFileChange 获取或设置一个值,该值确定当磁盘上的文件发生更改时是否重新编译和更新 Razor 文件(Razor 视图和 Razor Pages)。

对于以下项,默认值为 true

有关设置应用的兼容性版本的指导和示例,请参阅 ASP.NET Core MVC 的兼容性版本

为所有环境和配置模式启用运行时编译:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddRazorPages()
  4. .AddRazorRuntimeCompilation();
  5. // code omitted for brevity
  6. }

有条件地启用运行时编译Conditionally enable runtime compilation

启用运行时编译时可使其仅用于本地开发。以这种方式有条件地启用可确保已发布的输出:

  • 使用编译视图。
  • 较小。
  • 不会在生产环境中启用文件观察程序。

基于环境和配置模式启用运行时编译:

  1. <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.0" Condition="'$(Configuration)' == 'Debug'" />
  • 更新项目的 Startup.ConfigureServices 方法以包含对 AddRazorRuntimeCompilation 的调用。有条件地执行 AddRazorRuntimeCompilation,使其仅当 ASPNETCORE_ENVIRONMENT 变量设置为 Development时在调试模式下运行:
  1. public IWebHostEnvironment Env { get; set; }
  2. public void ConfigureServices(IServiceCollection services)
  3. {
  4. IMvcBuilder builder = services.AddRazorPages();
  5. #if DEBUG
  6. if (Env.IsDevelopment())
  7. {
  8. builder.AddRazorRuntimeCompilation();
  9. }
  10. #endif
  11. // code omitted for brevity
  12. }

其他资源Additional resources