`import assert { type: 'json' }` が Node.js 22 で動かない・SyntaxError が出る時の原因と対処法【import with への移行・JSON モジュール】
公開日:2026-11-01/カテゴリ:Node.js・JavaScript・ESM・フロントエンド/AnchorUp 技術ブログ
import assert { type: 'json' } が SyntaxError になる症状
Node.js 22 以降で次のようなコードを実行すると、パーサーレベルの SyntaxError が発生してプロセスが起動直後に落ちます。
// ❌ Node.js 22 以降では動かない
import config from './config.json' assert { type: 'json' };
import data from './data.json' assert { type: 'json' };
エラーは実行時ではなくパース時に発生するため、ファイルの先頭付近に書いてあるだけでモジュール全体が読み込まれません。
典型的な症状:
- Node.js 18 や 20 では動いていたが、Node.js 22 に上げた途端に落ちる
SyntaxErrorが出てスタックトレースにassertが含まれる- CI のみ Node.js 22 を使っていて、ローカル(Node.js 20)では通っていた
なぜ import assert が使えなくなったのか?
結論: Node.js 22.0.0(2024-04-24 リリース)で import assertions のサポートが完全に削除されたからです。
TC39 のプロポーザルが「import assertions」から「import attributes」に改訂され、構文も assert { } から with { } に変わりました。Node.js はこの変更に追従し、古い assert 構文を v22.0.0 でドロップしています(PR #52104、コミット [25c79f3331]、作者 Nicolò Ribaudo)。
バージョン別の対応状況早見表
| Node.js バージョン | assert 構文 | with 構文 | JSON modules の状態 |
|---|---|---|---|
| v16.14.0 / v17.1.0 | ✅ 実験的サポート | ❌ 未サポート | 実験的 |
| v18.20.0 / v20.10.0 / v21.0.0 | ⚠️ 非推奨(警告) | ✅ 実験的サポート | 実験的 |
| v22.0.0 〜 | ❌ 削除(SyntaxError) | ✅ サポート | 実験的 |
| v20.18.3 / v22.12.0 / v23.1.0 以降 | ❌ 削除済み | ✅ 正式機能 | 正式機能 |
Node.js 22.12.0(LTS 系列のメンテナンス版)以降では、with { type: 'json' } による JSON インポートは実験的フラグなしで使えます。
対処法:import with 構文に書き換える
静的インポートの場合は assert を with に変えるだけです。
// ❌ 旧 : import assertions (Node.js 22 以降不可)
import config from './config.json' assert { type: 'json' };
// ✅ 新 : import attributes (Node.js 21+ / 安定版は v22.12.0+)
import config from './config.json' with { type: 'json' };
TypeScript を使っている場合も同じ書き換えで動きます。
// TypeScript でも同じ with 構文を使う
import packageConfig from './package.json' with { type: 'json' };
Node.js 公式ドキュメントに示されている標準的な静的インポートの形式は次のとおりです。
import fooData from './foo.json' with { type: 'json' };
with { type: 'json' } の指定は省略できません。JSON ファイルをインポートする際は必須です。
動的インポートの場合
await import() を使った動的インポートでも書き換えが必要です。
// ❌ 旧 : import assertions (動的インポート版)
const { default: data } = await import('./data.json', { assert: { type: 'json' } });
// ✅ 新 : import attributes (動的インポート版)
const { default: data } = await import('./data.json', { with: { type: 'json' } });
Node.js 公式ドキュメントのサンプルは次の形式です。
const { default: barData } =
await import('./bar.json', { with: { type: 'json' } });
動的インポートで assert を使っていた場合も同様に with に変更してください。
プロジェクト全体の影響範囲を確認する方法
既存プロジェクトで assert を使っているファイルを一括確認するには次のコマンドを使います。
# import assert を使っているファイルを検索(ESM ファイル対象)
grep -rn "import.*assert.*{" --include="*.mjs" --include="*.js" --include="*.ts" .
# 動的 import の assert オプションも検索
grep -rn "import(.*assert.*{" --include="*.mjs" --include="*.js" --include="*.ts" .
見つかったファイルは assert を with に手動または sed で一括置換します。ただし JavaScript の assert() 関数や Node.js の node:assert モジュールとは無関係なので、インポート文以外には影響しません。
# import 文の assert { を with { に一括置換する例(sed, macOS は -i '' が必要)
sed -i "s/import \(.*\) assert { type:/import \1 with { type:/g" src/**/*.ts
実際に修正する前に grep 結果を確認し、置換対象を絞り込んでから実行することをおすすめします。
CommonJS の require() は影響を受けない
import assertions / import attributes はすべて ESM(ES Modules)固有の機能です。CommonJS で JSON を読む場合は以前から require() を使っており、これは Node.js 22 でも変わりません。
// CommonJS では require() で JSON を読む(影響なし)
const config = require('./config.json');
// または Node.js 22+ の ESM で with { type: 'json' } を使う
import config from './config.json' with { type: 'json' };
プロジェクトに "type": "module" が ない場合(CommonJS が既定)は、通常の require() が使えるため import assertions の影響を受けません。影響を受けるのは "type": "module" を設定した ESM プロジェクト、または .mjs ファイルです。
新しい import attributes のエラーコード
with 構文に移行した後も、次のようなエラーが発生することがあります。
| エラーコード | 意味 | 発生バージョン |
|---|---|---|
ERR_IMPORT_ATTRIBUTE_MISSING |
with { type: 'json' } が書かれていない JSON インポート |
v21.1.0 以降 |
ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE |
指定した type がファイルの実際の種類と合わない |
v21.1.0 以降 |
ERR_IMPORT_ATTRIBUTE_UNSUPPORTED |
その Node.js バージョンで未サポートの attribute を指定した | v21.0.0 / v20.10.0 / v18.19.0 以降 |
一方、旧来の ERR_IMPORT_ASSERTION_TYPE_FAILED・ERR_IMPORT_ASSERTION_TYPE_MISSING・ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED は v21.1.0 で削除されており、Node.js の公式エラーリストでも「Legacy Node.js error codes(Stability: 0 - Deprecated)」に分類されています。
まとめ
import assert { type: 'json' } が Node.js 22 で動かなくなる原因は、v22.0.0 で import assertions のサポートが完全に削除されたからです。
対応は単純で、assert を with に変えるだけです。
// 直す前
import data from './data.json' assert { type: 'json' };
// 直した後
import data from './data.json' with { type: 'json' };
対応チェックリスト:
- Node.js のバージョン確認: Node.js 22 以降を使っているなら即時修正が必要
- 影響範囲:
"type": "module"の ESM プロジェクトと.mjsファイルのみ。CommonJS のrequire()は無関係 - 動的インポート:
{ assert: { type: 'json' } }も{ with: { type: 'json' } }に変更 - 安定版: Node.js v22.12.0 / v23.1.0 以降では
with { type: 'json' }が実験的フラグなしで使える
Node.js の ESM 周りでは他に __dirname が使えない問題や ERR_REQUIRE_ESM など似たような落とし穴があります。