【发布时间】:2017-07-01 14:55:19
【问题描述】:
目前工作中
使用 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 作为一个易于理解的示例。
已尝试
以下尝试收效甚微:
- 在 webpack 配置中标记外部库。这(正确地)将库标记为外部库,并且不会在 require 的解析序列期间尝试捆绑它。然而,期望是手动引入库。
- 我玩过使用伪脚本加载器的想法(当到达该路径时,手动创建一个带有
src属性的<script>,等待它加载,然后让组件完成它的工作。这行得通好的,但是从可维护性的角度来看确实很糟糕(如果需要两个或更多库,那么我需要复制笨拙的手册scriptload)并且似乎与 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(),
],
};
【问题讨论】:
-
感谢@Ben Everard 的编辑——该死的我的拼写(即我称之为手的烤箱手套)
标签: javascript reactjs webpack ecmascript-6 react-router