在 webpack config 中定义多个 babel 预设配置

Chr*_*isM 2 javascript webpack babeljs babel-loader babel-preset-env

我创建了一个webpack.config.js导出两个不同 WebPack 配置对象的文件。我需要为这些中的预设设置不同的 babel 选项。经过一些研究,我尝试创建两个不同的加载程序配置,每个配置都targets向预设传递不同的选项,如下所示:

// default JS loader config for browsers that support <script type='module'
{
    loader:'babel-loader',
    options:{
        presets: ['@babel/preset-env', {
            targets: {
                esmodules: true
            }
        }]
    }
}
...


// fallback for browsers that load the <script nomodule 
{
    loader:'babel-loader',
    options:{
        presets: ['@babel/preset-env', {
            targets: "> 0.5% in UK, last 2 versions, not dead, ie 11"
        }]
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我显然是犯了这个错误,因为我在 WebPack 构建中遇到了这个错误

ERROR in ./some-path/WorkflowStage.class.js
    Module build failed (from ./node_modules/babel-loader/lib/index.js):
    ReferenceError: [BABEL] e:\some-path\WorkflowStage.class.js: Unknown option: .targets. Check out https://babeljs.io/docs/en/babel-core/#options for more information about options.
Run Code Online (Sandbox Code Playgroud)

我的主要问题是我应该如何@babel/preset-env从我的webpack.config.js文件中传递目标选项?(我认为这是我对这个项目的理想设置)。

如果这是不可能的,我应该如何设置 WebPack / babel 以便 WebPack 的单次运行生成两个不同的输出文件,这些文件由两个不同的 babel 配置生成?

Nin*_*liu 5

基本上你的加载器选项必须看起来像一个 JS 编码的.babelrc. 每个带有选项的预设都必须在它自己的数组中。

所以,更换

{
  loader: 'babel-loader',
  options: {
    presets: [
      // defines the @babel/preset-env as the first preset
      '@babel/preset-env',
      // defines an invalid object as a preset (throws error)
      { targets: { esmodules: true } }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

{
  loader: 'babel-loader',
  options: {
    presets: [

      // defines a preset with options
      [
        '@babel/preset-env', {
          targets: {
            esmodules: true
          }
        }
      ]

    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 也许在预设数组中显示另一个预设来显示语法是一个很好的例子。我花了一些额外的时间来找出并可以在未来帮助人们。例如,针对 ie:10 的“@vue/app”预设 (2认同)