ASP.NET ソース変更時にクライアントサーバーを再起動させない方法
ASP.NET
でdotnet watch run
でソースを監視し、ソース変更時にクライアントサーバーを再起動させない方法を紹介します。
以下のようにクライアントの開発サーバーと連携していると、dotnet watch run
でソースを監視時、ソース変更後に毎回クライアント側のサーバーが再起動されます。(毎回npm run start
やnpm run serve
が走る)
Startup.cs
// Configureファンクション
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseReactDevelopmentServer(npmScript: "start"); // reactの場合
spa.UseVueCli(npmScript: "serve"); // vueの場合
}
});
対処法
以下のようにreact
やvue
の設定の代わりにプロキシサーバの設定を追記します。
ポートはraect
やvue
の開発サーバーのポートに合わせてください。
Startup.cs
// Configureファンクション
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseReactDevelopmentServer(npmScript: "start"); // reactの設定
spa.UseVueCli(npmScript: "serve"); // vueの設定
spa.UseProxyToSpaDevelopmentServer("http://localhost:8080");
}
});
このようにすると、クライアント側の開発サーバーは手動で起動する必要がありますが、サーバー側のソースを変更するたびに毎回クライアント側のサーバーが再起動するのを防ぐことができます。
Hot Module Replacement
(hmr)も同じように有効になっているため、クライアント側の開発も今までどおり行えます。
2つのサーバーを同時に起動する
上記のデメリットとして、2つの開発サーバーを個別に起動する必要があります。
対策として、vscode
のタスク機能を使って1つのコマンドで2つのサーバーを同時に起動できるようにします。
下準備として、F5でデバッグ実行をします。
初回起動時は以下のダイアログが表示されるので、.NET Core
を選択してください。
そうするとプロジェクトフォルダの直下に以下のフォルダが作成されていると思います。
- プロジェクト
- .vscode
- launch.json
- task.json
- .vscode
task.json
にクライアント側のタスクを追記します。
client start
はreact
やvue
の開発サーバーを起動するタスクで、client start & dotnet watch
はASP.NET Core
のwatch
のタスクとクライアントサーバー起動のタスクを両方実行するタスクです。
task.json
// 一部抜粋
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"${workspaceFolder}/code.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "client start",
"options": {
"cwd": "${workspaceFolder}/ClientApp"
},
"type": "npm",
"script": "start" // reactの場合
"script": "serve" // vueの場合
},
{
"label": "client start & dotnet watch",
"dependsOrder": "parallel",
"dependsOn": [
"client start",
"watch"
]
}
Ctrl+Shift+pでコマンドパレットを起動し、Tasks: Run Task
を選択し、client start & dotnet watch
を選択すると、両方の開発サーバーが起動されることを確認できます。