进一步优化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-07-31 14:22:18

进一步优化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即可 配置方案

网页加载速度优化4--图片懒加载

当前网页设计理念主要以大气简洁主流(文艺小清新网站例外).更多的信息用图片来展示. 由于图片都是高清,所以会影响到网页加载速度.这里我们就用到图片的懒加载(延迟加载)功能. 最快速解决方案:jquery lazyload插件. Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多大图片长页面中延迟加载图片可以加

页面性能优化-原生JS实现图片懒加载

在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的方式叫做图片懒加载,又叫做按需加载或图片的延时加载.这样做的好处是:1.可以加快页面首屏渲染的速度:2.节约用户的流量. 一.实现思路 1.图片img标签自定义一个属性data-src来存放真实的地址. 2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果

抛砖引玉:大型网站性能优化之Javascript异步懒加载技术

懒加载技术是现在许多大型网站的都使用的提高网站性能的方式,它的核心思想是当用户想看页面某个区域时,再加载该区域的数据.这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度. 其实国内很多网站都用到了懒加载技术,比如国内两个大型电商网站的页面都运用到了这项技术: 天猫首页: 京东商品列表页: 最近在学习时,自己写了一个带懒加载功能的电影列表展示页,大家可以先看下页面效果: http://f81236211.w4w7.tumm.top/lazyload/ 然后自己在页面底部写了一个分页功能,页

【java】itoo项目实战之hibernate 懒加载优化性能

在做itoo 3.0 的时候,考评系统想要上线,就开始导入数据了,只导入学生2万条数据,但是导入的速度特别的慢,这个慢的原因是因为导入的时候进行了过多的IO操作.但是导入成功之后,查询学生的速度更加慢,因为底层用了hibernate的hql语句进行查询的,学习过hibernate的人都知道,如果hibernate不设置懒加载的话,只有是有关联的数据都会一次性全部都查询出来,我试了试,查询2万条数据,最深的级联查询是有5层,然后发出来的语句是460条,时间大概是10s.然后就考虑使用lazy进行优

懒加载和预加载---性能优化

懒加载 认识 懒加载是一种按需延迟资源的方式.在加载显示页面时,并不一次性加载所有该页面所需要的图像,对于在可视区域之外的图像,可以等到用户scroll到该区域的时候,再进行加载 实现方式 1.目前已经有很多库实现了懒加载,例如lazysizes,可以考虑使用 2.使用库这样的操作,相当于增加一个需要请求的js文件,增加一次http请求.所以如果能够实现原生的懒加载,能够更好的优化性能: 原生js实现图片懒加载 原理: 页面上图片的src属性设置为空字符串:(也可以设置为一个占位位图) 将真实路

前端性能优化--图片懒加载(lazyload image)

图片懒加载(当然不仅限于图片,还可以有视频,flash)也是一种优化前端性能的方式.使用懒加载可以想要看图片时才加载图片,而不是一次性加载所有的图片,从而在一定程度从减少服务端的请求 什么是懒加载 懒加载怎么个懒法,就是你不想看就不给你看,我也懒得加载出来,懒得去请求.通俗的说就是你不要就不给你,怎么地.举个栗子,比如在进入某个页面的时候,它会有许多的图片,有些图片可能在下面,当我们点进页面但没有滑动下去或没看完整个页面,那么下面的图片就会"没用",加载了也白加载,而且还降低了网页的加

前端优化-图片懒加载

一.什么是懒加载 懒加载技术(简称lazyload)是对网页性能优化的一种方案.lazyload的核心是按需加载,避免网页打开时加载过多资源,让用户等待太久,在适当的时候加载用户需要的资源(这里用户需要的资源指该资源呈现在浏览器可视区域).这里我们主要是对img标签使用懒加载技术,使用jquery的query.lazyload.js库实现. 通俗的讲就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有当图片出现在浏览