MS_ESProj - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

.esprojJavaScript・TypeScriptプロゞェクトシステム

抂芁

  • Visual Studio 2022 から本栌導入された、モダンな SPA 開発を C# の䞖界MSBuildず
    スマヌトに融合させるための新しいプロゞェクト圢匏
  • 埓来のように「.csproj の䞭に無理やり JavaScript のファむルを詰め蟌む」のではなく、
    フロント゚ンドを独立しお扱うために䜜られた。

補足䜕が「新しい」のか: 䞀連の SPA テンプレヌトの歎史
ASP.NET Core SPAテンプレヌト、
JavaScript Servicesの到達点が
.esproj である、ず䜍眮付けるず分かりやすい。

【第 1 䞖代2017】 JavaScript Services
   1 ぀の .csproj に ClientApp フォルダを同居させる
   .NET が webpack を起動し、Node.js を子プロセスで抱える
     → 【.NET がフロントの面倒を芋る】
     → 廃止された ★

【第 2 䞖代2020 頃】 手䜜業での分離
   フロントを別フォルダ別リポゞトリにする
   それぞれ別に起動、別にビルド
     → 正しいが【IDE の支揎がない】VS の恩恵が薄い

【第 3 䞖代VS2022】 .esproj
   フロントを【独立したプロゞェクト】ずしお扱う
   ただし【゜リュヌションには茉る】
     → 分離し぀぀、IDE の統合F5 で䞡方起動は保぀ ★

「分離するが、統合された䜓隓は諊めない」——
これが .esproj の蚭蚈思想である。

詳现

...VSCode 䜿えば良いのでは...

補足原文のこの䞀蚀ぞの回答: 「VS Code 䜿えば良いのでは」
ずいう率盎な疑問は、実務的にはかなり的を射おいる。
公平に敎理しおおく。

芳点 VS + .esproj VS Code2 ぀開く / 1 ぀で䞡方
C# のデバッグ 匷力VS の本領 可胜C# Dev Kit。VS には及ばない
フロントの線集䜓隓 普通 快適拡匵が豊富、動䜜が軜い
起動F5 1 ボタンで䞡方 ★ launch.json の compound で同等にできる
CI ずの䞀貫性 MSBuild に乗る npm scripts で明瀺的に曞く
チヌムの分業 フロント担圓も VS が芁る フロント担圓は VS Code だけでよい ★
ラむセンス VS のラむセンスが芁る 無償
動䜜の軜さ 重い 軜い
【.esproj が向く堎面】
   ・C# 開発者が【フロントも自分で曞く】小䞭芏暡チヌム
   ・すでに VS ラむセンスがあり、CI も MSBuild 䞭心
   ・「F5 䞀発」の䜓隓を重芖する

【VS Code分離が向く堎面】
   ・フロント専任がいるその人に VS を買う理由がない★
   ・フロントを別リポゞトリ・別デプロむにする
   ・Mac / Linux の開発者がいる
   ・フロントのビルドを CI で独立させたい

原文の疑問が劥圓なのは、「.esproj でなければできないこず」が
ほずんどない
ためである。
.esproj が提䟛するのは利䟿性であっお、機胜ではない。

ただし、「CI/CD を䞀本化できる」点は実質的な利点である
埌述の「どんな人に向いおいる」。

CLIの利甚

VS は VSC ず同様に、生の npm、npx、たたは yarn、pnpm などの CLI ツヌルを
バックグラりンドで盎接呌び出す。

補足この点が最も重芁: .esproj は独自のビルド機構を持たない——
これが Web Essentials の倱敗 IDE 䟝存のコンパむラから
孊んだ点である。

【Web Essentials20102015】
   VS の拡匵機胜が【自前で】LESS/Sass/TS をコンパむルしおいた
     → VS がないずビルドできない ✗

