如何修复模块"ModuleConcatenation bailout:Module is not ECMAScript module"救助消息?

fab*_*sta 16 webpack webpack-3

Webpack3附带ModuleConcatenation插件,当与--display-optimization-bailout标志一起使用时,将为您提供救助的原因.

救助信息并不容易理解,而且很难理解为什么它们发生在特定模块上.

这是我webpack在项目的一个非常简化版本上的命令输出:

> webpack --bail --display-optimization-bailout

Hash: 4a9a55dc2883e82a017e
Version: webpack 3.4.1
Child client:
    Hash: 4a9a55dc2883e82a017e
    Time: 594ms
                                   Asset       Size  Chunks                    Chunk Names
        a.d3ade61d21d5cb8dd426.bundle.js  712 bytes       0  [emitted]         a
    a.d3ade61d21d5cb8dd426.bundle.js.map    6.57 kB       0  [emitted]         a
                           manifest.json  102 bytes          [emitted]         
                              index.html     299 kB          [emitted]  [big]  
       [0] multi ./src/client/bootstrap/ErrorTrap.js 28 bytes {0} [built]
           ModuleConcatenation bailout: Module is not an ECMAScript module
       [1] ./src/client/bootstrap/ErrorTrap.js 199 bytes {0} [built]
           ModuleConcatenation bailout: Module is not an ECMAScript module
Run Code Online (Sandbox Code Playgroud)

我./src/client/bootstrap/ErrorTrap.js尽可能地简化了内容,我仍然得到了ModuleConcatenation bailout: Module is not an ECMAScript module.这是它的内容:

class ErrorTrap {
}

export default ErrorTrap;
Run Code Online (Sandbox Code Playgroud)

我查看了解这个救助消息,其中一个原因是当模块没有导入或导出时,如https://github.com/webpack/webpack/blob/93ac8e9c3699bf704068eaccaceec57b3dd45a14/lib/dependencies/所示. HarmonyDetectionParserPlugin.js#L12-L14,但我不知道为什么它不考虑这个模块的ECMAScript模块.

.babelrc

{
  "presets": [
    "es2015"
  ]
}
Run Code Online (Sandbox Code Playgroud)

webpack.config.js表示:

{ target: 'web',
  devtool: 'source-map',
  entry: { a: [ './src/client/bootstrap/ErrorTrap.js' ] },
  output:
   { path: '/project/build/client/assets',
     filename: '[name].[chunkhash].bundle.js',
     chunkFilename: '[name].[chunkhash].chunk.js',
     publicPath: '/assets/' },
  module: { rules: [ [Object], [Object], [Object], [Object], [Object] ] },
  resolve: { alias: { 'lodash.defaults': 'lodash' } },
  plugins:
   [ ModuleConcatenationPlugin { options: {} },
     CommonsChunkPlugin {
       chunkNames: [Object],
       filenameTemplate: undefined,
       minChunks: Infinity,
       selectedChunks: undefined,
       children: undefined,
       async: undefined,
       minSize: undefined,
       ident: '/project/node_modules/webpack/lib/optimize/CommonsChunkPlugin.js0' },
     ManifestPlugin { opts: [Object] },
     ChunkManifestPlugin {
       manifestFilename: 'chunk-manifest.json',
       manifestVariable: 'webpackManifest',
       inlineManifest: false },
     OccurrenceOrderPlugin { preferEntry: undefined },
     DefinePlugin { definitions: [Object] },
     VisualizerPlugin { opts: [Object] },
     ExtractTextPlugin { filename: '[name].[contenthash].css', id: 1, options: {} },
     UglifyJsPlugin { options: [Object] },
     LoaderOptionsPlugin { options: [Object] } ],
  name: 'client' }
Run Code Online (Sandbox Code Playgroud)

Mic*_*ngo 19

您正在使用Babel来转换JavaScript文件,默认情况下,es2015预设会将ES模块(import/ export)转换为CommonJS(Node使用的方式require).Webpack接收CommonJS模块,但ModuleConcatenationPlugin依赖于ES模块.您可以将Babel配置为不使用该modules选项转换模块.

{
  "presets": [
    ["es2015", { "modules": false }]
  ]
}
Run Code Online (Sandbox Code Playgroud)

Webpack 2+支持开箱即用的ES模块,最好将它们留给webpack,因为它支持Tree Shaking等功能.

  • 我做到了这一点,仍然得到了救助.我想知道我的模块是如何构建的. (6认同)

bas*_*sil 8

对于那些使用现代的人@babel/preset-env:

{
  "presets": [
    ["@babel/preset-env",{
      "targets": {
        ...
      },
      "modules": false
    }],
    "@babel/preset-react"
  ],
  "plugins": [...
}
Run Code Online (Sandbox Code Playgroud)

但是不好的事情(但不是关键)在那之后我不能像以前一样在我的 webpack 配置文件中使用 ES 模块,所以在webpack.config.babel.js:

import webpack from 'webpack';
Run Code Online (Sandbox Code Playgroud)

应改为:

const webpack = require('webpack');
Run Code Online (Sandbox Code Playgroud)

  • 可悲的是,这对我不起作用。我得到的错误是:``` Entrypoint mini-css-extract-plugin = * chunk {0} * (mini-css-extract-plugin) 497 KiB [entry] [rendered] > !!/Us.... .gin [0] ./node_modules/css-loader/dist/cjs.js??ref--6-1!./node_modules/postcss-loader/src??postcss!./node_modules/sass-loader/lib/ loader.js??ref--6-3!./source/scss/main.scss 495 KiB {0} [depth 0] [built] ModuleConcatenation 救助:模块不是 ECMAScript 模块单项!!/使用.. .ce/scss/main.scss mini-css-extract-plugin ``` (2认同)