如何在ECMAScript 6中访问JSON文件?
以下选项无效:
import config from '../config.json'
如果我试图导入一个JavaScript文件,这可以正常工作。
https://www.stefanjudis.com/snippets/how-to-import-json-files-in-es-modules-node-js/
ES模块在Node.js领域仍然相当新(它们从Node 14开始就很稳定)。模块带有内置的模块系统,以及顶级等待等特性。
我读了Pawel Grzybek写的一篇关于ES模块的文章,了解到现在不能在ES模块中导入JSON文件。
import info from `./package.json` assert { type: `json` };
const { default: info } = await import("./package.json", {
assert: {
type: "json",
},
});
这真的很糟糕,因为我非常习惯在Node.js中执行诸如const data = require('./some-file.json')之类的require调用。
但是现在你能在Node.js中使用导入断言吗?
在撰写本文时,当前的Node.js LTS (v18.12)仍然将导入断言标记为实验性。
这篇文章解释了在ES模块中处理JSON的方法,如果你还不想使用实验特性的话。
选项1:自己读取和解析JSON文件
Node.js文档建议使用fs模块,自己完成读取文件和解析的工作。
import { readFile } from 'fs/promises';
const json = JSON.parse(
await readFile(
new URL('./some-file.json', import.meta.url)
)
);
选项2:利用CommonJS的require函数来加载JSON文件
文档还说明了可以使用createRequire加载JSON文件。这种方法是Pawel在他的博客文章中建议的方法。
createRequire允许你构造一个CommonJS require函数来使用典型的CommonJS特性,比如在Node.js EcmaScript模块中读取JSON。
import { createRequire } from "module";
const require = createRequire(import.meta.url);
const data = require("./data.json");