【发布时间】: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