我爱编程

angular2 JIT and AOT

2017-07-03  本文已影响0人  OnePiece索隆

为什么需要编译

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

angular2编译模式

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

JIT事件流:
开发流程:

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

AOT事件流:

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

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

JIT vs AOT:

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

AOT优势:

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

我们两个项目AOT和JIT对比效果:
项目A:

编译方式 打包大小 渲染速度
JIT 5.86M
AOT 10.8M

项目B:

编译方式 打包大小 渲染速度
JIT 4.12M
AOT 6.21M

官方在View 和 DI 上了 View Engine 后aot编译后没有太多静态文件了,目前aot的编译大小已经低于jit(2017/10/19更新)

懒加载

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

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

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

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

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

摇树优化:

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

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

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

webpack2注意事项

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

AOT注意事项

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

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

总结

推荐大家在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/

上一篇 下一篇

猜你喜欢

热点阅读