Node 14開始,開始支援ES module語法。
JSON模組工作在Node.js版本>=17.1
中,也可以使用--experimental-json-modules
標誌啟用Experimental JSON
模組
/*
Experimental JSON import in Node.js
$ node index.mjs
*/
// An import assertion in a static import
import info from `./package.json` assert { type: `json` };
// An import assertion in a dynamic import
const { default: info } = await import("./package.json", {
assert: {
type: "json",
},
});
我已經習慣在node.js使用require
匯入json,例如const data = require('./some-file.json')
,上面的寫法無疑讓人感到沮喪。
如果你還不想使用這個實驗性的功能,這篇文章解釋了在ES模組中處理JSON的方法。
1. 手動讀取和解析JSON檔案
其實就是使用fs
模組讀取檔案,然後再用JSON.parse
解析。
import { readFile } from 'fs/promises';
const json = JSON.parse(
await readFile(
new URL('./some-file.json', import.meta.url)
)
);
2. 利用CommonJS的require函式來載入JSON檔案(推薦)
import { createRequire } from "module";
const require = createRequire(import.meta.url);
const data = require("./data.json");
createRequire
允許你構造一個CommonJS require函式來使用CommonJS的典型功能,例如在Node.js的EcmaScript模組中讀取JSON。
總結
import assertions
無疑是未來ES modules匯入json的最佳選擇,但可惜它目前依然是實驗性功能。至於介紹的2種替代方案,其實都不是最佳方案,但不影響你解決問題。