首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Node中导入JSON?

如何在Node中导入JSON?
EN

Stack Overflow用户
提问于 2021-03-20 20:51:57
回答 3查看 4.7K关注 0票数 3

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

我试过用require

代码语言:javascript
运行
复制
const jsonfile = require("./packages.json");

console.log({ jsonfile });

它抛出错误:

代码语言:javascript
运行
复制
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)

这个错误意味着,就像它在浏览器中运行一样,在没有require的地方,我发现了具有类似消息的an answer

我和import试过

代码语言:javascript
运行
复制
import * as jsonfile from './packages.json';

console.log({ jsonfile });
代码语言:javascript
运行
复制
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'
}

我又试了些什么?

filename

  • filename周围的
  • 单引号和双引号,并带有扩展和without.
  • with标志--experimental-json-modules
  • adding "type":"module 13 package.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变量的惯用方法。这里怎么了?我该怎么进口呢?

我使用Node 12.21.0

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-20 20:59:59

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

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

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

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

代码语言:javascript
运行
复制
node --experimental-json-modules yourfile.js # can import JSON here

在您的ESM代码中创建require函数

您还可以始终回到CommonJS模块并创建自己的require

代码语言:javascript
运行
复制
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
require('./package.json'); // now works

手动JSON.parse文件

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

代码语言:javascript
运行
复制
# const fs = require('fs');
import * as fs from 'fs';
const result = JSON.parse(fs.readFileSync('./package.json'));
票数 8
EN

Stack Overflow用户

发布于 2021-07-20 22:14:24

您希望导入package.json,但是在代码中您尝试导入packages.json (有一个错误)。

注意,当您使用ESM (import ... from ...语法)时,您不能直接导入.json文件,并且不需要定义.json文件(在nodejs上),而在CJS中,您可以使用require(...)语法加载json文件(参见https://nodejs.org/api/esm.html#esm_no_json_module_loading)。

另外,请注意,您可以创建一个导入JSON文件并导出其内容的CJS文件,以便以后可以从ESM文件导入它。

pkg.cjs (中国)

代码语言:javascript
运行
复制
const pkg = require('./package.json');
module.exports = pkg;

index.mjs (ESM)

代码语言:javascript
运行
复制
import pkg from './pkg.cjs';
console.info(`Starting ${pkg.name} v${pkg.version}`);
票数 2
EN

Stack Overflow用户

发布于 2021-03-20 21:00:53

导入语法应该总是有效的,但在这种情况下,您的回报是错误的。尝试从‘./pacages.json’导入jsonfile;在这种情况下你不需要*

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66726365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档