为什么需要编译

Angular应用中包含的组件、HTML模板(比如:@Directive、@Component、@NgModule、@Pipe)很多都是JS VM无法解析的,所以在浏览器渲染应用之前,组件和模板必须要被Angular编译器转换为可以执行的JavaScript。

angular2编译模式

在 Angular 2 中有两种编译模式:

  • JIT - Just-In-Time
  • AOT - Ahead-Of-Time

JIT事件流:
开发流程:

  • 使用TypeScript开发Angular应用(此处以ts举例)
  • tsc编译
  • 构建
  • 压缩
  • 部署

用户打开浏览器,他将经历以下步骤 (没有严格的CSP):

  • 下载所有的JavaScript资源
  • 启动Angular
  • 通过JIT 编译处理生产js代码
  • 渲染应用

AOT事件流:

  • 使用Typescript开发Angular 应用
  • 使用 ngc来编译应用(目前的ngc编译报错还不太好用,angular团队正在用tsc的方式进行优化,据说很快就会发包)
    • 模板会被ngc编译成TypeScript文件(通常是)
    • TypeScript编译为JavaScript代码
  • 构建
  • 压缩
  • 部署

用户打开浏览器,他将经历以下步骤:

  • 下载所有的资源
  • 启动Angular
  • 渲染应用

aot将compile的过程放在应用部署前,所以浏览器端承载的工作量就会大幅度减少,相应的页面加载时间也会大幅度减少,这也就意味着更快更好的用户体验。

JIT vs AOT:

编译方式 编译时机 构建速度 打包大小 性能/渲染速度 模板错误检查时间 安全性
JIT app运行时 - - app运行时
AOT app构建阶段 - 更快 app构建阶段

AOT优势:

  • 渲染得更快
    使用AOT,浏览器下载预编译版本的应用程序。 浏览器直接加载运行代码,所以它可以立即渲染该应用,而不用等应用完成首次编译,我们两个项目AOT加载速度相比JIT有3-5倍的提高

  • 需要的异步请求更少
    编译器把外部HTML模板和CSS样式表内联到了该应用的JavaScript中。 消除了用来下载那些源文件的Ajax请求。

  • 需要下载的Angular框架体积更小
    如果应用已经编译过了,自然不需要再下载Angular编译器了。 该编译器差不多占了Angular自身体积的一半儿,所以,省略它可以显著减小应用的体积。但是angular采用 Code Generation 的方式,生成的 ts/js 代码肯定是会比原来的 html 的文件大小要大的,所以在应用足够大(模版足够多)的情况下 AOT 的大小是可以反超 JIT 的大小的,很不幸,我们项目就是如此

  • 提早检测模板错误
    AOT编译器在构建过程中检测和报告模板绑定错误,避免用户遇到这些错误。

  • 更安全
    AOT编译远在HTML模版和组件被服务到客户端之前,将它们编译到JavaScript文件。没有模版可以阅读,没有高风险客户端HTML或JavaScript可利用,所以注入攻击的机会较少

JIT优势:
编译时间短,除非确实有动态组件的需求,否则jit唯一的优势就是能用来做在线 Demo和开发调试,参考知乎答案

懒加载

懒加载也叫延迟加载,即在需要的时候进行加载,随用随载

在单页面应用中,如果没有应用懒加载,进入首页时会导致需要加载的内容过多,延时过长,不利于用户体验

运用懒加载将页面进行划分,按需加载页面,可以分担首页所承担的加载压力,减少加载用时

如果对首屏启动有更严格的要求,最好采用服务端渲染

angular2懒加载可以参考官方文档

摇树优化:

作用:消除unused code
原理:通过跟踪import和export语句进行静态分析,排除那些被导出过但又从未被导入的代码(ES6 modules 的静态特性)

目前大部分工具只能对ES2015模块摇树,因为那里有import和export语句,所以需要将ts编译成es2015(通过tsconfig配置实现)

  • 摇树优化详细介绍可以参考angular官方文档
  • gulp+rollup摇树优化可以参考angular-seed
  • webpack2自带了tree-shaking,配置可以参考工程angular-starter
  • angular-cli搭建工程:推荐使用,已经帮你集成,不需要再去繁琐配置各种打包摇树优化等

webpack2的摇树和rollup摇树区别可以参考知乎上这个回答

webpack2注意事项

项目目前使用的是webpack2,总结了下开发过程中遇到的坑:

  • ngc-webpack不要设置resourceOverride,否则打包后的图片url等会有问题
  • “JavaScript heap out of memory”可以通过设置node参数 node –max_old_space_size=4096(如不管用,参数可以设置更大试试)
  • typescript使用2.0以上版本(摇树需要)
  • 使用awesome-typescript-loader包的2.x及以上版本(摇树需要)
  • 保证我们的应用和Angular2库代码在同一个位置(摇树需要)
  • UglifyJsPlugin压缩代码, Webpack2可以删除Bundle中未使用的引用代码,但不会从Bundle中删除未使用的代码,在这种情况下就需要使用UglifyJsPlugin,它能够智能的移除未使用的代码
  • 使用AOT在build时,浏览器渲染快,但是在模板足够多的情况下大于jit打包体积,配合gzip使用最佳,项目使用的是nginx,gzip在nginx详细配置可参考这篇文章

AOT注意事项

