ng build --aot 与 ng build --prod
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。
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命令
- package.json 里面添加
"build": npm run build:aot"
总结
开发器使用JIT, 产品期使用AOT
推荐文章:
(一) JIT 与 AOT的区别 https://segmentfault.com/a/1190000008739157
ng build --aot 与 ng build --prod的更多相关文章
- vue-cli脚手架build目录中的build.js配置文件
该随笔收藏自: vue-cli脚手架build目录中的build.js配置文件 这个配置文件是命令npm run build 的入口配置文件,主要用于生产环境 由于这是一个系统的配置文件,将涉及很多的 ...
- 不知道张(zhāng)雱(pāng)是谁?你out了!
张(zhāng)雱(pāng)是谁?也许你已经听说过了,也许你还没听说过呢,不过你一定听说过老刘——刘强东,没错,这二人是有关系的,什么关系,京东是老刘的,而张雱呢?张雱是京东旗下52家关联公司法人代 ...
- Build Error 6041: Internal build error
Note: Following content is reprinted from the Original article Flexera : Build Error 6041. Only for ...
- Angular6之ng build | ng build --aot | ng build --prod 差异
由于写了大半年的项目终于要告一段落并且即将进行第二阶段优化开发,emmm 基础版本已经二十多个模块了,必不可少的优化是很重要的,尽管项目上使用多层嵌套懒加载,但是在首屏加载的时候,任然很慢啊,因为一直 ...
- vue-cli脚手架build目录中的webpack.prod.conf.js配置文件
// 下面是引入nodejs的路径模块 var path = require('path') // 下面是utils工具配置文件,主要用来处理css类文件的loader var utils = req ...
- build.gradle(Project) 和 build.gradle(Module) 的区别
参考: http://stackoverflow.com/questions/28295933/difference-between-build-gradleproject-and-build-gra ...
- NDK Build 用法(NDK Build)
1.ndk-build的用法 Android NDKr4引入了一个新的.小巧的shell脚本ndk-build,来简化源码编译. 该文件位于NDK根目录,进入你的工程根目录或子目录之后,在命令行下调用 ...
- InstallShield Build错误:Internal build error 6041
点击左侧菜单: Media-Release-选择release版本(例如Release1)-Build标签- keey unused directories 改为no(默认为yes)
- jenkins的slave没有执行build,slave执行build失败
1.slave的build配置如下 2.但是从控制台输出日志来看,pre steps和post steps都执行了,但是build没有执行 3.最后的错误信息如下: ERROR: Failed to ...
随机推荐
- C#的Lazy与LazyInitializer
class Program { static void Main(string[] args) { //初始化 Lazy 类的新实例 //当延迟初始化发生时,将使用指定的初始化函数和初始化模式 // ...
- StringBuffer常用方法
StringBuffer常用的方法 package com.mangosoft.java.string; /** * 字符串特点:字符串是常量,它们的值在创建之后不能更改. * * 字符串的内容一旦发 ...
- layui 单选框、多选框radio 元素判断是必填项 lay-verify='required'
简单验证复选框,单选框必填 例子代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- linux基础_用户和组的三个文件
1./etc/passwd文件 用户(user)的配置文件,记录用户的各种信息 每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell 2./etc/shadow文件 口令 ...
- Solving Docker permission denied while trying to connect to the Docker daemon socket
The error message tells you that your current user can’t access the docker engine, because you’re la ...
- 不同显卡对mrt 的支持
ios bits限制大概512bits 低端256bits mali 也是bits限制 2017年 Mali-T760 128bits adreno android显卡4 肯定可以 因为deferre ...
- Java实现一行一行读取文件内容(进行编码处理)
// 读取文件内容public String readFile(){ String path = ""; File file = new File(path); StringBui ...
- 通信网络(CCF)【图的遍历】
问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息.信息可以通过中转的方式进行传递,即如果a能将信息 ...
- Luogu P2146 [NOI2015]软件包管理器 树剖
卸载:把子树清空: 安装:把自己到$1$的链改为$1$ #include<cstdio> #include<iostream> #include<cstring> ...
- 在gitlab上删除分支后,本地git branch -r还能看到
1. git remote prune --dry-run origin 查看当前有哪些是该消失还存在的分支 2. git remote prune origin 删除上面展示的所有分支 3. git ...