Visual StudioでTypeScriptをNuGetビルドする方法と2026年4月更新ポイント

Visual StudioでASP.NET CoreプロジェクトのTypeScriptをビルドするなら、結論はMicrosoft.TypeScript.MSBuildをNuGetで導入し、tsconfig.jsonをプロジェクト単位で管理し、dotnet buildやdotnet publishでも同じ成果物が出る状態にすることです。2026年4月のMicrosoft Learn更新は、派手な新機能追加というより、TypeScript SDKからNuGet/MSBuild中心へ移行する方針、tsconfig.json例の見直し、CI/CDでの再現性確認を促す内容として読むべきです。Microsoft Learnの対象ページは現行表示で2026年4月27日更新、GitHub履歴では4月24日にメタデータ関連の更新、4月27日にtsconfig例の更新が確認できます。(Microsoft Learn)

目次

Visual StudioのTypeScript NuGetビルドで押さえるべき更新ポイント

今回の更新で実務上もっとも重要なのは、ASP.NET Core + TypeScript + Visual Studioの組み合わせでは、NuGetパッケージを使ったMSBuild統合が引き続き中心に位置付けられている点です。Microsoft Learnでは、Visual Studio 2019以降はTypeScript SDKではなくNuGetパッケージの利用が推奨され、ASP.NET Coreなどの.NETシナリオではdotnet buildやdotnet publishによるTypeScriptコンパイルを有効にする方法としてNuGetが示されています。(Microsoft Learn)

一方で、すべてのTypeScriptプロジェクトにNuGetを使えばよいわけではありません。JavaScript Project System、つまりJSPSや.esprojベースのプロジェクトでは、NuGetではなくnpmパッケージを使うよう案内されています。Visual Studio 2022ではTypeScript SDKが非推奨とされており、既存プロジェクトもNuGetまたはnpmベースへ整理する流れが明確です。(Microsoft Learn)

2026年4月更新を読む際は、日付の扱いにも注意が必要です。4月24日のコミット履歴には「自動挿入されるメタデータの削除」「所有者情報の更新」が記録されていますが、ビルド設定として目に見える更新は4月27日のtsconfig.json例の変更です。具体的には、compileOnSave、target: "ES6"、rootDir: "./scripts"、outDir: "wwwroot/js"、excludeでnode_modulesとwwwrootを除外する構成が示されています。(GitHub)

NuGetとnpmの使い分け

Visual StudioでTypeScriptを扱うときに迷いやすいのが、「NuGetで入れるべきか、npmで入れるべきか」です。判断基準は、フロントエンドの技術よりもプロジェクトシステムとビルド経路で決めると失敗しにくくなります。

プロジェクトの種類推奨される方法理由注意点
ASP.NET Core MVC / Razor Pages / Blazor系でTypeScriptを一部利用NuGetMSBuildやdotnet buildに統合しやすいtsconfig.jsonのoutDirをwwwroot配下に整理する
CI/CDでdotnet publishを使って配布物を作るASP.NET CoreNuGetVisual Studio外でも.NET CLI経由でビルドしやすいビルドエージェント上のNode.js有無を確認する
JSPS / .esprojベースのVisual StudioプロジェクトnpmMicrosoft Learnでnpm利用が案内されているNuGetを入れても期待どおりに連携しない可能性がある
React / Angular / Vue / Viteなどのフロントエンド主体npmNode.jsツールチェーンと相性がよいASP.NET Core側とはビルド責務を分ける
古いnon-SDK styleのASP.NET CoreNuGet。ただし既存Importの整理が必要MSBuild統合をNuGet側に任せるMicrosoft.TypeScript.Default.propsやMicrosoft.TypeScript.targetsの重複Importに注意

実務では「Visual Studioで編集できるか」ではなく、「クリーンな環境でdotnet buildまたはnpm scriptを実行したときに同じ成果物が出るか」を基準にしてください。開発者のPCでは動くのにCIで失敗するケースの多くは、Visual Studioのローカル環境、Node.jsのパス、古いSDK参照、tsconfig.jsonの出力先が混在していることが原因です。

