Angular是一个比较完善的前端MVC框架,包含了模板,数据双向绑定,路由,服务,过滤器,依赖注入等等所有的功能。在Web开发前后端流行的今天,我们在某个项目中也尝试使用该框架。

很快按照官网上的例子搭建了一个标准工程,在项目初期工程文件不是很多的时候,编译、打包、然后运行,访问项目的各个页面都很快。和传统的模板引擎相比这种前后端分离不仅工程化更加成熟(前端、后端开发人员专注自己的领域),而且各个页面加载速度很快,可是说第一次尝到了这种前后端完全分离所带来的好处。但渐渐的我们发现了一个问题,就是首页加载速度越来越慢了如下图:

耗时竟然已经达到了10s,但进入首页后各个页面加载速度依然很快。这时候就不得不分析原因了,其实答案很明显,有2个文件特别大分别是:main.bundle.js(2.3M)、vendor.bundle.js(4M)。而且这2个文件在第一次访问时必须会加载,为什么进入后访问就很快了?进一步分析,看看编译后这2个文件的源码,就能发现main. bundle .js是把我们所有模块自己编写的js都打包到一块了,然后vendor.bundle.js包含了angular的公共库。这样随着我们编写的js代码越来越多,引用的公共库越来越多的时候,页面的加载速度就会越来越慢。由于浏览器本身会缓存这些静态资源文件,而所有的文件都在第一次访问页面的时候都加载了,这样就导致第一次访问特别慢,后续各个页面都很快的奇怪现象。

我们传统web开发时css、js文件,有一个全局和各个模块单独这样划分的。这样等到需要的时候在加载对应css、js文件,加载时间被分摊到各个页面所以就不会出现某个页面加载慢的现象。其实可以类比,在angular中也有类似的优化方法。多模块懒加载便可以达到我们说的这种效果。

优化前我们工程就一个主模块文件(app.module.ts),路由跳转各页面其实都属于该模块一部分

如下图(路由对应各页面其实都是子组件,所以编译时都会被打包到同一个文件):

进行多模块拆分后如下图:

可以看到写法明显不同,每个路由页面其实都是一个单独模块,然后在编译时每个模块都会单独编译成一个文件。而且路由到某个页面时,才会加载该模块js文件。

多模块拆分之前,编译如下图:

拆分后:

关注main.bundle.js文件变成了605kb,然后多了很多chunk.js。这些chunk.js其实就是各个模块编译文件。

具体进行多模块拆分方法如下:

【step1】在工程src/app  目录下新建2个文件,root.module.ts、share.module.ts。

在root.module.ts放一些其它所有模块都要引用的component、service、pipe。对于service需要在providers中对外暴露,其它公共组件、模块在exports中暴露(注意:相同组件、模块不能在多个模块中重复引用,否则编译会报错,可以通过如下方法对外暴露一次)

然后在share.module.ts模块中import root.module.ts。此外该模块会存放一些公共component、service、pipe等会被除了app.module.ts在外其它模块引用。这样做的目地是减少app.module.ts引用公共库大小,在上面编译图中可以发现vendor.bundle.js文件也非常大,这样做的目的是减少该文件的大小(此处大概能优化个10%)。

【step2】

对各个路由模块做如下改造:

以job-record模块为例,如下图:

改造前:

改造后:

可以明显看到增加了2个新文件,job-record-routing.module.ts、job-record.module.ts。这2个文件的用途就是把job-record变成一个真正的子模块。

job-record-routing.module.ts内容如下(该模块路由配置):

job-record.module.ts内容如下(具体模块配置):

job-record目录下其它文件无须修改,对应其它页面都用类似方法做模块拆分。(注意:对于父子页面,由于子页面依赖父页面加载,所以不能这样做拆分。)

【step3】

app.module.ts做如下改下(和原来该模块编写方式对比提到)

进行了多模块拆分后发现,main.bundle.js文件确实变小了很多,已经达到我们预期,而且也不会随着我们自己编写js增加而越来越大了,这时候发现首页访问速度大概加快了30%。此时加载速度如下:

但还是很慢,几乎还需要5s时间,原因是vendor.bundle.js文件还是很大。

vendor.bundle.js都是angular本身依赖的一些公共库,不是我们自己编写的,所以刚刚的多模块优化对它的大小变化几乎没有影响。这是打开该文件可以看到明显没有经过压缩优化。查了一些官网文档和百度发现angular编译果然有优化方式。通过增加编译参数:--prod –aot

编译后发现,竟然报了一堆错误。不过不要惊慌,那是优化编译时对ts语法检查比较严谨,我们代码中很多地方写的不够严谨,只能硬着头皮一行行修改了,此外别无它法。

好不容易解决了上面优化报错地方。这时优化编译也过了,然后首页加载速度也是非常快了。可是访问其它页面时会报如下错误:

进一步分析是代码种如下地方报错(压缩后的)

原始报错代码位置如下图。

但仔细分析了此处代码,没有看错有问题地方。结合上面报错,进一步调试发现map相关代码在优化时被压缩没了自然报错,我们优化编译方式都是官方的,而且此处代码也并无问题,猜想可能是该模块没有显示引入。引入如下模块:

import 'rxjs/add/operator/filter';

import 'rxjs/add/operator/map';

import 'rxjs/add/operator/mergeMap';

优化编译后发现问题果然解决了,现在首页访问速度提升了,各个页面访问也没有问题了(如果发现经过优化编译后,还会有其它类似问题,那么很可能就是某些依赖模块没有显示引入导致)。