由于AoT的特性,部分在JIT模式下可用的方法在AoT下是不可行或者官方不建议的,开发代码的童鞋在aot模式下需要注意额外注意这些情况,github上8000+star的angular-starter工程总结如下(英文捉急,就不在这献丑翻译了):

  • Don’t use require statements for your templates or styles, use styleUrls and templateUrls, the angular2-template-loader plugin will change it to require at build time.
  • Don’t use default exports.
  • Don’t use form.controls.controlName, use form.get(‘controlName’)
  • Don’t use control.errors?.someError, use control.hasError(‘someError’)
  • Don’t use functions in your providers, routes or declarations, export a function and then reference that function name
  • @Inputs, @Outputs, View or Content Child(ren), Hostbindings, and any field you use from the template or annotate for Angular should be public

补充一些我们项目开发过程中遇到的问题,O(∩_∩)O 都是开发时代码不规范埋下的坑:

  • 定义的函数传参必须匹配
  • 等和非等判断类型必须一致
  • 未在ts定义的变量不要在html模板中使用

总结

推荐大家在dev时使用jit可以提高开发调试效率,在prod时使用aot

参考:
http://blog.mgechev.com/2016/08/14/ahead-of-time-compilation-angular-offline-precompilation/
http://blog.rangle.io/optimize-your-angular2-application-with-tree-shaking/

angular jit and aot相关推荐

  1. JIT和AOT编译详解

    JIT和AOT编译介绍 JIT - Just-In-Time             实时编译,即时编译 通常所说的JIT的优势是Profile-Based Optimization,也就是边跑边优化 ...

  2. Angular 2 JIT vs AOT

    转载于:https://segmentfault.com/a/1190000008739157 在 Angular 应用程序中,包含了我们通过 Angular 提供的 API 实现的自定义指令.这些自 ...

  3. JIT VS AOT

    一.AOT,JIT是什么 JIT,即Just-in-time,动态(即时)编译,边运行边编译:AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式 理解 jit.aot 程序主要有两 ...

  4. aot android,android – JIT与AOT编译

    我不是完全家喻户晓的,如何在实践中 Android上的Dalvik JIT工作,因为JIT有几个选择可以如何工作. 第一个选择是,在应用程序启动时,JIT将所有字节码转换为CPU指令.此选项在应用程序 ...

  5. 【JAVA】JIT和AOT

    JIT和AOT 目前,程序主要有两种运行方式:静态编译与动态解释. 静态编译的程序在执行前全部被翻译为机器码,通常将这种类型称为AOT (Ahead of time)即 "提前编译" ...

  6. Java在云原生的破局利器——AOT(JIT与AOT)

    导读 JIT(Just-in-Time,实时编译)一直是Java语言的灵魂特性之一,与之相对的AOT(Ahead-of-Time,预编译)方式,似乎长久以来和Java语言都没有什么太大的关系.但是近年 ...

  7. ART、JIT、AOT、Dalvik之间有什么关系?

    2019独角兽企业重金招聘Python工程师标准>>> JIT与Dalvik JIT是"Just In Time Compiler"的缩写,就是"即时编 ...

  8. android将引入aot编译器,JIT与AOT编译模式

    JIT,即Just-in-time,动态(即时)编译,边运行边编译: AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式 JIT ​ JIT,即"Just In Time ...

  9. java aot,Java三种编译方式: 前端编译 JIT编译 AOT编译

    java程序代码需要编译后才能在虚拟机中运行,编译涉及到非常多的知识层面:编译原理.语言规范.虚拟机规范.本地机器码优化等:了解编译过程有利于了解整个Java运行机制,不仅可以使得我们编写出更优秀的代 ...

最新文章

  1. 读科研文献也能泄露隐私,用户发现爱思唯尔PDF阅读器收集用户信息
  2. Windows Server 2008 R2使用LDP恢复已删除的用户实战
  3. python读取文件多行内容-Python读取文件、大文件和指定行内容的几种方法
  4. exit() 与_exit的区别
  5. Attention和增强RNN (Attention and Augmented Recurrent Neural Networks)
  6. Vue过渡 动画混入
  7. java rgb转yuv_【转】总结各种RGB转YUV的转换公式
  8. 2018-2019-2 网络对抗技术 20165303 Exp4 恶意代码分析
  9. 给模型自动赋予贴图代码
  10. Akka 2 Actor 源码
  11. Extjs5.0从入门到实战开发信息管理系统视频教程
  12. 计算机一级cad试题,全国计算机等级考试一级试题与答案(25套)(1)2
  13. 【Excel】多元一次方程组求解计算器
  14. 使用linux批量引物设计,primer3引物设计详解
  15. 腾创秒会达视频会议系统软件 安卓
  16. 如何快速高效的进入新的知识领域
  17. java excel 筛选_Java 在Excel中设置筛选器
  18. 海外游戏广告投放操作技巧
  19. 流利说英语level4_英语流利说懂你英语 Level4 Unit1 Part1 Vocabulary
  20. css 特效实现方法

热门文章

  1. 七牛云 转码_七牛上传视频并转码
  2. 深度讲述6款 “数据分析” 工具,告诉你数据分析应该学这个!
  3. 用Python画雪景图
  4. 程序员电脑组装_认准英特尔EVO认证,买笔记本电脑不掉坑
  5. win7开机黑屏怎么解决?win7开机黑屏出现reboot and select的解决方法
  6. python——输入出生和月,计算出接下来的生日距离今天还有多少天
  7. html倒计时还有多少天,倒计时(距离活动结束还有X天X小时X分X秒)
  8. 昆仑通态TPC7022Nt物联网屏试用
  9. 小米6Android多少,小米6
  10. Chrome浏览器禁用自动刷新