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
と書かずに済むくらいの感覚で、then
とJSON.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になるだろう。