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