В настоящее время работает
Используя Webpack 2 и React Router v4, я смог настроить разбиение рабочего кода. Существует промежуточный <AsyncComponent>
, который разрешает обещание и возвращает компонент (шаблон, найденный в проблемах github).
Пример набора маршрутов ниже:
<Switch>
<Route
path="me"
render={(props) =>
<AsyncComponent promise={ require.ensure([], (require) => require('./modules/Profile'), 'profile') } props={props} />
}
/>
<Route
path="credit-card"
render={(props) =>
<AsyncComponent promise={ require.ensure([], (require) => require('./modules/CreditCard'), 'credit-card') } props={props} />
}
/>
</Switch>
Цель
Я хотел бы расширить это, и для определенных маршрутов только загрузите дополнительные библиотеки. В приведенном выше примере я хотел бы получить библиотеку StripeJS (https://js.stripe.com/v2/) только на маршруте кредитной карты.
Я хочу подчеркнуть, что я могу загрузить Stripe прямо в нижний колонтитул, и все работает нормально. Есть несколько библиотек, я использую Stripe в качестве простого примера.
Покушение
Следующие попытки были предприняты для небольшого успеха:
- Маркировка lib external в конфигурации webpack. Это (правильно) помещает библиотеку как внешнюю и не будет пытаться связывать ее во время последовательности запроса require. Однако ожидание заключается в том, что библиотека вводится вручную.
- Я играл с идеей использования загрузчика псевдо script (при ударе по этому маршруту вручную создайте
<script>
с атрибутомsrc
, дождитесь его загрузки, а затем пусть компонент выполнит свою задачу. Это работает нормально, но на самом деле ужасно из-за ремонтопригодности (если нужны две или более библиотеки, мне тогда нужно реплицировать неуклюжую ручную загрузкуscript
) и, похоже, работает против "способа" webpack.
Соответствующие части конфигурации
const core = [
'lodash',
'react',
'react-dom',
'axios',
'react-router-dom',
];
const config = {
context: path.resolve(__dirname, './ts_build'),
node: {
fs: "empty"
},
entry: {
app: './app.js',
core: core,
},
output: {
filename: '[name].js',
chunkFilename: '[name].[id].chunk.js',
path: path.resolve(__dirname, './../../public'),
publicPath: 'http://example.org/',
},
resolve: {
modules: [
path.resolve('./src'),
],
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
names: ['core'],
minChunks: Infinity,
}),
new webpack.NamedModulesPlugin(),
],
};