众所周知, angular
应用在可执行以前, angular
应用中的组件和模板必须被转化为能够被浏览器识别的javascript
代码, 而这种转化正是经过angualr
自身的编译器所执行的.javascript
angular提供了两种编译方式, 即AOT
(预编译)和JIT
(即便编译), 其中JIT
为默认的编译方式java
AOT即 Ahead of time
, 是指在构建时进行编译, 即在服务端即完成了编译 JIt即 Just-in-Time
, 在运行期间编译该应用,也就是在应用加载时。node
实际上只有一个编译器,二者的区别只是编译的时机和工具不一样webpack
JIT编译致使运行期间的性能损耗。 因为须要在浏览器中执行这个编译过程,视图须要花更长时间才能渲染出来。 因为应用包含了Angular编译器以及大量实际上并不须要的库代码,因此文件体积也会更大。 更大的应用须要更长的时间进行传输,加载也更慢。web
编译能够发现一些组件模板绑定错误。JIT编译在运行时才揭露它们,那样有点太晚了。npm
而预编译(AOT)会在构建时编译,这样能够在早期截获模板错误,提升应用性能。json
#JiT编译模式的流程bootstrap
一个典型的jiT
应用的开发流程大概是:浏览器
TypeScript
开发Angular应用tsc
来编译这个应用的ts代码一旦把app部署好了,而且用户在浏览器中打开了这个app,下面这些事情会逐一进行:bash
Angular
启动Angular
在浏览器中开始JiT
编译的过程,例如生成app中各个组件的js代码相对的,使用AoT
模式的应用的开发流程是:
TypeScript
开发Angular
应用ngc
来编译应用
Angular
编译器对模板进行编译,生成TypeScript
代码TypesScript
代码编译为JavaScript
代码虽然前面的过程稍稍复杂,可是用户这一侧的事情就变简单了:
Angular
启动归纳起来,Angular
中的Jit
和AoT
的主要区别是:
JiT
生成的是JS
代码,而AoT
生成的是TS
代码。这主要是由于JiT
是在浏览器中进行的,它彻底不必生成TS
代码,而是直接生产了JS
代码。npm
依赖npm install @angular/compiler-cli @angular/platform-server --save
复制代码
把下列npm便利脚本添加到package.json中,以便用一条命令就能够完成编译
"build:aot": "ngc -p tsconfig-aot.json 复制代码
用@angular/compiler-cli
包中提供的ngc
编译器来代替TypeScript
编译器(tsc)。
tsconfig-aot.json
文件只需将
tsconfig.json
文件复制过来进行修改便可
{
"compilerOptions": {
"target": "es5",
"module": "es2015",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["es2015", "dom"],
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true,
"typeRoots": [
"./node_modules/@types/"
]
},
"files": [
"src/app/app.module.ts",
"src/main.ts"
],
"angularCompilerOptions": {
"genDir": "aot",
"skipMetadataEmit" : true
}
}
复制代码
compilerOptions
部分只修改了一个属性:**把module设置为es2015
(为后面摇树优化作准备)
ngc
区真正新增的内容是底部的angularCompilerOptions
。 它的genDir
属性告诉编译器把编译结果保存在新的aot
目录下
"skipMetadataEmit" : true
属性阻止编译器为编译后的应用生成元数据文件。 当输出成TypeScript文件时,元数据并非必须的,所以不须要包含它们。
node_modules/.bin/ngc -p tsconfig-aot.json
复制代码
编译完成后生成了一堆NgFactory
文件,不要编辑这些NgFactory!从新编译时会替换这些文件.
main.ts
文件从platformBrowserDynamic.bootstrap
改为使用platformBrowser().bootstrapModuleFactory
并把AppModuleNgFactory
的AOT编译结果传给它。
import { platformBrowser } from '@angular/platform-browser';
import { AppModuleNgFactory } from '../aot/src/app/app.module.ngfactory';
console.log('Running AOT compiled');
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);
复制代码
摇树优化是指经过跟踪import
和export
语句来对应用进行静态分析,遍历依赖图谱,而且摇掉用不到的代码,经过移除源码和库代码中用不到的部分,摇树优化能够大幅缩减应用的下载体积
摇树优化可以在咱们最终的Bundle
中移除掉咱们应用中没有使用到的代码。这是减小应用程序占用空间的最有效的技术之一。
目前webpack2已经支持tree shaking
, 官网介绍的是Rollup在angular中的使用
目前,AOT编译和摇树优化对开发来讲,占用的时间太多了。这将在将来获得改变。 当前的最佳实践是在开发器使用JIT编译,而后在发布产品前切换到AOT编译