ASP.NET CoreでTypeScriptをNuGetビルドする基本手順

Visual StudioでASP.NET CoreプロジェクトにTypeScriptビルドを組み込む流れは、次の順で進めると安全です。Microsoft Learnでは、NuGetパッケージマネージャーからMicrosoft.TypeScript.MSBuildを追加し、tsconfig.jsonをプロジェクトルートに置く手順が示されています。(Microsoft Learn)

手順作業確認ポイント
1ASP.NET CoreプロジェクトをVisual Studioで開く.csprojを持つプロジェクトか確認する
2NuGetパッケージマネージャーでMicrosoft.TypeScript.MSBuildを追加既存のTypeScript SDK参照と混在させない
3tsconfig.jsonをプロジェクトルートに追加scriptsなど入力元フォルダーを決める
4rootDirとoutDirを明示する生成JSが想定外の階層に出ないようにする
5Visual Studioのビルド、またはdotnet buildを実行wwwroot/jsなどに.jsと.js.mapが生成されるか確認する
6dotnet publishでも確認開発PCだけでなく配布成果物でも再現する

Microsoft.TypeScript.MSBuildのバージョンは、記事やサンプルをそのまま固定値としてコピーするのではなく、プロジェクトのサポート方針に合わせて決めます。Microsoft Learnのサンプルでは5.8.3のPackageReferenceが掲載されていますが、NuGet Galleryでは2026年4月時点で6.0.3が表示されています。導入時は、最新化を優先するのか、組織内で検証済みのバージョンに固定するのかを決めてから反映してください。(Microsoft Learn)

<ItemGroup>
  <PackageReference Include="Microsoft.TypeScript.MSBuild" Version="6.0.3">
    <PrivateAssets>all</PrivateAssets>
  </PackageReference>
</ItemGroup>

上記はあくまで例です。チームでCentral Package Managementを使っている場合は、.csprojにバージョンを直接書くのではなく、Directory.Packages.propsで一元管理する方が保守しやすくなります。特に複数のASP.NET Coreプロジェクトを持つリポジトリでは、TypeScriptコンパイラのバージョン差がビルド結果や型チェック結果の差につながることがあります。

2026年4月更新で注目したいtsconfig.jsonの考え方

今回の更新で実務的に見直したいのは、tsconfig.jsonのサンプルです。Microsoft Learnの現行例では、TypeScriptファイルをscripts配下に置き、生成されたJavaScriptをwwwroot/jsへ出力する構成が示されています。(Microsoft Learn)

{
  "compileOnSave": true,
  "compilerOptions": {
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "target": "ES6",
    "rootDir": "./scripts",
    "outDir": "wwwroot/js"
  },
  "include": [
    "scripts/**/*"
  ],
  "exclude": [
    "node_modules",
    "wwwroot"
  ]
}

この設定で特に重要なのは、rootDir、outDir、excludeの3つです。

rootDirはTypeScriptの入力元を明確にします。これを省略すると、プロジェクト構成によっては出力先に意図しない階層が作られることがあります。scripts/app.tsをwwwroot/js/app.jsとして出したいなら、rootDirを./scriptsに固定しておくと管理しやすくなります。

outDirは生成されたJavaScriptの出力先です。ASP.NET Coreでは静的ファイルとして配信するため、一般的にはwwwroot/jsのようにwwwroot配下へ出力します。ただし、生成物をGitに含めるかどうかはチームで決めてください。CI/CDで必ずビルドして成果物を作る運用なら、生成済みJSをソース管理に含めない方が差分管理は楽になります。

excludeでwwwrootを除外している点も見落とせません。wwwrootを除外しないと、生成済みJavaScriptや関連ファイルを再処理対象にしてしまい、重複出力や不要なビルド対象の増加につながることがあります。node_modulesも同様に、TypeScriptの入力対象に含めるべきではありません。

noImplicitAnyは公式例ではfalseです。既存コードの移行時には現実的な設定ですが、新規開発や型安全性を重視するプロジェクトではtrueを検討する価値があります。最初から厳しすぎる設定にして開発を止めるより、移行フェーズではfalse、型定義が整った段階でtrueへ引き上げる、という段階的な運用も有効です。