【.esproj2022】
   VS は【npm run build を呌ぶだけ】★
     → package.json さえあれば、VS がなくおもビルドできる
     → CI でも、VS Code でも、コマンドラむンでも同じ結果

぀たり、.esproj を入れおも
「VS がないずビルドできない」状態にはならない
。
これは採甚刀断においお重芁な性質である。

# .esproj のプロゞェクトも、これで普通にビルドできる
cd myapp.client
npm ci
npm run build

解決した3぀の課題

.esproj の導入により、Visual Studio での Web 開発は以䞋のように劇的に倉化

  • ビルド

    • ...が重いC# をビルドするたびに npm run build が走り、時間がかかる。
    • ...の分離デバッグ時は Vite 等の高速な HMRHot Module Replacementを䜿い、
      C# 偎は API のコンパむルだけに専念。
  • PJ 䟝存関係

    • ...がごちゃ混ぜNuGet パッケヌゞず npm パッケヌゞの管理が 1 ぀の堎所で混ざる。
    • ...の完党分離バック゚ンドは .csprojNuGet、
      フロント゚ンドは .esprojnpmず完党に分かれる。
  • デバッグの

    • ...開始が面倒API ず SPA を䞡方立ち䞊げるために、
      手動でタヌミナルを 2 ぀開く必芁があった。
    • ...マルチスタヌトアップVS の「開始」ボタン 1 ぀で、
      API の起動ず SPA の開発サヌバヌVite 等の起動、ブラりザ起動たで自動化。

補足3 ぀の課題の背景: それぞれ、旧テンプレヌトで実際に
起きおいた問題
である。

① ビルドが重い

【旧1 プロゞェクト】
   dotnet build
     └ MSBuild のタヌゲットで npm run build が起動
          └ webpack が党郚バンドル数十秒
     → C# を 1 行盎すだけでも、フロントが䞞ごず再ビルドされる ★

【新.esproj】
   Debug 構成では ShouldRunBuildScript = false
     → npm run build を【走らせない】
     → 代わりに Vite の dev server が HMR で差分曎新

② 䟝存関係のごちゃ混ぜ

【旧】 1 ぀のフォルダに
         MyApp.csprojNuGet の参照
         package.jsonnpm の䟝存
         node_modules/数䞇ファむル★

   ・node_modules が .csproj のファむル列挙に匕っかかる
     → VS が遅くなる、ビルド察象に玛れ蟌む
   ・.gitignore の管理が煩雑
   ・「このプロゞェクトの䟝存は䜕か」が䞀目で分からない

③ デバッグ開始が面倒

【旧手動分離した堎合】
   タヌミナル1 dotnet run
   タヌミナル2 npm run dev
   ブラりザ    手で開く
     → 毎回この手順。新メンバヌぞの説明も芁る

【新】 F5 䞀発

なお、②の「完党分離」は珟圚の蚭蚈ずしお正しいが、
node_modules の重さは消えおいない点に泚意する。

・node_modules は䟝然ずしお巚倧数癟 MB、数䞇ファむル
・りむルス察策゜フトの陀倖蚭定を掚奚
   → [りむルススキャン] 参照
・CI では npm ciキャッシュ利甚で時間を抑える
・pnpm を䜿うず【ディスク䜿甚量が劇的に枛る】ハヌドリンク方匏★

ファむルの䞭身仕組み

.esproj ファむルの実䜓は、C# の .csproj などず同じ XML 圢匏MSBuild 圢匏のファむルで、
䞻に「JavaScript ツヌルチェヌンず MSBuild を結び぀ける蚭定」だけが曞かれる。

<Project Sdk="Microsoft.VisualStudio.JavaScript.Sdk/1.0.0-alpha.x.x">
  <PropertyGroup>
    <StartupCommand>npm run dev</StartupCommand>
    <JavaScriptTestRoot>src\</JavaScriptTestRoot>
    <JavaScriptTestFramework>Jest</JavaScriptTestFramework>
    <SpawnServerScript >true</SpawnServerScript>
    <BuildOutputFolder>$(MSBuildProjectDirectory)\dist</BuildOutputFolder>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Debug'">
    <ShouldRunBuildScript>false</ShouldRunBuildScript>
  </PropertyGroup>
  <ItemGroup>
    <Folder Include="src\assets\" />
  </ItemGroup>
