【问题标题】:require() not working in module type nodejs scriptrequire() 在模块类型 nodejs 脚本中不起作用
【发布时间】:2020-04-14 01:06:25
【问题描述】:

在我的 package.json 文件中,我已指定我的 nodejs 应用程序的类型为 module,因为如果我不这样做,我似乎无法使用 @987654324 @ 声明。这就是现在的样子:

{
  "name": "...",
  "version": "1.0.0",
  "description": "....",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "...."
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "lodash": "^4.17.15"
  },
  "type": "module"
}

但如果我将 "type": "module" 添加到我的 package.json 文件中,我将无法再使用 require 语句,因为我收到了 ReferenceError: require is not defined 错误。

如果我从 package.json 中删除 "type": "module" 行,并将我的所有导入重写为要求,则一切正常且没有错误。

我似乎找不到任何迹象,表明 importrequire 不能在同一个脚本中混合或一起使用,是我在这里遗漏了什么,还是有其他错误?我如何解决在同一个脚本中使用这两种语句?

为什么我需要这个,是因为我想 require 一些基于动态路径的配置文件,并且只有在文件存在的情况下,我认为 import 无法做到这一点.

免责声明:我对 nodejs 服务器端编程相当陌生,所以我可能非常错误地处理这种情况,如果是这种情况,请根据 为什么我上面已经提到了。

注意:我从服务器终端运行这个节点脚本,而不是从浏览器。

【问题讨论】:

  • 你检查过这个答案吗? stackoverflow.com/a/10915442/2313097
  • 对不起,我最初错过了关于配置文件的部分。我现在已经更新了我的答案,但我认为您可以通过import() 链接或您已经接受答案的其他内容找到答案。 :-)

标签: javascript node.js node-modules


【解决方案1】:

但如果我将"type": "module" 添加到我的package.json 文件中,我将无法再使用require 语句,因为我得到了ReferenceError: require is not defined error

没错。这是非此即彼的。要么您使用 ESM(JavaScript 模块,type = "module")您使用 CJS(CommonJS-like Node.js 原生模块,require)。

但是,如果您使用的是type="module"

  1. 您仍然可以使用 CJS 模块,只需通过 import 而不是 require 导入它们(或通过 import() [动态导入] 如果需要)。查看详情herehere

  2. 您可以使用createRequire 来有效地获得可以在ESM 模块中使用的require 函数,这使我们...

我为什么需要这个,是因为我想require 一些基于动态路径的配置文件,并且只有在文件存在的情况下,我认为import 无法做到这一点。

没错。您必须使用 createRequire 代替(或 readFileJSON.parse),更多 here

createRequire版本:

import { createRequire } from "module";
const require = createRequire(import.meta.url);
const yourData = require("./your.json");

【讨论】:

  • 好的,这似乎解决了我的问题,只是一个快速跟进问题。看来,该导入不想让我导入纯 JSON 文件(使用 require 它有效)。我应该将我的配置文件包装为 javascript 文件并导出配置对象,还是有办法让导入与 JSON 文件一起工作?划掉这个,你已经回答了我的问题:)
  • @AdamBaranyai - 我有吗?好的。 :-) 我还刚刚添加了指向createRequire 的链接,这可能对您的配置文件有用。
  • 好吧,部分:) 我坚持我用readFile 击中了金牌,但后来​​我明白它依赖于fs 模块。:) 有什么办法可以导入@987654349 @ 文件,不使用任何其他模块或插件来完成这项工作?:) 使用纯 import 语句?:) 我还没有查看 createRequire,所以也许我会在那里找到一个答案,但无论如何,我还是问:)
  • @AdamBaranyai - 你不能import JSON ,但这是标准化的,它会发生; details。在那之前,是的,createRequire 就是你要做的,基本上就是他们所展示的 here:1. import createRequire 来自 'module'。 2. 使用createRequire 传入import.meta.url 创建require 函数。 3. 使用 require 函数导入 JSON。我在答案中添加了一个示例。
【解决方案2】:

通常您需要 Babel 转译使用 ES 模块的 Node.js 代码。

但如果你不想使用 Babel:ES Modules 是最新 Node.js 的实验性功能。

你需要三样东西:

  1. 最新的 Node.js
  2. 在 package.json 中添加 "type": "module"
  3. 运行node.js时添加实验标志node --experimental-modules app.js

【讨论】:

  • 在 Node.js 上使用模块时不需要 Babel。
  • 正如我所说的 ES 模块是实验性功能:nodejs.org/api/esm.html#esm_ecmascript_modules
  • 虽然它们确实被标记为实验性的,但 Babel 没有必要在 Node.js 上使用 ESM。在 v13 中,他们甚至不再支持旗帜。实际上,我有点惊讶文档仍然说是实验性的。这可能与正在进行的提高互操作性的工作有关,但是 CJS 模块的 ESM 导入工作得很好,所以...
猜你喜欢
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 2019-06-03
  • 1970-01-01
相关资源
最近更新 更多