JSONファイルを読み込むのにfsモジュールを使っているが、Dynamic Importでも書けるようなので置き換えてみている、いや、いた。実装が遅れていたFirefoxも、2025年4月末にリリースされた138でサポートしたので、試してみる気になった。短くならない上に、可読性も良くないことがわかる。import宣言ならJSONファイルを読み込む価値はあるが、かなり特別な理由がない限りDynamic ImportをJSONファイルの読み込みに使うことはやめた方が良さそうだ。

import assert from "node:assert";
import fs from "node:fs/promises";

const obj1 = await fs.readFile("./test.json").then(JSON.parse);
const { default: obj2 } = await import("./test.json", {
  with: { type: "json" }
});
assert.deepStrictEqual(obj1, obj2);

fsモジュールではBufferとして読んで、JSON.parse()に流す。1行で無理やり書いた感がすごい。これを書き換えたい動機としては、utf8と書かずに済むくらいの感覚で、thenJSON.parse()を書きたくないということに尽きる。fs-extraパッケージを使う気はないが、あれくらい短くスパッと書きたい。

Dynamic Importだと、import()の第二引数でimport宣言と同じwithキーを使ってJSONファイルを読み込むことを教えれば良い。これだけだったら使いやすそうに思えるが、既定でdefaultキーへJSONファイルの内容が展開されるので、分解文法を使って代入しないと使いづらい。そしてdefaultは予約語のため名前も変える必要がある。そんなこんなでなかなか長い。

長いだけならまだしも、{}が3組もあってかなり読みづらい。Dynamic Importの方が速そうな気はするが、それでも使う気は起きない。またうっかりドットで始まらない相対パスを投げてしまうと、Bare Specifierとみなされて死ぬことも致命的な気配がある。上記例だとtest.jsonと書いてしまうと、 Node.jsではtest.jsonという名前のパッケージを探しに行き、ERR_MODULE_NOT_FOUNDになるだろう。