每个webpack块提取一个css文件(require.ensure)

时间:2017-03-08 02:28:57

标签: webpack extract-text-plugin extracttextwebpackplugin

在尝试在我们的应用程序中实现页面优化时,我们希望能够为每个webpack块生成单独的CSS文件,以提高应用程序中第一页的页面呈现性能。为实现这一目标,我们一直在尝试将extract-text-plugin与require.ensure结合使用,如下所示:

const $ = require('load-webpack-plugins')();
module.exports = {
  entry: { 'app': './src/app.js' },
  output: {
    path: 'dist',
    filename: '[name].js'
  },
  devtool: 'source-map',
  module: {
    loaders: [
      { test: /\.js$/, use: [{ loader: 'babel-loader' }] },
      {
        test: /\.css$/,
        use: $.ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: [{ loader: 'css-loader' }]
        })
      }
    ]
  },
  plugins: [
    new $.ExtractTextPlugin({ filename: '[name].[contenthash].css', allChunks: true }),
    new $.NamedModulesPlugin(),
  ]
}

app.js为:

console.log('this is app.js');

require.ensure([], require => {
  require('./a.css');
}, 'base');

require.ensure([], require => {
  require('./b.css');
}, 'first');

require.ensure([], require => {
  require('./c.css');
}, 'second');

和a.css是:

.a {
  color: red;
}

和b.css是:

.b {
  color: red;
}

和c.ss正在:

.c {
  color: red
}

问题我们只获得一个CSS文件dist/app.e2e9da337e9ab8b0ca431717de3bea22.css,其中包含所有3个块的内容:

.a {
  color: red;
}

.b {
  color: red;
}

.c {
  color: red
}


/*# sourceMappingURL=app.e2e9da337e9ab8b0ca431717de3bea22.css.map*/

在这种情况下,我们如何为每个webpack块(require.ensure)提取一个css文件?是否应该由extract-text-plugin支持。

PS:以下是演示此问题的示例存储库 - https://github.com/osdevisnot/extract-text-demo

1 个答案:

答案 0 :(得分:6)

extract-text-plugin不会在分割点上提取。
通过传递 {allChunks: true}它提取所有块中的所有css并放入一个css文件中。
但它并没有解决你的问题。

为此,您可以使用extract-text-plugin尝试专门为此用例构建的extract-css-chunks-webpack-plugin