Javascript 错误[错误要求ESM]:如何在节点12中使用es6模块?
节点12应支持es6模块;然而,我只是不断得到错误: 问题:我如何在节点12中使用es6模块来获得MVP package.jsonJavascript 错误[错误要求ESM]:如何在节点12中使用es6模块?,javascript,node.js,import,es6-modules,Javascript,Node.js,Import,Es6 Modules,节点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",
{
"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"
}
}
您所要做的就是添加标志——支持新es6导入/导出语句的实验模块。顺序也很重要,如下所示
"start": "node --experimental-modules src/index.mjs "
尝试使用npm的esm模块,该模块将支持es6(也可用于生产) 您必须在package.json文件中添加这行代码
“type”:“module”
如果我正确理解您的问题,您将能够使用imports语句而不是require
您的package.json将如下所示:
{
“名称”:“dynamic-es6-mod”,
“版本”:“1.0.0”,
“说明”:“,
“main”:“src/index.mjs”,
“类型”:“模块”,
“脚本”:{
“测试”:“echo\”错误:未指定测试\“&退出1”,
“开始”:“节点src/index.mjs”
},
“关键词”:[],
“作者”:“作者”,
“许可证”:“ISC”,
“依赖项”:{
“globby”:“^10.0.1”
}
}
在节点14中,我用变通方法解决了这个问题
解决办法的来源:
小结:
package.json
不支持ESMsrc
目录中放置package.json
和{“type”:“module”}
PS:ESLint团队目前无法轻松解决此问题,因为核心设计…:(在反复尝试之后,我通过完全迁移到
typescript
解决了这个问题。令人惊讶的是,它从根目录开始工作:
package.json
{
...
"type": "module",
...
}
{
"compilerOptions": {
"...": "..."
},
"include": ["..."],
"exclude": ["..."],
"linterOptions": {
"exclude": ["..."]
},
"defaultSeverity": "..."
}
babel.config.ts
export default api => {
api.cache(true)
return {
presets: ['...'],
plugins: ['...'],
env: { '...': '...' },
}
}
import { common } from './webpack.common'
import webpack from 'webpack'
...
export default {
entry: {
'...': '...',
},
output: {
'...': '...',
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
},
module: {
rules: [
{
test: /\.(js|jsx|ts|tsx)$/i,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: [
[
'@babel/preset-env',
{
'...': '...',
},
],
'@babel/preset-react',
'@babel/typescript',
],
plugins: [
['babel-plugin-transform-require-ignore', {}],
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-object-rest-spread',
],
},
},
],
},
'...'
],
},
}
webpack.common.ts
export default api => {
api.cache(true)
return {
presets: ['...'],
plugins: ['...'],
env: { '...': '...' },
}
}
import { common } from './webpack.common'
import webpack from 'webpack'
...
export default {
entry: {
'...': '...',
},
output: {
'...': '...',
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
},
module: {
rules: [
{
test: /\.(js|jsx|ts|tsx)$/i,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: [
[
'@babel/preset-env',
{
'...': '...',
},
],
'@babel/preset-react',
'@babel/typescript',
],
plugins: [
['babel-plugin-transform-require-ignore', {}],
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-object-rest-spread',
],
},
},
],
},
'...'
],
},
}
tsconfig.json
{
...
"type": "module",
...
}
{
"compilerOptions": {
"...": "..."
},
"include": ["..."],
"exclude": ["..."],
"linterOptions": {
"exclude": ["..."]
},
"defaultSeverity": "..."
}
对于Node.js: 告诉节点忽略错误
const Module=require('Module'))
const orig=Module._扩展名['.js']
常量fs=require('fs')
模块。_扩展名['.js']=函数(模块,文件名){
试一试{
返回源(模块、文件名)
}捕获(e){
如果(e.code==='ERR\u REQUIRE\u ESM'){
//发件人:https://github.com/nodejs/node/blob/c24b74a7abec0848484671771d250cfd961f128e/lib/internal/modules/cjs/loader.js#L1237-L1238
const content=fs.readFileSync(文件名为“utf8”)
模块编译(内容、文件名)
// --
返回
}
掷e
}
}
使用巴别塔进行动态传输
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')
对于网页包:
做类似的操作,但不使用Babel Loader和Node require hook。您尝试过使用Babel吗?这是不正确的。不适用于nodejs版本12 LTS,并且在版本12或14的nodejs文档中没有提到--experimental模块。我认为此选项是开发中删除的一个功能。是的,是nodejs之前的一个功能ejs v12.00根据本文为我提供了12.16.1版,IDK为什么对你不起作用@NeutrinoCan请详细说明!