Я использую ориентированное на маршрут разбиение кода с помощью response-universal-component и flush chuck . Извините за длинный фрагмент кода / псевдо-код, я старался изо всех сил, чтобы сделать его короче. :)
Сначала создайте массив для реакции маршрутизатора, отображающего соответствующие компоненты
let routeConfig = [
{path: '/foo', component: 'Foo'},
{path: '/bar', component: 'Bar'}
];
Функция
universal
гарантирует, что компонент и его дочерние элементы могут быть правильно импортированы как на стороне сервера, так и на стороне клиента. Он достаточно умен, чтобы лениво загружать разделенные коды соответственно.
import universal from 'react-universal-component';
const routes = routeConfig.map((item) =>{
let route = {};
route.path = item.path;
route.component = universal(import(`./container/${item.component}`), options);
return route;
});
Визуализация маршрутизатора в React Component.
class App extends React.Component {
render() {
return (
<div>
<Switch>
{routes.map( route => <Route key={ route.path } { ...route } />)}
</Switch>
</div>
);}}
Конфигурационный веб-пакет определяет имена разделения кода.
output: {
filename: '[name].js',
chunkFilename: '[name].js',
path: path.resolve(__dirname, '../dist/client'),
publicPath: '/xxxxxx/'
},
plugins: [
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: '[name].css',
chunkFilename: '[id].css'
})],
optimization: {
splitChunks: {
chunks: 'initial',
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
name: 'vendor' // bundle all the npm module as vendor.js
}}}}
Наконец, server.js
будет использовать промывочный патрон для разделения кода.
const chunkNames = flushChunkNames();
const {js, styles, cssHash, scripts, stylesheets} = flushChunks(clientStats, {chunkNames});
res.send(`<!doctype html>
<html>
<head>
${styles}
</head>
<body>
<div id="root">${app}</div>
${cssHash}
${js}
</body>
</html>`);