ビルド時に確認すべき出力とデバッグ設定

Visual StudioでBuild > Build Solutionを実行すると、tsconfig.jsonの設定に従ってTypeScriptがコンパイルされます。sourceMapを有効にしている場合、outDirに指定したフォルダーに.jsファイルと.js.mapファイルが生成されます。Microsoft Learnでは、デバッグにSource Mapファイルが必要であることも明記されています。(Microsoft Learn)

確認すべきポイントは次のとおりです。

確認項目見る場所OKの状態
JavaScriptが生成されているかwwwroot/js.tsに対応する.jsがある
Source Mapが生成されているかwwwroot/js.js.mapがある
ブラウザーで読み込まれているか開発者ツールのNetwork404になっていない
TypeScriptの行でデバッグできるかブラウザー開発者ツールまたはVisual Studio.tsに近い位置で追跡できる
CIでも同じ出力になるかビルドログと成果物開発PCと差がない

「Visual StudioでF5を押すと動くが、dotnet publish後にJavaScriptがない」という場合は、ローカルの生成済みファイルに依存している可能性があります。必ずクリーンな状態でdotnet build、できればdotnet publishまで実行し、成果物の中にwwwroot/jsが含まれるか確認してください。

DevOps engineersとplatform teamsが見直すべき運用ポイント

開発者個人の設定だけでなく、DevOpsやプラットフォームチームは「誰が、どの環境でビルドしても同じ結果になるか」を確認する必要があります。

まず、Microsoft.TypeScript.MSBuildのバージョンをリポジトリで固定します。各開発者がVisual StudioのUIから都度追加すると、プロジェクトごとにTypeScriptのバージョンがずれることがあります。複数プロジェクトを管理するなら、Central Package Managementでバージョンを統一するのが現実的です。

次に、Node.jsの扱いを明確にします。Microsoft Learnでは、Visual Studioがインストールされている環境では同梱のnode.exeが自動的に使われ、Visual Studioがない環境ではNode.jsのインストールが必要になると説明されています。また、Visual Studioが想定と異なるNode.jsやサードパーティツールを使う場合は、外部Webツールのパス設定を確認する必要があります。(Microsoft Learn)

CI/CDでは、次のようなチェックをパイプラインに入れるとトラブルを早期に発見できます。

dotnet restore
dotnet build --configuration Release
dotnet publish --configuration Release --output ./publish

ビルド後に、publish/wwwroot/js配下のJavaScriptとSource Mapの有無を確認します。単にビルドが成功しただけでは不十分です。Webアプリとして配信される静的ファイルが成果物に含まれているかまで見る必要があります。

グローバルチームで開発している場合は、READMEや開発環境セットアップ手順に「TypeScriptはNuGet/MSBuildでビルドする」「npmはJSPSまたはフロントエンド専用プロジェクトで使う」と明記しておくと混乱を減らせます。英語圏メンバーと共同開発する場合でも、このルールはそのまま通用します。

古いプロジェクトで起きやすいImport重複に注意

古いnon-SDK styleのASP.NET Coreプロジェクトでは、TypeScript関連のMSBuild importが.csprojに直接残っていることがあります。Microsoft Learnでは、NuGetパッケージを使ってMSBuildサポートを追加する場合、Microsoft.TypeScript.Default.propsやMicrosoft.TypeScript.targetsをプロジェクトファイル側で個別にImportしないよう案内されています。これらはNuGetパッケージによって取り込まれるため、重複すると意図しない動作につながる可能性があります。(Microsoft Learn)

削除対象になりやすい記述は、次のようなImportです。

<Import
  Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props"
  Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props')" />

<Import
  Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets"
  Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />

移行時は、いきなり削除して終わりにするのではなく、次の順で確認してください。

