【问题标题】:Require function not recognized after upgrade from node 12 to 14从节点 12 升级到 14 后无法识别需求功能
【发布时间】:2020-11-08 05:27:54
【问题描述】:

我使用link 将我的节点版本从 12 升级到 14.5.0(我需要使用 es6 类和语法,我发现节点 14 支持它) 但是当我尝试在更新后运行我的节点 js 应用程序时,它会显示:

[nodemon] 2.0.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js command`

const path = require("path");
             ^

ReferenceError: require is not defined
    at file:///./NodeJsClient/app.js:1:14
    at ModuleJob.run (internal/modules/esm/module_job.js:140:23)
    at async Loader.import (internal/modules/esm/loader.js:162:24)
[nodemon] app crashed - waiting for file changes before starting...

我需要更新 nodemon 或 npm 吗?我该如何解决? 我的 npm 版本是 6.14.5

【问题讨论】:

  • 看起来 node 正在使用 ESM 模块加载器(它加载新类型的模块)并且 require() 未在 ESM 模块中定义。如果问题来自 app.js 并且您正在运行 node app.js 来启动您的应用程序,那么它必须被解释为 ESM 模块,因为您的 package.json 文件中有指令告诉 nodejs 加载您的 main文件作为 ESM 模块。你需要改变它。向我们展示您的 package.json 文件。
  • 而且,仅供参考,您可以在 node v12 中很好地使用 ES6 类和其他 ES6 语法,尽管这与您当前的问题完全无关。
  • 你的 package.json 文件中有"type": "module" 吗?如果是这样,将该行更改为"type": "commonjs"
  • 您可以根据需要将您的 app.js 文件重写为 ESM 模块。 ESM 模块在 nodejs 中仍然有点新,并且模块类型之间的兼容性现在可能很难使用,因此您可以在同一个 nodejs 项目中使用这两种模块类型。可以做到,但要解决的挑战有很多。
  • node 14 确实支持 ESM 模块,如果您正确配置项目并且确实正在加载 ESM 模块文件。这个问题试图将 CommonJS 模块加载为 ESM 模块。你不能那样做。 ESM 文件不能使用require()。它必须使用较新的import 语法。同样,CommonJS 文件不能使用import - 它必须使用require()。在 CommonJS 与 ESM 模块中,导出内容的文件必须以不同的方式导出。您的 app.js 文件是一个 CommonJS 模块(这就是您编写它的方式),因此它不能作为 ESM 模块加载。

标签: javascript node.js ecmascript-6 node-modules


【解决方案1】:

nodejs 正在尝试将您的 app.js 文件加载为 ESM 模块文件,但它不是 ESM 模块文件 - 它是 CommonJS 模块文件。 ESM 模块文件中没有require(),这就是您收到错误的原因。

由于您的文件是一个 CommonJS 模块,似乎很可能有一些指令告诉节点尝试将您的文件作为 ESM 模块加载。最有可能的地方是你的 package.json 文件,你应该确保你有:

type: "commonjs"

不是

type: "module"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2012-04-25
    相关资源
    最近更新 更多