angluar的编译有以下几种方式:

ng build  常规的压缩操作    代码体积最大

 ng build --aot   angular预编译      代码体积较小

 ng build --prod   angular预编译    代码体积最小,访问速度最快

--prod 默认 开启了--aot ,所以在使用--prod 和 --prod --aot是一样的。

关于JIT和AOT,复制了知乎上的一段话,讲的很好。

 JIT和AOT的思想都一样。在JAVA中,JIT(Just In Time即时编译)是运行时优化,AOT(Ahead Of Time)是编译时优化。

 什么是运行时优化?举个例子,当虚拟机发现一段代码调用的频率很高,就会将这段代码判定为热点代码,紧接着就会将这段代码直接编译为机器码,从而提高这段代码的运行速度。

 什么是编译时优化?在编译时将所有的代码编译成机器码,这样做会增加编译时间,同时需要占用更多的存储空间,但能够提升程序的性能。

 如果你调试时使用AOT,会增加你的编译时间。特别是项目比较大的时候,每做一次修改,都要编译很久才能验证。因此,调试时不应该使用AOT。

下面转自https://www.jianshu.com/p/2bb307ad94e7

  

  AOT是Ahead of Time compile 的缩写,顾名思义提前编译。

  关于AOT的好处,在这里就不一一细说,更高效,更安全,bla,bla....

  与AOT相对的则是JIT(Just in time),翻译成中文就是即时编译。

  对于浏览器而言,只认识JavaScript代码,什么angular,typescript,html通通不认识。所以需要将我们写好的诸多的angular组件翻译成浏览器认识的语言。所以AOT 和 JIT 的本质区别就是, AOT是一种在构建阶段(build)就将其翻译成JavaScript的过程,而JIT 则是在运行阶段即刻翻译的过程。

  本文重点要说明的是对AOT的使用:

安装依赖包

  AOT编译使用ngc编译器进行编译,他是typescript编译器tsc的高仿品,他们的配置方式几乎一模一样。

npm install@angular/compiler-cli @angular/platform-server--save

  配置文件 tsconfig-aot.json

  ngc需要一个AOT专用配置文件。

{
"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
}
}

  对比JIT编译, compilerOption里面只把module改成了es2015.
  真正和ngc有关的配置是angularCompilerOptions部分的内容。 它的genDir属性告诉编译器把编译结果保存在新的aot目录下。"skipMetadataEmit" : true属性阻止编译器为编译后的应用生成元数据文件。 当输出成TypeScript文件时,元数据并不是必须的,因此不需要包含它们。

特别注意: AOT编译要求模板URL和外部cssU URL的值是一个相对于组件类文件的URL值

编译应用

  使用ngc编译器对应用进行编译

node_modules/.bin/ngc -p tsconfig-aot.json

  编译完成后,会生成一个aot目录,目录下面是一组NgFactory文件。每一个工厂文件都会在运行时结合JavaScript所封装的css文件和模板文件,创建对应的组件实例。

启动应用(bootstrap)

  启动应用时候,从原来引导AppModule改成了引导工厂模块AppModuleNgFactory.

配置build命令

  1. package.json 里面添加

"build": npm run build:aot"

总结

  开发器使用JIT, 产品期使用AOT

推荐文章:

  (一) JIT 与 AOT的区别 https://segmentfault.com/a/1190000008739157

  (二) 官方文档 https://angular.cn/guide/aot-compiler

