【问题标题】:Webpack - React Router V4 - code splitting duplicate modules in async chunksWebpack - React Router V4 - 代码拆分异步块中的重复模块
【发布时间】:2017-07-05 09:36:29
【问题描述】:

主要问题是在使用 react-routerV4 和 webpack 2 进行代码拆分时,我有几个模块,我无法到达主要模块。

我的配置如下:

  • Webpack 2.2.1
  • 反应路线 4.1.1

我正在使用 react-router v4 documentation 中的代码拆分

基本上,我不使用导入,但在路由配置上我有:类似这样的:

import loadHome from 'bundle-loader?lazy&name=home-chunk!./pages/market/Home';
[
  {
    path: url1,
    component: props => <Bundle load={loadHome}>{Home => <Home {...props} />}</Bundle>,
    exact: true,
  },
  // other routes
  ]

这完全适用于代码拆分,我为每个路由获得一个捆绑包,为稍后可以拆分的 node_modules 获得另一个捆绑包。

我的问题是,我有一个 node_module (react-slick),它位于多个捆绑包中。所以我想把它放在主包里。

我的 webpack 配置是:

module.exports = {
  entry: [
    'whatwg-fetch',
    './src/scripts/index.js',
  ],
  output: {
    path: path.resolve(__dirname, 'src/build'),
    publicPath: '/build/',
    chunkFilename: "[name].js?[hash]",
    filename: '[name].js',
  },
  plugins: [
    new BundleAnalyzerPlugin(),
    new webpack.DefinePlugin({
      'process.env': {
        'NODE_ENV': '"production"'
      }
    }),
    new webpack.optimize.CommonsChunkPlugin({
      name: ['4_node-modules'],
      minChunks(module) {
       const context = module.context;
       return context && context.indexOf('node_modules') >= 0;
      },
    }),
    new webpack.optimize.CommonsChunkPlugin({
      name: ['3_react'],
      chunks: ['4_node-modules'],
      minChunks(module) {
        return module.context && /.*\/react.*/.test(module.context);
      },
    }),
    new webpack.optimize.CommonsChunkPlugin({
        children: true,
        minChunks: 2,
    }),
    new ExtractTextPlugin({
      filename: '[name].css',
      allChunks: true,
    }),
    new HtmlWebpackPlugin({
      filename: '../index.prod.html',
      template: 'src/template.index.prod.html',
      inject: false,
      hash: true,
    }),
  ],
};

根据文档,这应该可以解决问题:

new webpack.optimize.CommonsChunkPlugin({
    children: true,
    minChunks: 2,
}),

但是什么也没发生,我的 3 个包中仍然有“react-slick”。

有人知道发生了什么吗?

任何帮助表示赞赏:) 谢谢!

【问题讨论】:

    标签: webpack react-router react-router-v4 code-splitting commonschunkplugin


    【解决方案1】:

    我终于得到了解决方案;)

    我让这个可能对某人有所帮助。

    答案是: 不指定块显然不是针对所有块,而是只针对最后一个创建的块。

    假设使用 react-router V4,我们创建了 2 个异步块“home-chunk”和“welcome-chunk”。 从中获取公共块的方法是添加到 webpack 配置文件中(在插件中):

    new webpack.optimize.CommonsChunkPlugin( {
      name : 'common',
      chunks : ['home-chunk', 'welcome-chunk'],
      minChunks : 2,
    }),
    

    这将检查异步块中是否有公共模块,如果有,则将它们放入公共块中。

    【讨论】:

      【解决方案2】:

      从这里复制下面的答案:How to remove duplicate Ant Design components across chunks


      不修改webpack的解决方案:

      在父组件(或更高的父组件)上,在此处执行完全相同的导入。

      import { Row, Col, Button } from "antd"
      

      您也可以使用React.lazy 在这里导入。我认为没有必要,但您可以将其放在 useEffect 中,这样只有在该父组件挂载时,您的应用才会读取此代码。

      useEffect(() => {
        React.lazy(() => import("antd"))
      }, []);
      

      在子组件中,使用与正常相同的代码导入以使用变量。 Webpack 识别出这个模块已经被下载,因为父组件仍然存在,所以它不会将它们包含在新的包中。

      import { Row, Col, Button } from "antd" 
      

      【讨论】:

        猜你喜欢
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 2017-09-30
        • 2017-10-15
        • 2017-03-28
        • 1970-01-01
        相关资源
        最近更新 更多