在使用前端框架构建单页应用时,服务器会返回一份html文件、抽取出来的css文件和一份打包好的js文件。html体积是极小的,至关于只提供了一个舞台,而页面结构的生成和更新彻底由js根据路由和框架特色、业务逻辑来控制,加上css样式渲染出完整的页面。打包后的js文件包括了框架和依赖库(react、react-router等)还有业务逻辑代码,因此功能越复杂,体积很大。css
浏览器从输入url到完成显示页面有一个复杂的过程,这里从加载文件开始分析。浏览器解析得到的html文档并生成DOM树,当浏览器解析到外部的script时,解析会暂停,并发送请求来加载script文件并执行,而后才会继续解析DOM。这就致使了过大的外部js文件拖慢了页面的加载渲染。有人提出能够加入 defer 属性支持同步加载和浏览器缓存策略,但这只是有限的优化手段,请求时间和执行时间过长也会影响到首屏的加载,影响了用户体验。html
对于单页应用来讲,页面是根据路由区分的,代码拆分其实就是按照页面来拆分,每一个页面都对应一个分片。对多个页面共享的代码又独立拆分出来,对于有不少页面和复杂依赖的应用,共享代码还能够进一步拆分为全部页面共享的(React框架代码)和部分页面共享的(组件模块),这样当一个页面加载时只须要加载页面本身的分片和共享的分片就行,很大地提升了首屏渲染的速度。前端