前一段时间把公司的一个angular项目做了一次大的优化,记录一下过程。

起因:

起因是用户反映网站加载时间过长,从loading画面显示到页面可响应要13s,对于一般的页面恐怕没有用户愿意等待这么久。因为这是一个在线编辑的工具类的项目,有使用需求的用户只能等待页面加载完成,所以才会反馈到客服那边。

分析:

页面加载时间过长,首先就是要分析到底是哪些环节导致的,工具呢就是用 chrome 开发者工具里 Performance 进行 Record 后根据数据分析。有很多相关的教程贴,此处不做具体操作说明,直接说结果。分析最后得到的数据,Evaluate Script 就花掉了 9s 的时间,主要是花在项目打包下来的几个 xxx.bundle.js 上了。Evaluate Script 这个阶段到底做了什么处理需要花这么久时间呢?查了些资料,翻了下 angular 的官方文档,在预先(AOT)编译一节找到如下说明:

Angular 应用由大量组件及其 HTML 模板组成。 在浏览器渲染应用之前,组件和模板必须由 Angular 编译器转换成可执行的 JavaScript 代码。

Angular 提供了两种方式来编译你的应用:

  1. 即时(JIT)编译,它会在浏览器中运行时编译你的应用

  2. 预先(AOT)编译,它会在构建时编译你的应用。

应该就是这个编译过程花了这么久时间,那么下一步就是实现预先编译,把编译过程从浏览器渲染阶段搬到服务器构建项目的时候。

实现步骤:

开启预编译可参考 angular 官网的介绍: https://www.angular.cn/guide/aot-compiler。

开启预编译后一般会报一大堆错误,不用担心,多半是一些语法问题,常见的有:

  • 调用函数时传递的参数个数、类型与函数声明时不符;
  • 组件内声明为private的变量和函数,不能在模板上引用;
  • 详细内容参考上面的官网预编译介绍;

修改完报错信息,重新构建,刷新页面,duang!!!这次只用了不到 4s 就打开了,用户体验大大提升。

其他优化:

虽然开启预编译以后,问题已经基本得到解决了,但为什么不趁此更全面地优化一下呢?

最终优化项:

  1. angular框架升级至5.1.3;
  2. 通过实现模块懒加载,进一步减少停留在页面 loading 画面的时间;
  3. 分析页面初始化时无需加载的资源、请求数据,全部做延迟加载处理,在使用时进行加载;
  4. 删除废弃的旧组件50多个;
  5. 移除组件内的冗余引用;
  6. 清除引用的无用的静态资源;
  7. 部分不常变动的静态资源进行压缩;

大部分优化都没遇到什么问题,除了模块懒加载这一块,废了不少力气才完成。

要实现模块的懒加载,需要引入路由,而我们这个项目之前并没有用到路由,所以从配置路由开始着手。

首先,决定将项目内的所有弹窗作为一个模块,在进入页面时不加载,调用弹窗时再做加载。

然后查文档,配置路由。路由配置还是比较简单的,但是配完路由后发现,一些弹窗内部会打开其他的弹窗,所以需要多个弹窗能同时打开。

再查文档,找到 第二路由 ,简单配置测试后可以实现多个弹窗同时打开,但光弹窗就三十多个,配置改起来也是麻烦。本以为这样就结束了,没想到又遇到一个问题,当路由导航到当前URL时,路由器会忽略本次导航,这样我们没法更新组件内的内容。

再再查文档,Router 的属性列表里有 onSameUrlNavigation 这么个参数可以让路由器不忽略,同时搭配 Routes 里的 runGuardsAndResolvers 最终实现了,同一路由刷新触发路由导航钩子函数继而更新组件数据。

最终,优化后的首屏加载时间仅为 1s 多,大大超出了之前的期望值,我也在本次项目的优化过程中学到了很多东西。完美!

