进一步优化SPA的首屏打开速度(模块化与懒载入) by 嗡
前言
单页应用的优点在于一次载入全部页面资源,利用本地计算能力渲染页面。提高页面切换速度与用户体验。但缺点在于全部页面资源将被一次性下载完,此时封装出来的静态资源包体积较大,使得第一次打开SPA页面时候须要的载入时间较长。
在上一篇文章Angular2 单页应用一些优化总结 中提到的利用压缩、混淆、开启gzip传输后,我们成功将3.5兆的资源包压缩到350k。可是假设SPA应用的页面数进一步添加,100个甚至1000个页面的时候,还是无法避免巨大的首页资源包载入的问题。
所以350k的资源包是否还有进一步优化的空间呢?答案是肯定的。
从SPA的特性能够看出,用户在第一次打开页面时,实际上是把整个站点的全部页面都一起下载下来了,可是非常多情况下,用户可能并不会訪问到全部页面。或者短时间内仅在1~2个页面之间跳转。
所以假设能够在第一次仅下载一部分页面,然后在用户须要的时候继续下载其他页面资源的话,就能进一步压缩首页资源包的体积。
下面对优化步骤进行解说。
模块化
模块化的优点
模块化是后期优化的首要步骤。默认的Angular2 spa的项目结构为:应用主程序(main.ts)、根模块(app.module.ts)、根组件(app.component)。然后才是其他的组件components。事实上说白了就是一个拥有好多组件的单模块应用而已。
通过模块化划分。我们能够将应用依照不同功能或者作用划分为不同模块。这样也使得应用结构更加清晰。比方电商类应用:产品模块、订单模块、用户模块、购物车模块等。
模块的建立方法
step 1 : 创建模块
在app路径下建立一个modules目录单独保存模块比較好一些。通过angular-cli的命令构建模块ng g module testmodule 就可以。程序会自己主动建立一个testmodule目录,里边有一个testmodule.module.ts
step 2 : 创建组件
在testmodule目录上建立components目录,同一时候创建组件ng g component testcomponent 里边包括标准的组件文件(ts, html, css, spec)文件。
step 3 : 创建模块路由
该路由作为模块内部组件路由使用。而不是根路由。创建方法和根路由同样。
须要注意的是模块路由的路径是相对于该模块路径的地址。
比方:根路径为/app/testmodule/component1 时,模块内定义的路径应该为component1 。
同一时候将原RouterModule.forRoot(Routes) 改为RouterModule.forChild(Routes)
将原应用的诸多组件依照上面的方法分为不同模块后,就能够进行下一步懒载入了。
懒载入
懒载入路由
在根路由中。将原url与component的关联改为url与loadChild关联就可以。
比方
//*********原方案
//app.routing.ts
const routes: Routes = [
{path:'component1', component:Component1}
]
//********新方案
// new app.routing.ts
const routes: Routes = [
{path:'testmodule', loadChild:'app/modules/testmodule/testmodule.module#TestModule'}
]
// testmodule.routing.ts
cost moduleRoutes: Routes = [
{path:'component1',component1:Component1}
]
这样对于/app/testmodule/component1 地址,应用首先会载入testmodule,然后,由testmodule模块载入component1组件,完毕页面载入。
模块载入策略
上文的loadChild 起到了载入模块的作用,仅在用户点击模块下的链接时。程序才開始下载模块相应的js文件,然后再渲染出来。若希望用户在还未点击页面的时候,就从后台预先载入该模块的js。能够进行例如以下改动:
// app.routing.ts
//原代码
@NgModule({
imports:[RouterModule.forRoot(routes)]
exports:[RouterModule]
})
//改为
@NgModule({
imports:[RouterModule.forRoot(routes), {preloadingStrategy:PreloadAllModules}]
exports:[RouterModule]
})
这样程序会在首页资源载入完毕后,在后台自己主动下载其余模块的资源。这样,用户在进入其他模块页面的时候。不须要等待js资源的下载,同一时候首页打开速度仍然和仅载入首页模块一样快。
须要注意的一点
在根模块的imports声明中,不能引入懒载入模块,否则,会被打包工具打入首页包中,这样懒载入就没有效果了。
效果对照
(非专线网络。请忽略网络实际载入时间~~~~)
模块区分以及懒载入优化前
图中main.js文件保存了全部页面的代码。体积达到134k之大。整个首页js资源总共350k左右。
模块区分以及懒载入优化后
因为我在首页仍然保留了4个页面。所以首页包仍然有76.3k,单页缩小了近一半。同一时候能够看到多出来的x.chunk.js文件,这些就是懒载入的模块(我使用了PreloadAllModules策略,因此会将全部模块下载下来)。
优化前后。页面点击效果全然一样。
进一步优化SPA的首屏打开速度(模块化与懒载入) by 嗡的更多相关文章
- vue-cli项目优化,缩短首屏加载时间
1.大文件定位 我们可以使用webpack可视化插件Webpack Bundle Analyzer 查看工程js文件大小,然后有目的的解决过大的js文件. 安装:npm install --save- ...
- Vue SPA 首屏加载优化实践
写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui ...
- angular 首屏优化
前一段时间把公司的一个angular项目做了一次大的优化,记录一下过程. 起因: 起因是用户反映网站加载时间过长,从loading画面显示到页面可响应要13s,对于一般的页面恐怕没有用户愿意等待这么久 ...
- 技术干货:实时视频直播首屏耗时400ms内的优化实践
本文由“逆流的鱼yuiop”原创分享于“何俊林”公众号,感谢作者的无私分享. 1.引言 直播行业的竞争越来越激烈,进过2018年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验.最近正好在做 ...
- react 首屏性能优化
首屏优化点:1.加载包(bundle.js)文件的大小,越小,首屏渲染速度越快 (按需加载) 2.优先渲染用户直观看到的页面部分(懒加载) 技术点:react-loadable . react-laz ...
- 吐血干货,直播首屏耗时400ms以下的优化实践
导读: 直播行业的竞争越来越激烈,进过18年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验.最近在帮做直播优化首开,通过多种方案并行,把首开降到500ms以下,希望能对大家有借鉴. 背景: ...
- 【Vuejs】317- 提升90%加载速度——Vuecli下的首屏性能优化
点击上方"前端自习课"关注,学习起来~,所以接下来还会介绍一些它们在优化上的异同 的话,先安装插件 cnpm intall webpack-bundle-analyzer –sav ...
- 【Vuejs】269- 提升90%加载速度——vuecli下的首屏性能优化
前言 之前用 ,所以接下来还会介绍一些它们在优化上的异同 分析 vuecli 2.x自带了分析工具只要运行 npm run build --report 如果是 vuecli 3的话,先安装插件 cn ...
- Vue项目优化首屏加载速度
Vue项目部署上线后经常会发现首屏加载的速度特别慢:那么有那写能做的简单优化呢 一.路由的懒加载 路由懒加载也就是 把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件. 结合 ...
随机推荐
- java学习笔记11--集合总结
java学习笔记系列: java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Ob ...
- Mysql触发器、模糊查找、存储过程、内置函数
原本觉得Mysql的一些知识还是差不多了,但是在实际上在项目上用的时候,发现什么都忘记了.现在重新回顾一下,顺便做个笔记. 触发器 ...
- JS-得到屏幕宽高、页面宽高
window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeight 返回当前屏幕高度(空白空间) window.screen.width ...
- RS请求错误之RSV-BBP-0028
环境:Version Cognos10.2 单机 非集群 运行报表的时候经常遇到: 错误信息为: The secondary request failed. The requested sessio ...
- 性能调优的Windows窗体DataGridView控件
性能调优的Windows窗体DataGridView控件 . 净框架4.5 在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你 ...
- [Angular-Scaled Web] 6. Navigating between states with ui-router
There are two ways to naviagting between state: 1. Using $state service, $state.go() 2. Using ui-ser ...
- PHP 杂项函数
PHP 杂项 函数 PHP 杂项函数简介 我们把不属于其他类别的函数归纳到杂项函数类别. 安装 杂项函数是 PHP 核心的组成部分.无需安装即可使用这些函数. Runtime 配置 杂项函数的行为受 ...
- SpringMVC配置全局日期转换器,处理日期转换异常
Spring 3.1.1使用Mvc配置全局日期转换器,处理日期转换异常链接地址: https://www.2cto.com/kf/201308/236837.html spring3.0配置日期转换可 ...
- Struts2之文件上传(单文件/多文件)
<一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...
- 【UNIX网络编程】FIFO
管道作为进程间通信的最古老方式,它的缺点是没有名字,因此仅仅能用在有亲缘关系的父子进程之间.对于无亲缘关系的进程间.无法用管道进行通信.FIFO能够完毕无亲缘关系的进程间的通信.FIFO也被称为命名管 ...