错误 [ERR_REQUIRE_ESM]:如何在节点 12 中使用 es6 模块?

Mat*_*ood 27 javascript import node.js es6-modules

来自https://2ality.com/2019/04/nodejs-esm-impl.html Node 12 应该支持 es6 模块;但是,我只是不断收到错误消息:

问题:如何在节点 12 中使用 es6 模块制作 MVP?

包.json

{
  "name": "dynamic-es6-mod",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.mjs",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node src/index.mjs"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "globby": "^10.0.1"
  }
}
Run Code Online (Sandbox Code Playgroud)
$ node -v
$ 12.6.0
$ npm run start


internal/modules/cjs/loader.js:821
  throw new ERR_REQUIRE_ESM(filename);
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/dev/dynamic-es6-mod/src/index.mjs
    at Object.Module._extensions..mjs (internal/modules/cjs/loader.js:821:9)
    at Module.load (internal/modules/cjs/loader.js:643:32)
    at Function.Module._load (internal/modules/cjs/loader.js:556:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:839:10)
    at internal/main/run_main_module.js:17:11
Run Code Online (Sandbox Code Playgroud)

小智 26

该模块的官方文档指出,v2 应该与 require() 一起使用。

不过有一个解决办法。相反,它可以异步加载:

const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
Run Code Online (Sandbox Code Playgroud)


abd*_*laa 22

您所要做的就是添加支持新 es6 导入/导出语句的--experimental-modules标志,顺序也很重要,如下所示。

    "start": "node --experimental-modules src/index.mjs "
Run Code Online (Sandbox Code Playgroud)

  • 为我工作的版本 12.16.1,我不知道为什么它不适合你@Neutrino (4认同)
  • 这是不正确的。不适用于 NodeJS 版本 12 LTS,并且版本 12 或 14 的 NodeJS 文档中没有提及 --experimental-modules。我认为此选项是开发中的一个功能,已被删除。 (3认同)
  • 是的,这是 Nodejs v12.00 之前的一个功能,根据本文 https://medium.com/@nodejs/announcing-a-new-experimental-modules-1be8d2d6c2ff (3认同)

Mic*_*ský 7

Node 14 中,我通过变通方法解决了它。

解决方法来源:https : //github.com/eslint/eslint/issues/12319#issuecomment-535799024

简短的摘要:

  1. 您的根级别package.json不支持 ESM
  2. 子目录那样-在src目录中地方package.json{ "type": "module" }

PS:ESLint 团队现在不能轻易解决,只是因为核心设计...... :(