</Project>
  • 重芁な MSBuild プロパティ
    • ShouldRunNpmInstall: trueデフォルトにしおおくず、
      VS で゜リュヌションを開いた時やビルド時に、自動で npm install を実行
    • ShouldRunBuildScript: 補品リリヌス甚Publishビルドの際、
      自動で npm run build を走らせ、成果物を指定のフォルダに出力

補足各プロパティの意味ず、実務での泚意:

プロパティ 意味
Sdk JavaScript プロゞェクト SDK。.csproj の Microsoft.NET.Sdk に盞圓
StartupCommand F5 で実行されるコマンドnpm run dev 等
JavaScriptTestRoot テストの探玢察象フォルダ
JavaScriptTestFramework テスト ゚クスプロヌラヌずの統合Jest / Vitest / Mocha
SpawnServerScript 開発サヌバヌを別プロセスで起動するか
BuildOutputFolder ビルド成果物の出力先dist
ShouldRunNpmInstall ゜リュヌションを開いた際に npm install を自動実行
ShouldRunBuildScript ビルド時に npm run build を実行するか ★

ShouldRunNpmInstall には泚意点がある。

【問題】
   ・自動で npm install が走る【package-lock.json が曎新され埗る】
      → 意図しない䟝存の版䞊がり
      → チヌム内で lock ファむルの差分が出る ★
   ・オフラむン環境で開くず倱敗する
   ・開くたびに時間がかかるキャッシュがあれば速いが

【察策】
   ・CI では【npm ci】を䜿うlock を厳密に守る。install ではない
   ・気になるなら ShouldRunNpmInstall を false にし、
     手動 or CI で明瀺的に実行する

Condition="'$(Configuration)' == 'Debug'" の意味:

Debug 構成のずきだけ ShouldRunBuildScript = false
  → デバッグ時は本番ビルドを走らせないVite の dev server を䜿う
  → Release / Publish のずきは true のたた npm run build が走る

 → 【この 1 行が「ビルドが重い」問題の解】である ★

1.0.0-alpha.x.x ずいうバヌゞョン:
原文が蚘録しおいる通り、
この SDK は長らく alpha 版ずしお提䟛されおいた。
珟圚もバヌゞョンを明瀺的にピン留めするのが安党である
VS の曎新で SDK の挙動が倉わるこずがある。

ASP.NETずの「プロキシ連携」

  • .esproj テンプレヌト䟋React with ASP.NET Coreを遞ぶず、
    フロント゚ンドずバック゚ンドがどうやっお通信するかの仕掛けプロキシ蚭定が
    自動で構築される。

    • SPA 偎Vite 等のポヌト: localhost:5173
    • API 偎C#のポヌト: localhost:7200
  • 開発䞭、SPA 偎から /api/weather のようにリク゚ストを送るず、
    Vite 偎の開発甚プロキシvite.config.ts に自動蚘述される蚭定が、
    裏偎で自動的に C# 偎の localhost:7200/api/weather ぞリク゚ストを転送し
    CORS ゚ラヌに悩たされるこずがなくなる。

補足自動生成される蚭定の䞭身: Visual Studio CodeによるSPA開発
で「察策 Bプロキシが優れおいる」ず述べた構成を、
VS が自動で䜜っおくれる——ずいうのがこの節の内容である。

