Webpack - React Router V4 - 代码拆分异步块中的重复模块
Webpack - React Router V4 - code splitting duplicate modules in async chunks
主要问题是在使用 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"。
有人知道发生了什么事吗?
感谢任何帮助:) 谢谢!
我终于找到了解决方案 ;)
我放这个是为了对某人有所帮助。
答案是:
不指定块显然不是针对所有块,而是仅针对最后一个创建的块。
假设我们使用 react-router V4 创建了 2 个异步块 'home-chunk' 和 'welcome-chunk'。
从中获取公共块的方法是在 webpack 配置文件中添加(在插件中):
new webpack.optimize.CommonsChunkPlugin( {
name : 'common',
chunks : ['home-chunk', 'welcome-chunk'],
minChunks : 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"
主要问题是在使用 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"。
有人知道发生了什么事吗?
感谢任何帮助:) 谢谢!
我终于找到了解决方案 ;)
我放这个是为了对某人有所帮助。
答案是: 不指定块显然不是针对所有块,而是仅针对最后一个创建的块。
假设我们使用 react-router V4 创建了 2 个异步块 'home-chunk' 和 'welcome-chunk'。 从中获取公共块的方法是在 webpack 配置文件中添加(在插件中):
new webpack.optimize.CommonsChunkPlugin( {
name : 'common',
chunks : ['home-chunk', 'welcome-chunk'],
minChunks : 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"