ASP.NET Core 3.1 Hot Reload速度过慢 如何优化热重载及增量编译速度
问题原因分析
你遇到的增量编译、热重载过慢的问题,绝大多数情况和项目结构、默认开发配置不合理直接相关。ASP.NET Core 3.1默认的编译策略会在构建时把所有Razor视图预编译到project.Views.dll中,每次代码改动都会触发全量的视图编译流程,再加上如果项目是单体架构,所有业务逻辑、数据访问、Web层代码耦合在同一个项目中,MSBuild增量检测时需要遍历大量无关联文件,进一步拉长了构建耗时。dotnet watch run默认没有开运行时编译的情况下,除了全量构建外还会额外增加进程重启、文件变更扫描的开销,所以耗时比单独dotnet build更长。
优化方案
- 拆分项目架构
将业务逻辑、数据访问、公共DTO/模型、通用工具类等非Web层代码全部抽离到独立的类库项目中,入口Web项目仅保留控制器、视图、过滤器、中间件、静态资源等Web层专属代码。调整后修改控制器或视图时,仅会触发Web项目的增量编译,不会重新编译类库部分,可大幅减少编译检测范围。 - 启用Razor运行时编译
开发环境下安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationNuGet包,在Startup.cs的ConfigureServices方法中修改服务注册代码:
开启后视图改动不会触发全量的Razor预编译,运行时会直接加载改动后的视图文件,省去services.AddControllersWithViews() // 仅开发环境启用 .AddRazorRuntimeCompilation();project.Views.dll的编译耗时。 - 优化dotnet watch配置
在Web项目的.csproj文件中添加文件排除规则,减少watch工具的扫描范围:<ItemGroup> <WatchExclude Include="node_modules\**" /> <WatchExclude Include="Logs\**" /> <WatchExclude Include="wwwroot\lib\**" /> <!-- 其他不需要触发重载的文件路径均可添加 --> </ItemGroup> - 精简开发环境编译配置
在.csproj文件中针对Debug配置调整编译参数:
关闭不必要的代码分析、程序集复制逻辑,减少编译额外开销。<PropertyGroup Condition="'$(Configuration)'=='Debug'"> <Optimize>false</Optimize> <DebugType>portable</DebugType> <RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild> <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies> </PropertyGroup> - 使用高版本SDK编译
可安装.NET 6+版本的SDK,在项目根目录添加global.json指定目标框架版本兼容3.1即可,高版本SDK的MSBuild增量编译、dotnet watch工具均有大量性能优化,兼容.NET Core 3.1项目的同时可显著提升构建速度。
热重载性能对标说明
优化完成后,ASP.NET Core 3.1的热重载完全可以达到Spring Boot devtools的数秒级重载水平:单纯修改控制器单字符的重载耗时可控制在2-3秒以内,视图修改的重载耗时可低至1秒以内,和Spring Boot devtools的表现基本持平。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

