Skip to content

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以降に対応する場合は、assertwithに置換するだけ:

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'));

注意点

この方法では:

  1. キャッシングが行われない(都度ファイル読み込み)
  2. ファイル変更時に再読み込みが必要
  3. 相対パス解決が手動になる

各手法の比較表

手法対応Nodeバージョンキャッシングコードの簡潔さ
with属性v18.20~★★★★★
createRequirev12.2~★★★★☆
fs.readFileSync全バージョン★★☆☆☆

最終推奨アプローチ

  1. 対象環境がv18.20以降のみimport ... with { type: "json" } を使用
  2. 幅広いバージョンサポートが必要createRequire を採用
  3. 極端に古い環境対応が必須fsモジュール+手動パース

構文変更の背景を理解しつつ、プロジェクトの対象環境に応じて最適なJSON読み込み方法を選択してください。特にライブラリ開発者やマルチバージョン対応が必要な場合は、createRequireによる手法が堅牢性と互換性のバランスに優れています。