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

当前回答

正如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选项是不实用的,除非你已经在使用它了。

其他回答

正如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选项是不实用的,除非你已经在使用它了。

有点晚了,但我只是在尝试为我的web应用程序提供分析时遇到了同样的问题,涉及基于包发送应用程序版本。json版本。

配置如下:React + Redux, Webpack 3.5.6

自从Webpack 2+以来,json加载器就没怎么做了,所以在摆弄了一番之后,我最终删除了它。

对我来说有效的解决方案就是简单地使用fetch。 虽然这很可能会强制执行一些代码更改以适应异步方法,但它工作得很好,特别是考虑到fetch将动态提供json解码的事实。

就是这样:

  fetch('../../package.json')
  .then(resp => resp.json())
  .then((packageJson) => {
    console.log(packageJson.version);
  });

请记住,既然我们在谈论包装。这个文件通常不会捆绑在你的产品版本中(甚至在开发版本中),所以你在使用fetch时必须使用CopyWebpackPlugin来访问它。

确保type属性被设置为module,因为我们正在使用ES6 Modules语法。

下面是我们如何在index.js文件中导入JSON文件。

import myJson from './example.json' assert {type: 'json'};

从"./resource.json "导入数据 可以在Chrome 91中实现。 现在支持JSON模块。这允许开发人员静态地导入JSON,而不是依赖于fetch()函数动态地检索它。

https://www.stefanjudis.com/snippets/how-to-import-json-files-in-es-modules/

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