{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/next-js-no-moduleresolution-erawokitukakeni-tsconfig-wojian-zhi-sitemita/",
    "result": {"data":{"ghostPost":{"id":"Ghost__Post__6a03c23f781e37000184e884","title":"Next.js の moduleResolution を TypeScript 7.0 目線で見直す","slug":"next-js-no-moduleresolution-erawokitukakeni-tsconfig-wojian-zhi-sitemita","featured":false,"feature_image":null,"excerpt":"はじめに\n普段開発している Next.js プロジェクトを VS Code で確認していたところ、tsconfig.json の moduleResolution:\n\"node\" に関するエラーが表示されていました。\n\nmoduleResolution は、TypeScript が import \nの参照先をどのように解決するかを決める設定です。普段の開発ではあまり意識しない項目ですが、Node.js、Next.js、バンドラー、TypeScript\nのバージョンによって適切な値が変わります。\n\n今回エラーになっていた moduleResolution: \"node\" は、現在の TypeScript では node10 \n相当の古い解決方式として扱われます。\n\nTypeScript 7.0 では、TypeScript 6.0\nで非推奨となった一部の設定がハードエラーとして扱われるため、事前に見直しておく必要があります。その中に moduleResolution: \"node\" \nの解決方式も含まれています。\n\nこの記事では、VS Code 上で表示された moduleResoluti","custom_excerpt":null,"visibility":"public","created_at_pretty":"13 May, 2026","published_at_pretty":"27 May, 2026","updated_at_pretty":"27 May, 2026","created_at":"2026-05-13T09:13:51.000+09:00","published_at":"2026-05-27T10:59:09.000+09:00","updated_at":"2026-05-27T10:59:09.000+09:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"name":"Akira Yasuzawa","slug":"akira","bio":null,"profile_image":null,"twitter":null,"facebook":null,"website":null}],"primary_author":{"name":"Akira Yasuzawa","slug":"akira","bio":null,"profile_image":null,"twitter":null,"facebook":null,"website":null},"primary_tag":null,"tags":[],"plaintext":"はじめに\n普段開発している Next.js プロジェクトを VS Code で確認していたところ、tsconfig.json の moduleResolution:\n\"node\" に関するエラーが表示されていました。\n\nmoduleResolution は、TypeScript が import \nの参照先をどのように解決するかを決める設定です。普段の開発ではあまり意識しない項目ですが、Node.js、Next.js、バンドラー、TypeScript\nのバージョンによって適切な値が変わります。\n\n今回エラーになっていた moduleResolution: \"node\" は、現在の TypeScript では node10 \n相当の古い解決方式として扱われます。\n\nTypeScript 7.0 では、TypeScript 6.0\nで非推奨となった一部の設定がハードエラーとして扱われるため、事前に見直しておく必要があります。その中に moduleResolution: \"node\" \nの解決方式も含まれています。\n\nこの記事では、VS Code 上で表示された moduleResolution: \"node\" のエラーをきっかけに、Next.js アプリケーションの \ntsconfig.json をどのように見直すかを整理します。\n\n今回確認した tsconfig.json\n今回確認した tsconfig.json は以下です。\n\n{\n  \"compilerOptions\": {\n    \"allowJs\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"preserveConstEnums\": true,\n    \"removeComments\": false,\n    \"sourceMap\": true,\n    \"strict\": false,\n    \"strictPropertyInitialization\": false,\n    \"strictNullChecks\": false,\n    \"target\": \"esnext\",\n    \"forceConsistentCasingInFileNames\": true,\n    \"esModuleInterop\": true,\n    \"isolatedModules\": true,\n    \"resolveJsonModule\": true,\n    \"noFallthroughCasesInSwitch\": true\n  }\n}\n\nこの中で今回の主な確認対象は、以下の設定です。\n\n\"moduleResolution\": \"node\"\n\nmoduleResolution とは何か\nmoduleResolution は、TypeScript が import の参照先をどのように探すかを決める設定です。\n\nたとえば、次のような import があったとします。\n\nimport { Button } from \"./Button\";\nimport dayjs from \"dayjs\";\n\nこのとき TypeScript は、./Button や dayjs がどのファイル、またはどの型定義を指しているのかを解決する必要があります。\n\n具体的には、次のようなものを探します。\n\n * .ts / .tsx / .d.ts などのファイル\n * node_modules 配下のパッケージ\n * package.json の types / exports / imports\n * index.ts のような省略されたファイル\n * paths で定義されたエイリアス\n\nこの探し方のルールを決めるのが moduleResolution です。\n\n注意したいのは、moduleResolution は TypeScript の型チェック時の解決ルールであり、実際にブラウザや Node.js\nがコードを実行するときの解決そのものではない、という点です。\n\nNext.js のような環境では、実際のビルドや実行時の解決には Next.js やバンドラー側の仕組みも関わります。そのため、TypeScript\n側の解決ルールと実際のビルド環境の解決ルールが大きくずれていると、型チェックでは通るのにビルドで失敗する、またはその逆のような問題が起きることがあります。\n\nmoduleResolution: \"node\" はなぜ見直し対象なのか\n現在指定している moduleResolution: \"node\" は、現在の TypeScript では node10 相当の古い解決方式で、主に\nCommonJS の require を前提にした時代の Node.js 向け解決方式です。\n\n一方で、現在の Node.js では ESM と CommonJS が併存しており、package.json の exports や imports \nなども考慮する必要があります。TypeScript の公式ドキュメント\n[https://www.typescriptlang.org/tsconfig/#moduleResolution]でも、現代の Node.js 向けには \nnode16 や nodenext、バンドラー向けには bundler が選択肢として説明されています。\n\nTypeScript 7.0 を見据えると、moduleResolution: \"node\" \nのままにしておくのではなく、プロジェクトの実行環境に合わた値へ移行する必要があります。\n\nNext.js アプリ本体では bundler が候補になる\nNext.js のアプリケーションコードは、TypeScript の出力を Node.js がそのまま直接実行するというより、Next.js\nのビルドパイプラインを通して処理されます。\n\nNext.js は TypeScript を組み込みでサポートしており、next dev や next build の実行時に Next.js\n側の仕組みも関わります。公式ドキュメントでも、Next.js は TypeScript を組み込みでサポートし、推奨される設定を含む tsconfig.json \nを扱うことが説明されています。\n\nそのため、Next.js のアプリケーション本体では、moduleResolution: \"bundler\" が候補になります。\n\n今回のプロジェクトでも、対象は Next.js のアプリケーションコードです。そのため、moduleResolution: \"node\" から \nmoduleResolution: \"bundler\" へ変更する方針にしました。\n\n修正後の tsconfig.json\n{\n  \"compilerOptions\": {\n    \"allowJs\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"preserveConstEnums\": true,\n    \"removeComments\": false,\n    \"sourceMap\": true,\n    \"strict\": false,\n    \"strictPropertyInitialization\": false,\n    \"strictNullChecks\": false,\n    \"target\": \"esnext\",\n    \"forceConsistentCasingInFileNames\": true,\n    \"esModuleInterop\": true,\n    \"isolatedModules\": true,\n    \"resolveJsonModule\": true,\n    \"noFallthroughCasesInSwitch\": true\n  }\n}\n\n変更したのは、次の1行です。\n\n- \"moduleResolution\": \"node\",\n+ \"moduleResolution\": \"bundler\",\n\n今回は moduleResolution の見直しを主目的にしているため、他の設定はそのままにしています。\n\n他にも見直したい設定\n今回の主題は moduleResolution ですが、TypeScript 6.0 / 7.0 への移行を見据えると、他にも見直したい設定があります。\n\nたとえば、今回の tsconfig.json では以下の設定が気になります。\n\n\"strict\": false,\n\"strictNullChecks\": false,\n\"strictPropertyInitialization\": false\n\nこれらは TypeScript 7.0 で直ちに使えなくなる設定ではありません。\n\nただし、型チェックをかなり緩める設定です。現時点では既存コードへの影響を考慮して false \nのままにしていますが、今後の変更にあわせて段階的に見直していきたいです。\n\nまた、今回の tsconfig.json には含まれていませんが、baseUrl や paths を使っている場合も注意が必要です。特に import\nエイリアスを使っているプロジェクトでは、TypeScript 側の解決と Next.js 側の解決が一致しているかを確認しておく必要があります。\n\n補足: TypeScript 7.0 について\nTypeScript 7.0 では、TypeScript コンパイラや関連ツールの実装が Go ベースのネイティブ実装に移行します。\n\nプレビュー段階では @typescript/native-preview パッケージとして提供されており、tsc の代わりに tsgo \nコマンドで試すことができます。\n\n今回の moduleResolution: \"node\" の見直しは、この TypeScript 7.0 移行の流れとも関係しています。TypeScript\n6.0 では node / node10 が非推奨となり、TypeScript 7.0 ではサポート対象外になる方針が示されているためです。\n\nそのため、今すぐ TypeScript 7.0 へ移行するわけではなくても、既存の tsconfig.json を見直すきっかけになります。\n\nAnnouncing TypeScript 7.0 Beta - TypeScriptToday we are absolutely thrilled to\nannounce the release of TypeScript 7.0 Beta! If you haven’t been following\nTypeScript 7.0’s development, this release is significant in that it is built\non\na completely new foundation. Over the past year, we have been porting the\nexisting TypeScript codebase from …TypeScriptDaniel Rosenwasser\n[https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta]まとめ\n今回は、Next.js プロジェクトで表示された moduleResolution: \"node\" のエラーをきっかけに、tsconfig.json \nを見直しました。\n\nmoduleResolution: \"node\" は、現在では node10 相当の古い解決方式として扱われます。TypeScript 7.0\nを見据える場合は、nodenext または bundler への移行を検討する必要があります。\n\nNext.js のアプリケーションコードは、通常 Next.js のビルドパイプラインを通して処理されます。そのため、今回のプロジェクトでは \nmoduleResolution: \"bundler\" を候補にしました。\n\n一方で、Node.js で直接実行するスクリプトやライブラリ公開用のコードでは、nodenext の方が適している場合があります。\n\nbundler は「Next.js アプリ本体向けの選択肢」として捉え、プロジェクト内のコードの実行環境に応じて使い分けるのがよさそうです。","html":"<h2 id=\"%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\">はじめに</h2><p>普段開発している Next.js プロジェクトを VS Code で確認していたところ、<code>tsconfig.json</code> の <code>moduleResolution: \"node\"</code> に関するエラーが表示されていました。</p><p><code>moduleResolution</code> は、TypeScript が <code>import</code> の参照先をどのように解決するかを決める設定です。普段の開発ではあまり意識しない項目ですが、Node.js、Next.js、バンドラー、TypeScript のバージョンによって適切な値が変わります。</p><p>今回エラーになっていた <code>moduleResolution: \"node\"</code> は、現在の TypeScript では <code>node10</code> 相当の古い解決方式として扱われます。</p><p>TypeScript 7.0 では、TypeScript 6.0 で非推奨となった一部の設定がハードエラーとして扱われるため、事前に見直しておく必要があります。その中に <code>moduleResolution: \"node\"</code> の解決方式も含まれています。</p><p>この記事では、VS Code 上で表示された <code>moduleResolution: \"node\"</code> のエラーをきっかけに、Next.js アプリケーションの <code>tsconfig.json</code> をどのように見直すかを整理します。</p><h3 id=\"%E4%BB%8A%E5%9B%9E%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F-tsconfigjson\">今回確認した tsconfig.json</h3><p>今回確認した <code>tsconfig.json</code> は以下です。</p><pre><code class=\"language-json\">{\n  \"compilerOptions\": {\n    \"allowJs\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"preserveConstEnums\": true,\n    \"removeComments\": false,\n    \"sourceMap\": true,\n    \"strict\": false,\n    \"strictPropertyInitialization\": false,\n    \"strictNullChecks\": false,\n    \"target\": \"esnext\",\n    \"forceConsistentCasingInFileNames\": true,\n    \"esModuleInterop\": true,\n    \"isolatedModules\": true,\n    \"resolveJsonModule\": true,\n    \"noFallthroughCasesInSwitch\": true\n  }\n}</code></pre><p>この中で今回の主な確認対象は、以下の設定です。</p><pre><code class=\"language-json\">\"moduleResolution\": \"node\"</code></pre><h2 id=\"moduleresolution-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B\">moduleResolution とは何か</h2><p><code>moduleResolution</code> は、TypeScript が <code>import</code> の参照先をどのように探すかを決める設定です。</p><p>たとえば、次のような <code>import</code> があったとします。</p><pre><code class=\"language-javascript\">import { Button } from \"./Button\";\nimport dayjs from \"dayjs\";</code></pre><p>このとき TypeScript は、<code>./Button</code> や <code>dayjs</code> がどのファイル、またはどの型定義を指しているのかを解決する必要があります。</p><p>具体的には、次のようなものを探します。</p><ul><li>.ts / .tsx / .d.ts などのファイル</li><li>node_modules 配下のパッケージ</li><li>package.json の types / exports / imports</li><li>index.ts のような省略されたファイル</li><li>paths で定義されたエイリアス</li></ul><p>この探し方のルールを決めるのが <code>moduleResolution</code> です。</p><p>注意したいのは、<code>moduleResolution</code> は TypeScript の型チェック時の解決ルールであり、<strong>実際にブラウザや Node.js がコードを実行するときの解決そのものではない</strong>、という点です。</p><p>Next.js のような環境では、実際のビルドや実行時の解決には Next.js やバンドラー側の仕組みも関わります。そのため、TypeScript 側の解決ルールと実際のビルド環境の解決ルールが大きくずれていると、型チェックでは通るのにビルドで失敗する、またはその逆のような問題が起きることがあります。</p><h3 id=\"moduleresolution-node-%E3%81%AF%E3%81%AA%E3%81%9C%E8%A6%8B%E7%9B%B4%E3%81%97%E5%AF%BE%E8%B1%A1%E3%81%AA%E3%81%AE%E3%81%8B\">moduleResolution: \"node\" はなぜ見直し対象なのか</h3><p>現在指定している <code>moduleResolution: \"node\"</code> は、現在の TypeScript では <code>node10</code> 相当の古い解決方式で、主に CommonJS の <code>require</code> を前提にした時代の Node.js 向け解決方式です。</p><p>一方で、現在の Node.js では ESM と CommonJS が併存しており、<code>package.json</code> の <code>exports</code> や <code>imports</code> なども考慮する必要があります。TypeScript の<a href=\"https://www.typescriptlang.org/tsconfig/#moduleResolution\">公式ドキュメント</a>でも、現代の Node.js 向けには <code>node16</code> や <code>nodenext</code>、バンドラー向けには <code>bundler</code> が選択肢として説明されています。</p><p>TypeScript 7.0 を見据えると、<code>moduleResolution: \"node\"</code> のままにしておくのではなく、プロジェクトの実行環境に合わた値へ移行する必要があります。</p><h3 id=\"nextjs-%E3%82%A2%E3%83%97%E3%83%AA%E6%9C%AC%E4%BD%93%E3%81%A7%E3%81%AF-bundler-%E3%81%8C%E5%80%99%E8%A3%9C%E3%81%AB%E3%81%AA%E3%82%8B\">Next.js アプリ本体では bundler が候補になる</h3><p>Next.js のアプリケーションコードは、TypeScript の出力を Node.js がそのまま直接実行するというより、Next.js のビルドパイプラインを通して処理されます。</p><p>Next.js は TypeScript を組み込みでサポートしており、<code>next dev</code> や <code>next build</code> の実行時に Next.js 側の仕組みも関わります。公式ドキュメントでも、Next.js は TypeScript を組み込みでサポートし、推奨される設定を含む <code>tsconfig.json</code> を扱うことが説明されています。</p><p>そのため、Next.js のアプリケーション本体では、<code>moduleResolution: \"bundler\"</code> が候補になります。</p><p>今回のプロジェクトでも、対象は Next.js のアプリケーションコードです。そのため、<code>moduleResolution: \"node\"</code> から <code>moduleResolution: \"bundler\"</code> へ変更する方針にしました。</p><h3 id=\"%E4%BF%AE%E6%AD%A3%E5%BE%8C%E3%81%AE-tsconfigjson\">修正後の tsconfig.json</h3><pre><code class=\"language-json\">{\n  \"compilerOptions\": {\n    \"allowJs\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"preserveConstEnums\": true,\n    \"removeComments\": false,\n    \"sourceMap\": true,\n    \"strict\": false,\n    \"strictPropertyInitialization\": false,\n    \"strictNullChecks\": false,\n    \"target\": \"esnext\",\n    \"forceConsistentCasingInFileNames\": true,\n    \"esModuleInterop\": true,\n    \"isolatedModules\": true,\n    \"resolveJsonModule\": true,\n    \"noFallthroughCasesInSwitch\": true\n  }\n}</code></pre><p>変更したのは、次の1行です。</p><pre><code class=\"language-diff\">- \"moduleResolution\": \"node\",\n+ \"moduleResolution\": \"bundler\",</code></pre><p>今回は <code>moduleResolution</code> の見直しを主目的にしているため、他の設定はそのままにしています。</p><h2 id=\"%E4%BB%96%E3%81%AB%E3%82%82%E8%A6%8B%E7%9B%B4%E3%81%97%E3%81%9F%E3%81%84%E8%A8%AD%E5%AE%9A\">他にも見直したい設定</h2><p>今回の主題は <code>moduleResolution</code> ですが、TypeScript 6.0 / 7.0 への移行を見据えると、他にも見直したい設定があります。</p><p>たとえば、今回の <code>tsconfig.json</code> では以下の設定が気になります。</p><pre><code class=\"language-json\">\"strict\": false,\n\"strictNullChecks\": false,\n\"strictPropertyInitialization\": false</code></pre><p>これらは TypeScript 7.0 で直ちに使えなくなる設定ではありません。</p><p>ただし、型チェックをかなり緩める設定です。現時点では既存コードへの影響を考慮して <code>false</code> のままにしていますが、今後の変更にあわせて段階的に見直していきたいです。</p><p>また、今回の <code>tsconfig.json</code> には含まれていませんが、<code>baseUrl</code> や <code>paths</code> を使っている場合も注意が必要です。特に import エイリアスを使っているプロジェクトでは、TypeScript 側の解決と Next.js 側の解決が一致しているかを確認しておく必要があります。</p><h3 id=\"%E8%A3%9C%E8%B6%B3-typescript-70-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\">補足: TypeScript 7.0 について</h3><p>TypeScript 7.0 では、TypeScript コンパイラや関連ツールの実装が Go ベースのネイティブ実装に移行します。</p><p>プレビュー段階では <code>@typescript/native-preview</code> パッケージとして提供されており、<code>tsc</code> の代わりに <code>tsgo</code> コマンドで試すことができます。</p><p>今回の <code>moduleResolution: \"node\"</code> の見直しは、この TypeScript 7.0 移行の流れとも関係しています。TypeScript 6.0 では <code>node</code> / <code>node10</code> が非推奨となり、TypeScript 7.0 ではサポート対象外になる方針が示されているためです。</p><p>そのため、今すぐ TypeScript 7.0 へ移行するわけではなくても、既存の <code>tsconfig.json</code> を見直すきっかけになります。</p><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">Announcing TypeScript 7.0 Beta - TypeScript</div><div class=\"kg-bookmark-description\">Today we are absolutely thrilled to announce the release of TypeScript 7.0 Beta! If you haven’t been following TypeScript 7.0’s development, this release is significant in that it is built on a completely new foundation. Over the past year, we have been porting the existing TypeScript codebase from …</div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://devblogs.microsoft.com/typescript/wp-content/uploads/sites/11/2018/10/Microsoft-Favicon.png\"><span class=\"kg-bookmark-author\">TypeScript</span><span class=\"kg-bookmark-publisher\">Daniel Rosenwasser</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://devblogs.microsoft.com/typescript/wp-content/uploads/sites/11/2026/04/ts7-0-beta-4.png\"></div></a></figure><h2 id=\"%E3%81%BE%E3%81%A8%E3%82%81\">まとめ</h2><p>今回は、Next.js プロジェクトで表示された <code>moduleResolution: \"node\"</code> のエラーをきっかけに、<code>tsconfig.json</code> を見直しました。</p><p><code>moduleResolution: \"node\"</code> は、現在では <code>node10</code> 相当の古い解決方式として扱われます。TypeScript 7.0 を見据える場合は、<code>nodenext</code> または <code>bundler</code> への移行を検討する必要があります。</p><p>Next.js のアプリケーションコードは、通常 Next.js のビルドパイプラインを通して処理されます。そのため、今回のプロジェクトでは <code>moduleResolution: \"bundler\"</code> を候補にしました。</p><p>一方で、Node.js で直接実行するスクリプトやライブラリ公開用のコードでは、<code>nodenext</code> の方が適している場合があります。</p><p><code>bundler</code> は「Next.js アプリ本体向けの選択肢」として捉え、プロジェクト内のコードの実行環境に応じて使い分けるのがよさそうです。</p>","url":"https://ghost.tech.anti-pattern.co.jp/next-js-no-moduleresolution-erawokitukakeni-tsconfig-wojian-zhi-sitemita/","canonical_url":null,"uuid":"8b87f6f8-e450-4abf-9fcb-4def27d6774f","page":null,"codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"6a03c23f781e37000184e884","reading_time":4}},"pageContext":{"slug":"next-js-no-moduleresolution-erawokitukakeni-tsconfig-wojian-zhi-sitemita"}},
    "staticQueryHashes": ["176528973","2358152166","2561578252","2731221146","4145280475"]}