作業目的
.csprojをバックアップまたはGitで差分管理する失敗時に戻せるようにする
古いTypeScript SDK関連のImportを確認するNuGetとの重複を避ける
Microsoft.TypeScript.MSBuildを追加するMSBuild統合をNuGetに寄せる
dotnet buildを実行するVisual Studio依存ではないビルドを確認する
出力先のJSを確認する移行後も成果物が変わらないか見る

よくある失敗と対処法

症状主な原因対処法
.jsファイルが生成されないincludeが実ファイルの場所と合っていないscripts/**/*など入力元フォルダーを見直す
出力先に余計な階層が作られるrootDirが未指定、または入力元が分散しているrootDirを./scriptsなどに固定する
wwwroot配下のファイルまで処理されるexcludeにwwwrootがないexcludeへwwwrootを追加する
デバッグでTypeScriptの行に対応しないsourceMapが無効、または.js.mapが配布されていないsourceMap: trueにし、出力ファイルを確認する
CIでは失敗するが開発PCでは成功するVisual Studio同梱Node.jsに依存しているビルドエージェントにNode.jsを用意し、パスを明確にする
npmとNuGetの両方が混在しているプロジェクト種別で使い分けていないASP.NET CoreはNuGet、JSPSや.esprojはnpmに整理する
古いプロジェクトでビルドが不安定TypeScript関連Importが重複している.csproj内の古いImportを確認・削除する

特に注意したいのは、npmとNuGetの混在です。フロントエンド単体プロジェクトの感覚でASP.NET Core側にもnpmのTypeScriptだけを入れると、Visual Studio上では編集できても、dotnet buildやdotnet publishで期待どおりにコンパイルされないことがあります。逆に、JSPSや.esprojにNuGetを入れても、プロジェクトシステムの考え方と合わないため、npmベースに寄せた方が自然です。

既存プロジェクトを見直すチェックリスト

2026年4月更新をきっかけに、既存のVisual Studioプロジェクトでは次の順に点検すると効率的です。

対象チェック内容判断基準
プロジェクト種別ASP.NET Coreか、JSPS / .esprojかASP.NET CoreならNuGet、JSPSならnpm
パッケージMicrosoft.TypeScript.MSBuildが入っているかバージョンがチーム方針と一致している
.csproj古いTypeScript SDK importが残っていないかNuGetと重複していない
tsconfig.jsonrootDir、outDir、include、excludeが明確か入力と出力が分離されている
ビルドdotnet buildでJSが生成されるかVisual Studioなしでも再現できる
Publish配布成果物にJSが含まれるか本番環境で404にならない
デバッグSource Mapが生成されるか開発時にTypeScript側を追える
CI/CDNode.jsとNuGet復元の手順が明確かクリーン環境で成功する

このチェックリストで問題が見つかったら、まずはプロジェクト種別の整理から始めてください。NuGetかnpmかの選択を間違えたままtsconfig.jsonだけ調整しても、ビルドの再現性は改善しにくいからです。

次に取るべき行動

Visual StudioでTypeScriptを扱う開発者は、まず自分のプロジェクトがASP.NET Coreなのか、JSPS / .esprojなのかを確認してください。ASP.NET Coreであれば、Microsoft.TypeScript.MSBuildをNuGetで管理し、tsconfig.jsonのrootDirとoutDirを明示し、dotnet buildとdotnet publishで成果物を確認するのが最短ルートです。

DevOps engineersやplatform teamsは、個々の開発者環境ではなく、CI/CD上でTypeScriptコンパイルが再現できるかを基準に見直しましょう。パッケージバージョン、Node.js、生成JSの扱い、Source Mapの出力方針をリポジトリ単位で明文化すれば、Visual Studioの更新や開発者PCの差によるトラブルを減らせます。

2026年4月更新は、破壊的変更を知らせるものというより、Visual StudioにおけるTypeScriptビルドを「SDK依存」から「プロジェクトごとのNuGet/npm管理」へ整理する流れを再確認する材料です。今すぐ行うべきことは、既存プロジェクトのパッケージ、tsconfig.json、CIの出力確認を点検し、ASP.NET CoreではNuGet/MSBuildで一貫してビルドできる状態に整えることです。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次