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

问题描述 投票:0回答:13

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

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

package.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"
  }
}
$ 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
javascript node.js import es6-modules
13个回答
26
投票

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

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

const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));

24
投票

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

    "start": "node --experimental-modules src/index.mjs "

17
投票

Node 14 我用解决方法解决了它。

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

简短总结:

  1. 您的根级别
    package.json
    不支持ESM
  2. 子目录 - 在
    src
    目录位置
    package.json
    { "type": "module" }

PS:ESLint 团队目前无法轻松解决这个问题,只是因为核心设计......:(


5
投票

您必须在 package.json 文件中添加这行代码

"type" : "module"
如果我正确理解了您的问题,您将能够使用导入语句而不是 require 。

您的 package.json 将如下所示:

{
  "name": "dynamic-es6-mod",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.mjs",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node src/index.mjs"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "globby": "^10.0.1"
  }
}

3
投票
  1. 转到
    package.json
    文件并写入
    "type":"module"
    ,上面的调试如下:
"name": "npmmodule",
"version": "1.0.0",
"main": "index.js",
"type": "module",
  1. 使用
    import
    代替
    require
    :
import chalk from 'chalk';

console.log(chalk.blue("hello world"));

3
投票

解决使用https://www.npmjs.com/package/nanoid-esm

import nanoid from 'nanoid-esm';
console.log(nanoid())

0
投票

这一切让我度过了一段痛苦的时光。我只是发布我的解决方案存储库,希望对其他人有帮助。

这会在不使用 babel 的情况下将 ESM 依赖项 (ora) 导入到 TypeScript 中。 https://github.com/jason-henriksen/typescript-with-esm-no-babel-boilerplate


0
投票

我的两分钱,升级到yarn 3对我有用!


-1
投票

您可以尝试使用

"jest-preset-angular": "11.0.0-rc.3"

它适用于我的情况:Angular v13+ 和 Node v16+。


-1
投票

使用已安装的节点模块的先前或旧版本。会起作用的。


-3
投票

尝试使用 npm 的 esm 模块,它将支持 es6(也可以在生产中使用)。


-3
投票

对于 Node.js:

告诉 Node 忽略该错误。

const Module = require('module')
const orig = Module._extensions['.js']
const fs = require('fs')
Module._extensions['.js'] = function (module, filename) {
  try {
    return orig(module, filename)
  } catch (e) {
    if (e.code === 'ERR_REQUIRE_ESM') {
      // From: https://github.com/nodejs/node/blob/c24b74a7abec0848484671771d250cfd961f128e/lib/internal/modules/cjs/loader.js#L1237-L1238
      const content = fs.readFileSync(filename, 'utf8')
      module._compile(content, filename)
      // --
      return
    }
    throw e
  }
}

使用 Babel 进行即时转译。

require('@babel/register', {
  ignore: (f) => {
    // Don't ignore the package we want to transpile.
    if (f.match('semver-regex') return false
    // Prevent babel transpiling anything else in `node_modules`.
    return f.match('node_modules')
  },
  overrides: [{
    // Set preset to be used to transpile our ESM package.
    test: /semver\-regex/,
    presets: ['es2015'],
  }]
})

// Call the rest of your code.
require('./index.js')

对于 Webpack:

执行类似操作,但使用 Babel 加载器且不使用 Node require 钩子。


-6
投票

只需要更新节点:

运行:nvm install 15 nvm 使用 15

信用:https://www.youtube.com/watch?v=sUkCszM2gvU https://www.youtube.com/watch?v=sUkCszM2gvU

© www.soinside.com 2019 - 2024. All rights reserved.