.NET 5 之後會將 dotnet 各 platform 整合起來,且 dotnet 3.1 cshtml HMR 的 extension 功能被官方強迫棄用,目前我看各方文章感覺還沒有一個很好的升級方式。要馬就是改用網友寫的 Vue-Cli ,把 config 轉到 cli,要馬就是 Nuget 套件改用網友寫的 。我自己參考國外文章,是有人用 Vite 做到用 index.cshtml 的 HMR: 這篇 。但是因為公司內部還是有 IE 瀏覽器且 Vite 相關套件還沒有到完整,沒辦法放棄使用 webpack,只好參考這篇嘗試用 webpack HMR,很不幸的,若照文章模仿雖然 HMR 字眼有出現,但一直沒有正常作用,胡亂嘗試了一番,勉強用奇怪的方式有做到 Auto Reload,但沒有 HMR 效果就不太滿意。目前先將這些研究文章和亂試的方式記錄下來。
 
.csproj 1 2 3 4 5 6 7 8 <Project  Sdk ="Microsoft.NET.Sdk.Web" >   <PropertyGroup >      <TargetFramework > net5.0</TargetFramework >    </PropertyGroup >    <ItemGroup >      <PackageReference  Include ="Microsoft.AspNetCore.SpaServices.Extensions"  Version ="5.0.6"  />    </ItemGroup >  </Project > 
 
Program.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... using  Microsoft.Extensions.Hosting;namespace  dotnet_core_vue_cli {     public  class  Program      {         public  static  void  Main (string [] args )          {            CreateHostBuilder(args).Build().Run();         }         public  static  IHostBuilder CreateHostBuilder (string [] args )  =>             Host.CreateDefaultBuilder(args)                 .ConfigureWebHostDefaults(webBuilder =>                 {                     webBuilder.UseStartup<Startup>();                 });     } } 
 
Startup.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 ... using  Microsoft.Extensions.Hosting;using  Microsoft.AspNetCore.SpaServices.ReactDevelopmentServer;namespace  dotnet_core_vue_cli {     public  class  Startup      {         ...         public  void  ConfigureServices (IServiceCollection services )          {            services.AddControllersWithViews();         }         ...         public  void  Configure (IApplicationBuilder app, IWebHostEnvironment env )          {            if  (env.IsDevelopment())             {                 app.UseDeveloperExceptionPage();             }             else              {                 app.UseExceptionHandler("/Home/Error" );             }             app.UseStaticFiles();             app.UseRouting();             app.UseEndpoints(endpoints =>             {                 endpoints.MapControllerRoute(                     name: "default" ,                     pattern: "{controller=Home}/{action=Index}/{id?}" );                 endpoints.MapFallbackToController("Index" , "Home" );             });             if  (env.IsDevelopment())             {                 app.UseSpa(spa =>                 {                                          spa.Options.SourcePath = "./" ;                                          spa.Options.DevServerPort = 3000 ;                                                               spa.UseReactDevelopmentServer(npmScript: "start" );                 });             }         }     } } 
 
webpack.xxx.js webpack.dev.js 把 entry 部分 加入 ‘webpack-dev-server/client?http://localhost:3000/ ‘ 進去 js,devServer 設定如下。其中的原因可參考這位網友解釋 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... module .exports = merge(base, {    entry: {         main: [             'webpack-dev-server/client?http://localhost:3000/' ,             './src/main.js'          ]     },     mode: 'development' ,     devServer: {         historyApiFallback: true ,         noInfo: false ,                  port: 3000 ,         inline: false ,         liveReload: true ,     },     devtool: 'eval-source-map' , }) 
 
package.json npm run hmr 會呼叫 dotnet run 把專案跑起來。 執行 startup.cs 會自動呼叫 npm run start 顯示 “Starting the development server”。之後就會將 port 3000(webpack-dev-server) 跟 8080(dotnet) 做對應。
1 2 3 4 5 6 7 8 9 10 {     ...     "scripts": {         "hmr": "cross-env ASPNETCORE_ENVIRONMENT=Development NODE_ENV=development dotnet run",         "start": "echo Starting the development server && webpack serve --config webpack.config.js",         "dev": "webpack serve --config webpack.config.js",         "build": "webpack --config webpack.pro.js"     },     ... } 
 
這樣起來的專案就會依據 vue code 修改做 Auto Reload 的動作,程式放在 Github 。
參考資料