我应该如何在 Node 中导入 JSON?

w.k*_*w.k 7 javascript json node.js

我想导入package.jsontest.js,两个文件都在同一目录中。

我尝试过require

const jsonfile = require("./packages.json");

console.log({ jsonfile });
Run Code Online (Sandbox Code Playgroud)

它抛出错误:

file:///home/.../test.js:1
const jsonfile = require("./packages.json");
                 ^
ReferenceError: require is not defined
    at file:///home/.../test.js:1:18
    at ModuleJob.run (internal/modules/esm/module_job.js:145:37)
    at async Loader.import (internal/modules/esm/loader.js:182:24)
    at async Object.loadESM (internal/process/esm_loader.js:68:5)

Run Code Online (Sandbox Code Playgroud)

这个错误意味着,就像它在浏览器中运行一样,其中 no require,我找到了带有类似消息的答案。

我尝试过import

import * as jsonfile from './packages.json';

console.log({ jsonfile });
Run Code Online (Sandbox Code Playgroud)
internal/process/esm_loader.js:74
    internalBinding('errors').triggerUncaughtException(
                              ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/.../packages.json' imported from /home/.../test.js
    at finalizeResolution (internal/modules/esm/resolve.js:271:11)
    at moduleResolve (internal/modules/esm/resolve.js:694:10)
    at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:784:11)
    at Loader.resolve (internal/modules/esm/loader.js:100:40)
    at Loader.getModuleJob (internal/modules/esm/loader.js:246:28)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:47:40)
    at link (internal/modules/esm/module_job.js:46:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}
Run Code Online (Sandbox Code Playgroud)

我还尝试过什么?

  • 文件名周围的单引号和双引号
  • 带扩展名和不带扩展名的文件名。
  • 带有标志--experimental-json-modules
  • 添加"type":"modulepackage.json(但这适用于 Node >= 13,但如果没有它,我会收到警告(node:7170) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.,然后还会出现错误SyntaxError: Cannot use import statement outside a module

我什至发现了将 JSON 文件加载为常规文本文件并将其解析为数据结构的建议,但这似乎是最后的手段......

这似乎是一个微不足道的任务,但我还没有找到如何将 JSON 数据导入 Javascript 变量的惯用方法。这里有什么问题吗?我应该如何导入它?

我使用节点12.21.0

Ben*_*aum 19

您在 ESM 模式下使用 Node.js,默认情况下 ESM 当前不导入 JSON 模块。您可以:

  1. 打开 JSON 模块导入(通过传递 CLI 标志)或
  2. 在您的 ESM 代码中创建一个require函数并使用该函数 OR
  3. JSON.手动解析文件

打开 JSON 模块导入(通过传递 CLI 标志)

您可以通过传递--experimental-json-modules标志来做到这一点。

node --experimental-json-modules yourfile.js # can import JSON here
Run Code Online (Sandbox Code Playgroud)

require在 ESM 代码中创建一个函数

您还可以随时依靠 CommonJS 模块并创建require您自己的模块:

import { createRequire } from 'module';
const require = createRequire(import.meta.url);
require('./package.json'); // now works
Run Code Online (Sandbox Code Playgroud)

JSON.手动解析文件

您始终可以使用常规文件系统方法读取 JSON 文件:

# const fs = require('fs');
import * as fs from 'fs';
const result = JSON.parse(fs.readFileSync('./package.json'));
Run Code Online (Sandbox Code Playgroud)