差異化加載
在構建 Web 應用時,確保你的應用與大多數瀏覽器兼容是目標之一。JavaScript 在不斷發展,新功能不斷推出,不是所有瀏覽器都能以同樣的進度實現這些新功能。這就是編譯和膩子腳本(polyfill)的用武之地。你在開發過程中使用 TypeScript 編寫的代碼會被編譯並打包成一種兼容大多數瀏覽器的格式,通常為 ES5。 膩子腳本用於抹平差距,提供一些老式瀏覽器中根本不存在的功能。
確保這種瀏覽器的兼容性是有代價的,那就是更大的包體積。所有現代瀏覽器都支持 ES2015 及更高版本,但在大多數情況下,你仍然要考慮那些從老式瀏覽器訪問你的應用的用戶。為了最大限度地提高兼容性,你需要發布一個包含所有已編譯代碼的發布包(bundle),以及所有可能會用到的膩子腳本。用戶如果在支持大量最新 JavaScript 特性的現代瀏覽器中使用此應用,他就不應該為這些額外的包體積付出啟動時間和流量等方面的代價。這就是差異化加載發揮作用的地方。
差異化加載是指 CLI 在構建應用時,構建兩個單獨發布包的策略。現代的發布包中包含了現代的語法,利用了現代瀏覽器的內置支持,減少了膩子腳本的運行需求,減小了發布包的大小。第二個發布包中則包含了額外的編譯代碼,所有必需的膩子腳本,並導致了更大的包大小。這個策略允許你繼續構建你的 Web 應用來支持多個瀏覽器,但是只加載相應瀏覽器中必需的代碼。
配置差異化加載
Angular CLI 第 8 版及更高版本已支持構建差異化加載的發布包。工作空間中的每個應用項目,都可以根據其中的 browserslist 和 tsconfig.json 文件來配置發布包的構建方式。
來看看新創建的 Angular 應用的默認配置:
browserslist 是這樣的:
> 0.5% last 2 versions Firefox ESR not dead not IE 9-11 # For IE 9-11 support, remove 'not'.
tsconfig.json 是這樣的:
默認情況下,會忽略老式瀏覽器(如IE 9-11),其編譯目標設置為 ES2015。結果就會生成兩個發布包,並啟用差異化加載。如果忽略全部不支持 ES2015 的瀏覽器,就只會生成一個版本。要了解不同配置下差異化加載的構建結果,請參考下表。

如上紅色字體顯示:把browserslist 中的not移除,tsconfig.json 的"target":改為“es5”即可,但會增加體積
