同志们,项目需要实现按需加载来减小首次加载的时间。
没有使用按需加载之前是这样的情况:
antd,echarts等等第三方库都放在vendor中,最后生成的app.js大约1.6M,vendor.js大约4M。
项目中使用的插件比较多,使用webpack-bundle-analyzer分析工具看了一下,其中antd,echarts,lodash,moment比较大。
PS:以下的效果都是在我的本地执行的,没有使用gzip,所以整体看起来会比没有按需加载之前要大。
目前我的解决方案如下:
1:antd使用官网的按需加载,
2:react-router和webpack结合的按需加载
3:使用new webpack.IgnorePlugin(/^./locale$/, /moment$/)处理了moment是有效的
webpack配置如下:
entry入口:
entry: {
vendor: ['react','react-dnd',
'react-dnd-html5-backend','react-dom','react-fetch','react-redux','react-router',
'superagent','react-router-redux','redux','redux-react-fetch','redux-thunk',
'history','isomorphic-fetch','js-cookie',
'lodash','moment','pubsub-js'],
app: "./src/index",
}
因为想实现antd的按需加载,所以我没有把antd放到vendor中,echarts-for-react等其他的插件因为用到的地方不是很多,所以也没有放到vendor中。
antd按需加载的配置:
{
test: /\.js$/,
loader: require.resolve('babel-loader'),
options: {
plugins: [
['import', { libraryName: 'antd', style: true }],
]
},
exclude: /node_modules/,
include: __dirname
}
我测试过antd的按需加载,应该是可以的。我的项目目录结构如下:
这里有一个问题:
1:使用react-router懒加载,只能对部分有路由的组件进行懒加载,像是component中的组件就只能全部打到app中了。
2:然后antd的按需加载把component中引用的组件全都打包了,导致antd打出的包一直特别大。
路由配置基本如下:
const CodeView = (location, callback) => {
require.ensure([], require => {
callback(null, require('./containers/code-files/code-view'))
}, 'code-view')
};
<Route name="codeView" breadcrumbName="代码查看" path="code-view" getComponent={CodeView}/>
按需加载没有完全实现,这时候再使用webpack-bundle-analyzer分析,结果如下,感觉太乱了:
高亮和代码编辑器单独打的包:
app.js内容,我把echarts拿出去了,太大了。
vendor.js内容,echarts放进来了。
还有一个整体情况:
内容有点多,请耐心查看。
打包效果太差了,我是不是哪里写的有问题啊?
刚刚发现高亮这种多个地方用到的插件被重复打包了好几次:(
提取一个vendor.js出来
然后roadhog配置一下
应该就会小很多,不知道对你有帮助没