ng build --aot 与 ng build --prod的更多相关文章

  1. vue-cli脚手架build目录中的build.js配置文件

    该随笔收藏自: vue-cli脚手架build目录中的build.js配置文件 这个配置文件是命令npm run build 的入口配置文件,主要用于生产环境 由于这是一个系统的配置文件,将涉及很多的 ...

  2. 不知道张(zhāng)雱(pāng)是谁?你out了!

    张(zhāng)雱(pāng)是谁?也许你已经听说过了,也许你还没听说过呢,不过你一定听说过老刘——刘强东,没错,这二人是有关系的,什么关系,京东是老刘的,而张雱呢?张雱是京东旗下52家关联公司法人代 ...

  3. Build Error 6041: Internal build error

    Note: Following content is reprinted from the Original article Flexera : Build Error 6041. Only for ...

  4. Angular6之ng build | ng build --aot | ng build --prod 差异

    由于写了大半年的项目终于要告一段落并且即将进行第二阶段优化开发,emmm 基础版本已经二十多个模块了,必不可少的优化是很重要的,尽管项目上使用多层嵌套懒加载,但是在首屏加载的时候,任然很慢啊,因为一直 ...

  5. vue-cli脚手架build目录中的webpack.prod.conf.js配置文件

    // 下面是引入nodejs的路径模块 var path = require('path') // 下面是utils工具配置文件,主要用来处理css类文件的loader var utils = req ...

  6. build.gradle(Project) 和 build.gradle(Module) 的区别

    参考: http://stackoverflow.com/questions/28295933/difference-between-build-gradleproject-and-build-gra ...

  7. NDK Build 用法(NDK Build)

    1.ndk-build的用法 Android NDKr4引入了一个新的.小巧的shell脚本ndk-build,来简化源码编译. 该文件位于NDK根目录,进入你的工程根目录或子目录之后,在命令行下调用 ...

  8. InstallShield Build错误:Internal build error 6041

    点击左侧菜单: Media-Release-选择release版本(例如Release1)-Build标签-   keey unused directories 改为no(默认为yes)

  9. jenkins的slave没有执行build,slave执行build失败

    1.slave的build配置如下 2.但是从控制台输出日志来看,pre steps和post steps都执行了,但是build没有执行 3.最后的错误信息如下: ERROR: Failed to ...

随机推荐

  1. linux-2.6.38poll机制简析(以tiny6410按键中断程序为基础)

    一.应用程序 /* struct pollfd { int fd; //文件描述符 short events; //表示请求检测的事件 short revents; //表示检测之后返回的事件 }; ...

  2. linux—-远程连接——管理工具

    1,linux服务器需要安装ssh服务端,端口一般22 2,使用ssh客户端连接linux服务器: 常用工具: putty xshell 3,上传文件工具: 使用sftp,linux需要安装sftp服 ...

  3. 移动端meta常用的设置

    1.qq强制横屏或者竖屏显示    :   <meta name="x5-orientation" content="portrait ||andscape&quo ...

  4. (转)为什么收到三个重复的ACK意味着发生拥塞?

    三次重复的ACK,可能是丢包引起的,丢包可能是网络拥塞造成的,也可能是信号失真造成的. 三次重复的ACK,也有可能是乱序引起的,而乱序和网络拥塞没有直接关系. 如果就写这两行,感觉什么都没写,接下来的 ...

  5. 为什么说Redis是单线程的以及Redis为什么这么块

    一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看似 ...

  6. mysql查询疯狂41例

    援引自 http://www.cnblogs.com/wupeiqi/articles/5748496.html 一.表关系请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生 ...

  7. localstorage ie11不支持

    据我所知,localstorage在高版本的ie.谷歌.火狐下都是支持的,以前没在ie上看过,不清楚,今天我用ie11打开我vue编译后的html,竟然发现不支持localstorage了,用仿真的i ...

  8. [转]Normal Map中的值, Tangent Space, 求算 Tangent 与 Binormal 与 TBN Matrix

    原文出处 https://www.cnblogs.com/lookof/p/3509970.html - Normal Map中的值 -   有没有想过,Normal Map(法线贴图)为什么看上去都 ...

  9. ACM-ICPC 2016 大连赛区现场赛 K. Guess the number && HDU 5981(思维+DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5981 题意:A在[L, R]之间随机选取一个数X,之后B来猜这个数,如果猜的数比X小,那么A就告诉B猜 ...

  10. Codeforces Round #588 (Div. 2) C. Anadi and Domino(思维)

    链接: https://codeforces.com/contest/1230/problem/C 题意: Anadi has a set of dominoes. Every domino has ...