angular 首屏优化的更多相关文章

  1. Vue 单页应用 的 首屏优化

    对于单页应用,要在一个页面上为用户提供产品的所有功能,在这个页面加载的时候,首先要加载大量的静态资源,这个加载时间相对比较长.所以我们需要做一些相应的优化,减少响应时间,尽快把首屏显示出来. 1.压缩 ...

  2. vue客户端渲染首屏优化之道

    提取第三方库,缓存,减少打包体积 1. dll动态链接库, 使用DllPlugin DllReferencePlugin,将第三方库提取出来另外打包出来,然后动态引入html.可以提高打包速度和缓存第 ...

  3. vue.js 首屏优化

    我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui , ajax方案选用 axios, 并引入 vuex ,使用 vuex-router- ...

  4. react 首屏性能优化

    首屏优化点:1.加载包(bundle.js)文件的大小,越小,首屏渲染速度越快 (按需加载) 2.优先渲染用户直观看到的页面部分(懒加载) 技术点:react-loadable . react-laz ...

  5. vue项目首屏加载优化实战

    问题 单页面应用的一个问题就是首页加载东西过多,加载时间过长.特别在移动端,单页面应用的首屏加载优化更是绕不开的话题.下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步. 我的项目vu ...

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

    本文由“逆流的鱼yuiop”原创分享于“何俊林”公众号,感谢作者的无私分享. 1.引言 直播行业的竞争越来越激烈,进过2018年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验.最近正好在做 ...

  7. react 首屏加载优化

    react 首屏加载优化,原本是在入口HTML文件中加载loading动画,但是部署在测试环境上的时候一直无法显示loading的部分,也是奇怪了,我们测试环境的部署一直跟本地的都不太一样,内外网的转 ...

  8. Vue SPA 首屏加载优化实践

    写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui ...

  9. vuejs学习之 项目打包之后的首屏加载优化

    vuejs学习之 项目打包之后的首屏加载优化 一:使用CDN资源 我们在打包时,会将package.json里,dependencies对象里插件打包起来,我们可以将其中的一些使用cdn的方式加载,例 ...

随机推荐

  1. 认识学习MVC这家伙

    通过最近的学习认识,只能感慨这玩意太强大了! 以前看了一些MVC的入门教程,看入门教程我感觉不能去体会它的强大,可以看看它的扩展点,通过扩展点去真正的试着了解它,体会它的强大. 它的验证.模型绑定提供 ...

  2. stream.fail() eof() EOF

    ifstream infile("student.dat"); while((c=infile.get())!=EOF){}    //EOF的值是-1 但在 #include&l ...

  3. jmeter函数助手(_random、_time)

    jmeter函数助手 __random __time yyyyMMddHHmmdd  时间格式(年月日时分秒) 1.打开函数助手对话框,选项->函数助手对话框 2.生成函数字符串 (1)选择功能 ...

  4. 洛谷P4525 【模板】自适应辛普森法1

    题面 传送门 题解 我似乎连积分都不太熟练→_→ 总之就是对于一个原函数,我们找一个二次函数来近似它,那么有 \[ \begin{aligned} \int_a^bf(x)dx &\appro ...

  5. 【Guava】RateLimiter类

    Guava官方文档-RateLimiter类 原文链接 作者:Dimitris Andreou  译者:魏嘉鹏 校对:方腾飞 RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可 ...

  6. Python之路迭代器协议、for循环机制、三元运算、列表解析式、生成器

    Python之路迭代器协议.for循环机制.三元运算.列表解析式.生成器 一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的 ...

  7. 跟我一起读postgresql源码(五)——Planer(查询规划模块)(下)

    上一篇我们介绍了查询规划模块的总体流程和预处理部分的源码.查询规划模块再执行完预处理之后,可以进入正式的查询规划处理流程了. 查询规划的主要工作由grouping_planner函数完成.在具体实现的 ...

  8. Android 生成xml文件及xml的解析

    1.生成xml文件的两种方式 (1)采用拼接的方式生成xml(不推荐使用) (2)利用XmlSerializer类生成xml文件 package com.example.lucky.test52xml ...

  9. node.js express 启用 https

    服务端和客户端各有一对公钥和私钥,使用公钥加密的数据只能用私钥解密,建立https传输之前,客户端和服务端互换公钥.客户端发送数据前使用服务端公钥加密,服务端接收到数据后使用私钥解密,反之亦如此. 公 ...

  10. Apache 去掉 www

    1 用phpstudy的网友打开“其他选项菜单”- “配置文件”-httpd-conf.找到 #LoadModule rewrite_module modules/mod_rewrite.so 把这一 ...