来自 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
模块的官方文档指出,v2 应与 require() 一起使用。
有一个解决方法。相反,它可以异步加载:
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
您所要做的就是添加支持新的 es6 导入/导出语句的标志 --experimental-modules ,而且顺序也很重要,如下所示。
"start": "node --experimental-modules src/index.mjs "
在 Node 14 我用解决方法解决了它。
解决方法来源:https://github.com/eslint/eslint/issues/12319#issuecomment-535799024
简短总结:
package.json
不支持ESMsrc
目录位置 package.json
与 { "type": "module" }
PS:ESLint 团队目前无法轻松解决这个问题,只是因为核心设计......:(
您必须在 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"
}
}
package.json
文件并写入"type":"module"
,上面的调试如下:"name": "npmmodule",
"version": "1.0.0",
"main": "index.js",
"type": "module",
import
代替 require
:import chalk from 'chalk';
console.log(chalk.blue("hello world"));
解决使用https://www.npmjs.com/package/nanoid-esm
import nanoid from 'nanoid-esm';
console.log(nanoid())
这一切让我度过了一段痛苦的时光。我只是发布我的解决方案存储库,希望对其他人有帮助。
这会在不使用 babel 的情况下将 ESM 依赖项 (ora) 导入到 TypeScript 中。 https://github.com/jason-henriksen/typescript-with-esm-no-babel-boilerplate
我的两分钱,升级到yarn 3对我有用!
您可以尝试使用
"jest-preset-angular": "11.0.0-rc.3"
。
它适用于我的情况:Angular v13+ 和 Node v16+。
使用已安装的节点模块的先前或旧版本。会起作用的。
尝试使用 npm 的 esm 模块,它将支持 es6(也可以在生产中使用)。
对于 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 钩子。
只需要更新节点:
运行:nvm install 15 nvm 使用 15
信用:https://www.youtube.com/watch?v=sUkCszM2gvU https://www.youtube.com/watch?v=sUkCszM2gvU