[转]Angular4首页加载慢优化之路
本文转自:https://blog.csdn.net/itest_2016/article/details/80048398
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
版权声明:本文为博主原创文章,转载请附上博文链接!
[转]Angular4首页加载慢优化之路的更多相关文章
- vue-cli3项目首页加载速度优化(cdn加速,路由懒加载,gzip压缩)
今天打算上线vue的单页面项目,上线后,首页加载速度巨慢! 原因是项目上线后,网速不够快,加载js,css等资源很慢, 打开打包好的文件发现chunk-vendors.xxxxxxx.js的包很大,达 ...
- 如何对vue项目进行优化,加快首页加载速度
上个月上线了一个vue小项目,刚做完项目,打包上线之后,传到服务器上发现首页加载巨慢. 由于开发时间比较紧,我想着怎么快怎么来,因而在开发过程中没考虑过优化性能问题,酿成最后在带宽5M的情况下页面加载 ...
- vue-cli3项目优化首页加载过慢的一些心得
博主最近发现vue-cli3项目做完后,点击首页加载时间好久啊,一般都要3-5s.这样的加载时间博主自己都受不了,所以就有了这个随笔,将自己的一些研究心得分享给大家. 首先推荐大家下载一个webpac ...
- Vue 网站首页加载优化
Vue 网站首页加载优化 本篇主要讲解 Vue项目打包后 vendor.js 文件很大 如何对它进行优化 以及开启Vue的压缩 和 nginx gzip 压缩的使用, 其他就是对接口优化等 1. v ...
- 记一次cocos项目的加载速度优化
半个月前,我们用cosos creator做了一个简单的小游戏,也许算不上小游戏吧..一边学cocos,一边做,几经波折后终于上线了.然鹅,功能是实现了,但是加载速度十分感人(毕竟没经验嘛,无辜脸). ...
- jQuery Pjax – 页面无刷新加载,优化用户体验
pjax 是 HTML5 pushState 以及 Ajax 两项技术的简称,综合这两个技术可以实现在不刷新页面的情况下载入 HTML 到当前网页,带给你超快速的浏览器体验,而且有固定链接.标题以及后 ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...
- React 16 加载性能优化指南
关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已经成为了一个老生常谈的问题. 但随着 React 16 和 Webpack 4.0 的发布,很多过去的优化手段 ...
- react 首页加载loading
首页加载loading,放在#root里面,代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...
随机推荐
- 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算
1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...
- 内存栅栏(memory barrier):解救peterson算法的应用陷阱
最近一个项目中用到了peterson算法来做临界区的保护,简简单单的十几行代码,就能实现两个线程对临界区的无锁访问,确实很精炼.但是在这不是来分析peterson算法的,在实际应用中发现peterso ...
- Android 极光推送造成IM服务绑定失败bug
由于极光推送对8.0的支持问题,升级到了最新版本的极光推送.但是最新版本的极光推送,默认将推送服务设置到了新的进程里面,由此引发 Android 极光推送多进程造成的application运行两次 和 ...
- win32控制台程序 宽字符与短字符转化
由于vs各版本之间存在字符设置不兼容问题,特总结char与tchar的互相转换函数,如下,在之后的工程中可以使用. void TcharToChar(const TCHAR * tchar, char ...
- 【腾讯Bugly干货分享】iOS App 签名的原理
本文来自 WeRead 团队博客: http://wereadteam.github.io/ iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,Ce ...
- 【红色警报】XXE 高危漏洞将大面积影响微信支付安全,可能导致系统沦陷,请升级你的系统!
今天,微信支付发布了一则紧急通知: 尊敬的微信支付商户: 您的系统在接受微信支付XML格式的商户回调通知(支付成功通知.退款成功通知.委托代扣签约/解约/扣款通知.车主解约通知)时,如未正确地进行安全 ...
- webpack之牛刀小试 打包并压缩html、js
1.创建项目文件夹test,在文件夹下创建src文件夹用来存放源码,在src文件夹下创建index.html/index.js两件文件. 我们的最终目的是将这两个文件打包压缩并输出到/test/dis ...
- 基于TensorFlow的深度学习系列教程 1——Hello World!
最近看到一份不错的深度学习资源--Stanford中的CS20SI:<TensorFlow for Deep Learning Research>,正好跟着学习一下TensorFlow的基 ...
- [Postman]生成代码段(17)
在Postman中完成并保存您的请求后,您可能希望从您自己的应用程序发出相同的请求.Postman允许您生成各种语言和框架的代码片段,以帮助您实现此目的.您需要单击蓝色发送按钮下的**代码**链接以打 ...
- lua模块demo(redis,http,mysql,cjson,本地缓存)
1. lua模块demo(redis,http,mysql,cjson,本地缓存) 1.1. 配置 在nginx.conf中设置lua_shared_dict my_cache 128m; 开启ngi ...