react webpack 按需加载初试
1:为什么要按需加载
- 【直接打包】React实现单页面运用时,当项目较小或者页面较少的情况下可以无需打包成多个文件,因为即使前端代码有10M,在通过webpack压缩打包,再通过GZIP压缩后一般也就400k,在一面正常的pc系统中400k的大小是可接受的。
- 【按需加载】但当你的应用稍微复杂一点点,包括依赖后,打包后的文件都是挺大的。而我们加载的时候,不管那些代码有没有执行到,都会下载下来。对于对系统性能要求较高,对代码有‘洁癖’的开发者来说,任何性能的浪费都是不可接受的,所以 我们 只下载我们需要执行的代码的 话,那么可以节省相当大的流量。也就是我们所说的 按需加载
2:webpack按需加载
require.ensure(dependencies,callback,chunkName)
这个方法可以实现js的按需加载,分开打包,webpack 管它叫 chunk
- webpack 对应配置
-
module.exports = {
output: {
chunkFilename: ‘[name].[chunkhash:8].chunk.js’,
publicPath: ‘/dist/’
}
}
[name] 默认是 ID,如果指定了chunkName则为指定的名字。
[chunkhash] 是对当前chunk 经过hash后得到的值,可以保证在chunk没有变化的时候hash不变,文件不需要更新,chunk变了后,可保证hash唯一,由于hash太长,这里我截取了hash的8个字符足矣
3:react-router 按需加载Demo
<Router history={hashHistory}> <Route path="/" component={RootContainer}> <Route path="RouterOne" getComponent={ (nextState,callback)=>{ require.ensure([],(require)=>{ callback(null,require("../containers/RouterOne").default) },"router_one") }} /> <Route path="RouterTwo" getComponent={ (nextState,require("../containers/RouterTwo").default) },"router_two") }} /> </Router>
将会打包成bundle.js,router_one_xxxxx_chunk.js,router_two_xxxxx_chunk.js,三个文件