如何在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");

当前回答

使用ES模块导入JSON已于2020年年中作为特性提交给TC39,并且(在此编辑时)处于第3阶段,这是在规范中接受之前的最后一个阶段(详情请参阅https://github.com/tc39/proposal-json-modules)。一旦登陆,你将能够使用它作为:

import someName from "./some/path/to/your/file.json";

其中someename实际上是JSON数据描述的JS对象的变量名。(当然,请注意,这是从JSON源导入JavaScript,而不是“导入JSON”)。

如果您正在使用足够现代的捆绑器(如esbuild或类似的),或者您正在使用足够新的编译器(如babel),那么您已经可以使用此语法而不必担心支持。

或者,如果你拥有JSON文件的所有权,你也可以将你的JSON转换成有效的JS文件,只需要最少的额外代码:

config.js

export default
{
  // my json here...
}

然后……

import config from '../config.js'

不允许导入现有的.json文件,但执行一个工作。

其他回答

正如Azad所说,正确的答案是使用fs. readfilesync()(或任何异步变量,如fs. readfilesync())加载文件。使用callback或fs.promises.readFile使用promises/await,然后使用JSON.parse()解析JSON

const packageJsonRaw = fs.readFileSync('location/to/package.json' ) 
const packageJson = JSON.parse(packageJsonRaw )

Webpack/Babel选项是不实用的,除非你已经在使用它了。

不幸的是,ES6/ES2015不支持通过模块导入语法加载JSON。但是…

有很多方法可以做到这一点。根据您的需要,您可以研究如何在JavaScript(窗口)中读取文件。如果您在浏览器中运行,FileReader可以是一个选项)或使用其他问题中描述的其他加载器(假设您使用的是NodeJS)。

在我看来,最简单的方法可能是将JSON作为JS对象放入ES6模块并导出它。这样,您就可以在需要的地方导入它。

此外,值得注意的是,如果你使用Webpack,导入JSON文件将默认工作(因为Webpack >= v2.0.0)。

import config from '../config.json';

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

使用ES模块导入JSON已于2020年年中作为特性提交给TC39,并且(在此编辑时)处于第3阶段,这是在规范中接受之前的最后一个阶段(详情请参阅https://github.com/tc39/proposal-json-modules)。一旦登陆,你将能够使用它作为:

import someName from "./some/path/to/your/file.json";

其中someename实际上是JSON数据描述的JS对象的变量名。(当然,请注意,这是从JSON源导入JavaScript,而不是“导入JSON”)。

如果您正在使用足够现代的捆绑器(如esbuild或类似的),或者您正在使用足够新的编译器(如babel),那么您已经可以使用此语法而不必担心支持。

或者,如果你拥有JSON文件的所有权,你也可以将你的JSON转换成有效的JS文件,只需要最少的额外代码:

config.js

export default
{
  // my json here...
}

然后……

import config from '../config.js'

不允许导入现有的.json文件,但执行一个工作。

在Node.js中,即使在ES模块中,也可以使用require读取JSON文件。我发现这在读取其他包中的文件时特别有用,因为它利用Node自己的模块解析策略来定位文件。

ES模块中的require必须首先使用createRequire创建。

下面是一个完整的例子:

import { createRequire } from 'module';

const require = createRequire(import.meta.url);
const packageJson = require('typescript/package.json');
console.log(`You have TypeScript version ${packageJson.version} installed.`);

在一个安装了TypeScript的项目中,上面的代码将从package.json中读取并打印TypeScript版本号。