如何编码拆分Webpack 4中的两个条目之一?

时间:2018-03-15 11:49:26

标签: webpack code-splitting webpack-4

我有一个看似相当直接的Webpack代码拆分设置,我无法迁移到Webpack 4.我有两个条目,名为mainpreview。我想在vendor中为供应商模块分割成main块的初始代码,但我想将preview保留为一个块。

Webpack 3中工作配置的相关部分:

{
  entry: {
    main: './src/application.js',
    preview: './src/preview.js',
  },
  plugins: [{
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      chunks: ['main'],
      minChunks({context}) {
        if (!context) {
          return false;
        }
        const isNodeModule = context.indexOf('node_modules') !== -1;
        return isNodeModule;
      },
    }),
  }]
}

具体来说,使用chunks选项中的CommonsChunkPlugin属性可以让我轻松完成我需要做的事情。 Webpack 4的optimization.splitChunks配置中是否存在等效项?

2 个答案:

答案 0 :(得分:6)

以下Webpack 4配置仅将main模块供应商依赖项拆分为单独的块。 preview的其他依赖关系仍在该块中。

{
    entry: {
        main: './test/application.js',
        preview: './test/preview.js'
    },
    optimization: {
        splitChunks: {
            cacheGroups: {
                vendors: {
                    name: 'vendors',
                    chunks: 'all',
                    enforce: true,
                    priority: 1,
                    test(module, chunks) {
                        const name = module.nameForCondition && module.nameForCondition();
                        return chunks.some(chunk => chunk.name === 'main' && /node_modules/.test(name));
                    }
                }
            }
        }
    }
}

供应商包中包含共享依赖项,除非我们将preview cacheGroup配置为具有更高优先级,以强制执行此处包含的所有依赖项应保留在此块中。

有关更多与Webpack 4相关的信息/配置,您可以查看此webpack-demo项目。

为了强制从main拆分所有供应商依赖项并从mainpreview块重用它们,您必须将preview cacheGroup配置为:

preview: {
    name: 'preview',
    chunks: 'all',
    enforce: true,
    priority: 0,
    test(module, chunks) {
        return chunks.some(chunk => chunk.name === 'preview');
    }
}

请注意,preview chunk的cacheGroup优先级低于vendors,以确保main中依赖于preview的所有preview依赖项也从<script> $(document).ready(function () { $('#example').DataTable({ "paging": true, "ordering": true, "info": false }); }); </script> 捆绑。

答案 1 :(得分:2)

或者:

    splitChunks: {
      cacheGroups: {
          // We want all vendor (node_modules) to go into a chunk.
          vendors: {
            test: /[\\/]node_modules[\\/]/,
            name: "vendors",
            // Exclude preview dependencies going into vendors.
            // Currently undocument feature:  https://github.com/webpack/webpack/pull/6791
            chunks: chunk => chunk.name !== "preview"
          }
      }
    }