优化后首页加载速度如下图:

最后部署在正式环境如nginx或tomcat下通过开启gzip压缩会发现静态文件大小还会进一步变小,页面访问速度还会提升。

多模块懒加载-> --prod –aot 优化方式编译 –> 服务端开启gizp压缩。3板斧解决Angular首页加载慢问题。

---------------------

作者:itest_2016

来源:CSDN

原文:https://blog.csdn.net/itest_2016/article/details/80048398

版权声明:本文为博主原创文章,转载请附上博文链接!

angular 首屏加载优化_[转]Angular4首页加载慢优化之路相关推荐

  1. vue按需加载组件_微人事首页加载速度提高了 5 倍,我都做了什么?

    「本文之前发过,但是比较零散,这里我把用到的方案都汇总一下,方便大家索引,有需要的小伙伴可以收藏下方便查找.里边提到的几种方案,大家都可以对照着视频试一下」 ElementUI 按需加载: 服务端开启 ...

  2. jquery 当页面图片加载之后_图片的懒加载和预加载

    一.懒加载 [1.1]什么是懒加载? 懒加载也就是延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1 ...

  3. h5 先加载小图_交互基础:加载的10种类型和应用场景分析

    原文地址:白鹭漫谈(公众号) 作者:白鹭漫谈 目录: 一.为什么需要加载 二.常见的加载场景 三.加载的10种类型和分析 四.总结 一.为什么需要加载? 1 给用户反馈 在上篇<尼尔森10大可用 ...

  4. pythonweb接口优化_记一次 Python Web 接口优化

    优质文章,第一时间送达! 作者:Lin_R 出处:SegmentFault 背景 我们负责的一个业务平台,有次在发现设置页面的加载特别特别地慢,简直就是令人发指 让用户等待 36s 肯定是不可能的,于 ...

  5. win10进程太多怎么优化_用过最好用的Win10优化软件,全方面优化和管理!

    文 | Allen ·  主播 | 蓝儿喵 本文首发:www.zylxb.com Hi,大家好,欢迎来到:无优质,不分享!搜罗君的藏宝阁:优搜罗(id:usouluo),由于公众号改版,建议大家星标置 ...

  6. flutter 页面加载动画_十、Flutter加载动画

    目录 一.效果展示 二.RoundPainter 三.RoundProgress 四.旋转起来 五.停止旋转 一.效果展示 Flutter加载动画.jpg 二.RoundPainter 同上篇文章&l ...

  7. python爬虫动态加载页面_如何爬动态加载的页面?ajax爬虫你有必要掌握

    通过前面几期Python爬虫的文章,不少童鞋已经可以随心所欲的爬取自己想要的数据,就算是一些页面很难分析,也可以用之前介绍的终极技能之「Selenium」+「Webdriver」解决相关问题,但无奈这 ...

  8. babylonjs 分部加载模型_如何使用BabylonJS加载OBJ或STL模型

    BabylonJS(也就是babylon.js,这是一个和three.js类似的WebGL开发框架),更多的用在游戏领域. 本文说明和演示如何使用babylon.js来加载一个标准3d模型文件,如OB ...

  9. Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...

    [Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新) 0 2014-05-07 18:00:06 使用该控件,可以根据url,参数,加载html记录模板(包含 ...

最新文章

  1. 了解下WSDL 端口
  2. python多线程加锁异步处理装饰器
  3. 2016年工作中遇到的问题31-40
  4. JDK1.10+scala环境的搭建之linux环境(centos6.9)
  5. 自动装箱和==和equals
  6. P3206 [HNOI2010]城市建设
  7. java103 101 104 101_编写一个java程序将100,101,102,103,104,105这6个数以数组的形式写入到D:\\test.t...
  8. 是Dubbo不香了吗?阿里为啥又搞一套Spring Cloud Alibaba?
  9. Entity Framework 相关知识点合集
  10. chrome本地文件加载跨域请求
  11. android nfc开发_意法半导体NFC产品线完整 满足多元应用_企业动态_新闻中心
  12. 云智慧压测实战分享之JMeter场景设置与监控
  13. 无法打开登录所请求的数据库 xxxx。登录失败。 用户 'NT AUTHORITY\SYSTEM' 登录失败。...
  14. 网易云音乐播放器缓存文件转换研究
  15. jspstudy oracle,SQL不走索引的几种常见情况
  16. Docker网络之bridge0详解
  17. 动态IP和静态IP地址
  18. PS制作或编辑gif动态图
  19. SpringBoot注解校验validation自定义异常返回错误消息给前端
  20. HTML5期末大作业:温泉酒店网站设计——中国风的温泉酒店网(13页) HTML+CSS+JavaScript 学生web网页制作期末大作业_住宿 旅游 主题酒店

热门文章

  1. 查询Linux充电时间,【充电】Linux学习(二)——常用的linux命令
  2. splitpane如何设置竖条的宽度_如何用 CSS 画三角形和箭头
  3. 好玩Python--分析你的微信好友签名
  4. RancherOS v1.5.0发布
  5. pandas打开csv表格表头错位问题解决
  6. 【WEB2.0】 网页调用QQ聊天(PC+M站)
  7. 使用Spring配合Junit进行单元测试的总结
  8. spring-102-spring全注解快速实现事务
  9. Android(Fragment和Activity之间通信)
  10. iOS平台经典游戏《合金弹头X》上架 售价25元