Node v22におけるJSONインポート時のassertエラー対処法
問題の説明
Node.js v22でJSONファイルをインポートする際、以下の構文を使用しているとエラーが発生します:
js
import config from "./some-config-file.json" assert { type: "json" };
エラーメッセージ:
none
SyntaxError: Unexpected identifier 'assert'
このエラーは、従来Node v21まで有効だったImport Assertions構文がv22で非対応になったことが原因です。Node.jsの仕様変更により、assert
キーワードが突然無効化された状態です。
バージョン互換性の問題点
- ✅ Node v17.1~v21:
assert
構文が有効 - ❌ Node v22以降:
assert
構文が完全に無効化
解決方法
🚀 最新構文への移営(推奨)
Node v18.20以降に対応する場合は、assert
をwith
に置換するだけ:
js
import config from "./some-config-file.json" with { type: "json" };
この変更の背景
ECMAScript標準でImport Attributesが採用され、キーワードがassert
からwith
に変更されました。機能そのものは同一(type: "json"
の処理方法に変化なし)です。
↔️ バージョン互換性が必要な場合
Node v12.2以降で動作するcreateRequire
を使用する方法:
js
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const config = require("./some-config-file.json");
メリット:
- 広範なバージョンサポート(v12.2〜最新版)
- 自動キャッシング機能付き
import
と同等のモジュール解決
🔄 旧バージョン対応(fsモジュール使用)
どうしても古い環境に対応する必要がある場合の手法:
js
import fs from 'node:fs';
// ファイルパスを動的に解決
const configPath = new URL('./some-config-file.json', import.meta.url);
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
注意点
この方法では:
- キャッシングが行われない(都度ファイル読み込み)
- ファイル変更時に再読み込みが必要
- 相対パス解決が手動になる
各手法の比較表
手法 | 対応Nodeバージョン | キャッシング | コードの簡潔さ |
---|---|---|---|
with 属性 | v18.20~ | ✅ | ★★★★★ |
createRequire | v12.2~ | ✅ | ★★★★☆ |
fs.readFileSync | 全バージョン | ❌ | ★★☆☆☆ |
最終推奨アプローチ
- 対象環境がv18.20以降のみ →
import ... with { type: "json" }
を使用 - 幅広いバージョンサポートが必要 →
createRequire
を採用 - 極端に古い環境対応が必須 →
fs
モジュール+手動パース
構文変更の背景を理解しつつ、プロジェクトの対象環境に応じて最適なJSON読み込み方法を選択してください。特にライブラリ開発者やマルチバージョン対応が必要な場合は、createRequire
による手法が堅牢性と互換性のバランスに優れています。