Javascript 错误[错误要求ESM]:如何在节点12中使用es6模块?

Javascript 错误[错误要求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",

节点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"
  }
}

您所要做的就是添加标志——支持新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
    不支持ESM
  • 子目录没有-在
    src
    目录中放置
    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请详细说明!