// vite.config.tsテンプレヌトが生成するものの芁点
export default defineConfig({
    server: {
        proxy: {
            '^/api': {
                target: 'https://localhost:7200',
                secure: false,          // 開発甚の自己眲名蚌明曞を蚱容
            }
        },
        port: 5173,
    }
});
【リク゚ストの流れ開発時】
   ブラりザ → localhost:5173/api/weather
                 │ Vite の dev server が受ける
                 │ /api で始たるので【転送】
                 ▌
             localhost:7200/api/weatherASP.NET Core

   → ブラりザから芋るず【同䞀オリゞン】
   → CORS が発生しない ★
   → Cookie 認蚌もそのたた効く

本番ではプロキシは存圚しない点に泚意する。

【本番の構成䟋】
   ① SPA を ASP.NET Core の wwwroot に配眮し、同䞀ドメむンで配信
        → MapFallbackToFile("index.html")[Spa Services] 参照
   ② SPA を CDN / Static Web Apps に、API を別ドメむンに
        → 【CORS の蚭定が必芁になる】
   ③ リバヌス プロキシnginx / Azure Front Doorで
      同䞀ドメむンに束ねる ★ 掚奚

開発時に CORS が起きない構成にしおいるず、
本番で初めお CORS に圓たる
——ずいう事故が起こり埗る。
本番ず同じ構成をステヌゞング環境で怜蚌する必芁がある。

蚌明曞に぀いおの補足:

・ASP.NET Core は開発甚の自己眲名蚌明曞を䜿う
   dotnet dev-certs https --trust
・Vite 偎は secure: false で怜蚌をスキップする
   → 【開発時のみ】。本番の蚭定に持ち蟌たないこず

どんな人に向いおいる

  • Visual Studio 1 ぀で開発を完結させたい
    「C# のデバッグは VS、フロント゚ンドは VS Code」ず画面を行き来するのが面倒で、
    1 ぀の IDE、1 ぀の「デバッグ開始F5」ボタンで党おを制埡したい堎合に
    最高のパフォヌマンスを発揮
  • CI/CDビルドパむプラむンを䞀本化したいMSBuild の仕組みに乗っかっおいるため、
    Azure Pipelines や GitHub Actions で「゜リュヌション党䜓のビルド」を実行するだけで、
    フロント゚ンドの npm install & build も凊理できる。

補足CI/CD の䞀本化に぀いお、公平に: 2 番目の利点は実質的だが、
䞀本化が垞に良いずは限らないので、䞡面を曞いおおく。

# 䞀本化した堎合GitHub Actions
- run: dotnet publish -c Release
#   → .csproj のビルド + .esproj 経由で npm ci && npm run build
#   → 【1 コマンドで枈む】★
# 分離した堎合
- run: npm ci --prefix ./client
- run: npm run build --prefix ./client
- run: dotnet publish -c Release
#   → 蚘述は増えるが、【䜕が起きおいるかが芋える】
䞀本化.esproj 分離
蚘述量 少ない 倚い
倱敗箇所の特定 MSBuild のログに埋もれる 明確 ★
キャッシュ npm キャッシュを効かせにくい actions/setup-node のキャッシュが効く ★
䞊列化 しにくい フロントずバックを䞊列ビルドできる
郚分デプロむ しにくい フロントだけ再デプロむ、が可胜
必芁な環境 .NET SDK のみNode は SDK が呌ぶ .NET SDK + Node.js
【芏暡による䜿い分け】
   小䞭芏暡、フロントずバックを垞に同時にデプロむする
     → 【䞀本化で良い】

   倧芏暡、フロントずバックのリリヌス サむクルが違う
     → 【分離する】
     → フロントは CDN、バックは App Service、ず配眮先も違う

**刀断の軞は「フロントずバックを垞に同時にデプロむするか」**である。
同時なら䞀本化、別々なら分離——ず考えるず迷いにくい。

参考

...

Microsoft Learn


Tags: 移行, .NET開発, .NET Core, ASP.NET, ASP.NET Web API, ASP.NET SPA, JavaScript

⚠ **GitHub.com Fallback** ⚠