Webpack - React Router V4 - код, разбивающий дубликаты модулей на асинхронные блоки
Основная проблема заключается в том, что при разделении кода с помощью response-routerV4, а затем через webpack 2 у меня есть модули, которые находятся в нескольких блоках, и я не могу добраться до основного.
Моя конфигурация выглядит следующим образом:
- Webpack 2.2.1
- Реакт-маршрут 4.1.1
Я использую разделение кода, как в документации по Resact-Router v4
По сути, я не использую импорт, но в конфигурации маршрута у меня есть что-то вроде этого:
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 (реакции-пятно), который находится в нескольких пакетах. Поэтому я хочу выпустить его в основной комплект.
Моя конфигурация веб-пакета:
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 из моих связок.
У кого-нибудь есть подсказка о том, что происходит?
Любая помощь приветствуется:) Спасибо!
1 ответ
И я наконец-то получил решение;)
Я позволил это, чтобы это могло помочь кому-то.
Ответ таков: не указание чанка, по-видимому, не нацелено на все чанки, а только на последний созданный.
Допустим, с помощью router-маршрутизатора V4 мы создали 2 асинхронных блока "home-chunk" и "welcome-chunk". Чтобы вытащить из него общие блоки, добавьте в файл конфигурации webpack (в плагинах):
new webpack.optimize.CommonsChunkPlugin( {
name : 'common',
chunks : ['home-chunk', 'welcome-chunk'],
minChunks : 2,
}),
Это проверит наличие общих модулей в асинхронных чанках и, если так, поместит их в общий чанк.
Ответ ниже, скопированный отсюда: Как удалить повторяющиеся компоненты Ant Design в чанках
Решение без модификации webpack:
В родительском компоненте (или более высоком родительском компоненте) выполните точно такой же импорт здесь.
import { Row, Col, Button } from "antd"
Вы могли бы использовать React.lazy
также сюда импортировать. Я не думаю, что это необходимо, но вы можете поместить это вuseEffect
поэтому этот код читается вашим приложением только при монтировании родительского компонента.
useEffect(() => {
React.lazy(() => import("antd"))
}, []);
В дочернем компоненте импортируйте с тем же кодом, что и обычно, чтобы использовать переменные. Webpack распознает, что этот модуль уже был загружен, поскольку родительский компонент все еще существует, поэтому он не включает их в новые пакеты.
import { Row, Col, Button } from "antd"