进一步优化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策略,因此会将全部模块下载下来)。

优化前后。页面点击效果全然一样。

时间: 2024-08-02 11:00:32

进一步优化SPA的首屏打开速度(模块化与懒载入) by 嗡的相关文章

进一步优化SPA的首屏打开速度(模块化与懒加载) by 嗡

前言 单页应用的好处在于一次载入所有页面资源,利用本地计算能力渲染页面,提高页面切换速度与用户体验.但缺点在于所有页面资源将被一次性下载完,此时封装出来的静态资源包体积较大,使得第一次打开SPA页面时候需要的载入时间较长. 在上一篇文章Angular2 单页应用一些优化总结 中提到的利用压缩.混淆.开启gzip传输后,我们成功将3.5兆的资源包压缩到350k.但是如果SPA应用的页面数进一步增加,100个甚至1000个页面的时候,还是无法避免巨大的首页资源包加载的问题.所以350k的资源包是否还

前端项目首屏加速 gzip打包 路由懒加载 cdn资源优化

目前主流的Vue, React 等单页项目中 build 把所有开发遇到的代码打包在一起形成一个js和一个css, 服务器请求, 然后加载js, css 等依赖进行渲染. 因此会经常遇到,个人写的项目,打开十分缓慢,需要加载很长时间才能加载完毕. 就算不是白屏,做了loading处理 但还是会很影响体验 排除服务器带宽实在太低, 服务器压力实在太大, 文件的大小是速度的第一影响. gzip打包 gzip打包很好理解. 请求的东西可以通过压缩的方式, 到了客户端再解压 采用nginx即可 配置方案

Vue SPA 首屏加载优化实践

写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui , ajax方案选用 axios, 并引入 vuex ,使用 vuex-router-sync 将 router 同步到 store ,服务器使用本地Nginx服务. 构建项目 vue-init webpack vue-spa-starter-kit cd vue-spa-starter-kit n

网站打开速度慢的原因,排查方法及优化方法

如果你的网站打开速度过慢,而你又不知道该如何解决,那么这篇文章是非看不可了.手把手的教你如何排查网站打开慢的原因,以及优化方法. 排查网站打开速度慢的原因: 1 网站服务器速度或租用空间所在服务器速度服务器空间速度是网站打开速度快的硬件基础,也是先决条件.否则即使你网站页面设计的非常"苗条",网站打开速度也会打折扣.解决办法:要找你的空间商解决或换空间商. 如何检测服务器速度快慢呢? 方法一: ping命令看连接到服务器的时间和丢包情况. 1>单击"开始"键并

技术干货:实时视频直播首屏耗时400ms内的优化实践

本文由"逆流的鱼yuiop"原创分享于"何俊林"公众号,感谢作者的无私分享. 1.引言 直播行业的竞争越来越激烈,进过2018年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验.最近正好在做直播首开优化工作,实践中通过多种方案并行,已经能把首开降到500ms以下,借此机会分享出来,希望能对大家有所启发. 本文内容的技术前提: 1)基于FFmpeg的ijkplayer,最新版本0.88版本: 2)拉流协议基于http-flv. http-flv更稳定些,国内

vue项目首屏加载优化实战

问题 单页面应用的一个问题就是首页加载东西过多,加载时间过长.特别在移动端,单页面应用的首屏加载优化更是绕不开的话题.下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步. 我的项目vue-cli3构建的,vue+vue-router+vuex,UI框架选用 element-ui,ajax方案选用 axios,服务器使用Nginx.用到的这些技术都是现在用的比较广泛的,看到这篇文章,我估计你和我用的技术应该差不多. 第一步:webpack-bundle-analyzer 分析 首页

基于图像识别测试手机浏览器打开网页首屏时间的方法

本文涉及性能测试技术,特别是涉及一种基于图像识别的测试手机网页首屏时间的方法,它可以应用在手机浏览器页面加载响应时间的的自动化测试或性能检测中.同时可以应用到其他android的apk的响应时间的测试中去 随着智能手机等移动终端的发展,越来越多的用户开始通过手机等设备浏览网页,以获取用户所需的信息. 用户使用手机访问网站是基于手机浏览器所获取的网页实现的.通常情况下,用户访问网站的页面全部加载完毕时,总页面高度可能有一屏到多屏不等,总的页面加载时间要比首屏加载时间长很多,但是首屏加载时间是用户对

SPA应用部署时首屏启动慢问题解决方案

SPA应用部署时首屏启动慢问题解决方案 使用vuejs开发的单页应用,打包部署上线后,发现首屏启动时间达到了惊人的10s左右,于是开始优化,目前使用到的总结如下: 巧用webpack插件 1.抽取css文件 new ExtractTextPlugin({ filename: '[name].[hash].css', allChunks: true }), 2.模块化抽取 new webpack.optimize.CommonsChunkPlugin({ // name: 'vendors', /

Citrix XenDesktop Studio 7.x & StoreFront控制台打开速度慢终极优化

部署过CitrixXenDesktop的同学们都知道,Studio控制台与StoreFront控制台某些时候打开慢的那叫一个纠结啊,尤其是等待排除某些问题的时候,等待是很煎熬的,好了废话少说,下面我来给大家说一下Studio的优化,不是很快吧,起码比不优化能节省上很长时间. 这些优化设置建议在部署Citrix环境的时候做到模板中,这样就避免了出来后一台一台修改 优化步骤 1. IE设置 Citrix XenDesktop现在也开始走我大微软的路子,默认内部的很多通讯采用Powershell,WS