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による手法が堅牢性と互換性のバランスに優れています。