原文:Angular 10 in depthjavascript
做者:Flavio Copesjava
譯者:曉編json
Angular的最新版本Angular 10剛發佈了,咱們看看有什麼新特性!本文會詳細講新版本里全部值得一提的新特性,若是你想快速預覽有哪些內容,能夠前往Angular官方博客查看。瀏覽器
Angular 10 在 Angular 9 發佈以後4個月就發了,相隔時間這麼短,固然沒有太多的變化,但這個版本仍是有一些值得一提的新特性,以及修復了不少缺陷。順便一提,Angular團隊想要每一年發佈2個大版本,因此Angular 11應該會在今年秋季發佈。緩存
做爲一個熱愛TypeScript的人,我認爲這個版本最喜聞樂見的特性就是支持TypeScript 3.9.x!另外一方面Angular 10放棄了對TS 3.六、3.7和 3.8的支持,但願不會成爲你的障礙。基於編譯CLI的升級和對TS3.9的支持,Angular 10 的類型檢查比以往的版本都要快,這對於大多數項目來講是個好消息,尤爲是大型項目。安全
除此以外,Angular 10還升級到了 TSLib 2.0。TSLib簡單地說就是一個提供TypeScript運行時支持方法的官方庫,它要結合「tsconfig.json」裏的importHelpers
標記生效,當importHelpers
開啓的時候,編譯器能夠生成更緊湊、更具可讀性的代碼。總之不用擔憂,TSLib沒有太大變化。bash
嚴格模式爲贏!app
Angular 10 的嚴格模式使得咱們能夠在建立時就獲得一個嚴格的項目,這是很好的作法,值得用在全部新項目上。運行下面的命名能夠建立一個嚴格設置的項目:async
ng new --strict複製代碼
它可讓你更快地檢測到問題的存在(在構建時發現問題總比運行時發現問題好,對吧)。這個新的option:ide
我認爲這個新的「strict」選項很棒,有點小惋惜它只是個可選項而不是個默認選項。我的認爲嚴格意味着更安全。若是你要建立新項目,建議使用嚴格模式哦。
新版本提供的默認TS配置有點變化,如今是同時提供了 「tsconfig.base.json」 、 「tsconfig.json」、「tsconfig.app.json」 和「tsconfig.spec.json」。
爲何要有這些配置文件?這是爲了更好地支持IDE和構建工具查找類型和編譯配置。新版裏面,「tsconfig.json」 只包含TypeScript項目引用,這樣能夠提高編譯時性能,並且更嚴格地隔離項目的不一樣部分: 「tsconfig.app.json」管應用代碼;「tsconfig.spec.json」管測試;「tsconfig.base.json」 裏面的TypeScript配置只配置TypeScript編譯器和Angular編譯器選項,沒有配置指定/排除編譯哪些文件。那指定/排除編譯哪些文件在哪裏配置呢?答案是在「tsconfig.app.json」文件裏面。
若是你現有的項目裏沒有用這個配置結構,最好檢查下你的TypeScript配置以便保持一致。
首先確保你的package.son文件裏有postinstall腳本,在安裝後執行NGCC。
在新版本里面,NGCC的可恢復性更強。放在之前,若是NGCC的某個工做進程崩了它不必定能恢復,如今應該沒有這個問題了。此外NGCC還作了一些優化,包括性能相關的。
Web瀏覽器發展迅速,Angular順應潮流也更新了browserslist文件(.browserslistrc)。但正如官方博客裏解釋的那樣,新配置帶來了一個反作用,就是新項目默認禁用ES5構建。固然,如今生產ES5的代碼已經沒多少意義了,現代Web瀏覽器都至少支持ES2015了。若是你還在用IE瀏覽器,那就是時候告別過去了。
若是要獲取具體支持的Web瀏覽器,能夠在你的項目裏執行下面的命令:
npx browserslist複製代碼
它會基於根目錄下的 「.browserslistrc」 文件輸出結果。
一個使人可惜的消息:Angular Bazel已經離開Angular實驗室了,因此Angular項目基本上不會再支持Bazel,Bazel不再是Angular CLI的默認構建工具了。
雖然這個包的命名很粗暴,但它包含了Angular應用構建的重要部分。最新版本的帶來了幾個很酷的特性:
新版的編譯器CLI能夠實現增量式模板類型檢查。
之前,CanLoad guard 只能返回boolean值,如今能夠返回 UrlTree 類型的值,匹配CanActivate 守衛的行爲。注意,這不會影響預加載。
之前本地只能支持一個翻譯文件。如今本地能夠指定多個文件了,而後經過message id來合併。
默認的SwRegistrationStrategy
有所優化。避免了以前可能會出現的 Service Worker從未註冊的狀況(好比有interval或遞歸timeout這樣的長時間運行任務存在時)。
Angular Material 10 也跟着發佈了,變化挺多的
Angular團隊投入了大量的時間和精力去修復了積壓的bug,解決了超過700個issue。
Angular打包格式再也不支持ESM5/FESM5,由於構建過程的最後都會降級爲ES5。若是你不用Angular CLI打包,你要本身想辦法把Angular代碼降級到es5。
IE 九、IE 10和移動端IE瀏覽器都不支持了。
以及一些廢棄的元素,具體看官網博客。
直到Angular 9,你均可以在沒有使用裝飾器(好比 @Component,@Derective等)的類裏面使用Angular的特性。Angular 10裏面不行了,你必須加裝飾器。若是你有用到組件繼承,父子組件類裏的其中一個沒有加裝飾器,就會有問題。
爲何要強制變動?簡單來說,Ivy編譯器須要裝飾器。
若是沒有裝飾器,Angular的編譯器就不會添加依賴注入的額外代碼。
若是父組件缺乏了裝飾器,那子類就會繼承父類的constructor,但編譯器不會生成對應的constructor信息(由於沒裝飾)。當Angular試圖建立這個子類時,就沒有正確的信息去建立了。在View引擎裏面,編譯器能夠在全局範圍裏查找缺失的數據,但Ivy編譯器會單獨處理每一個指令,這意味着更快的編譯速度,但就無法像之前那樣自動找到缺失的constructor信息了,只有顯式添加裝飾器才能提供這個信息。
若是子類缺乏了裝飾器,那它就會繼承父類可是沒有本身的裝飾器,編譯器也無法知道這個類是個@Derective仍是個@Component,因此無法生成對應的指令信息。
這個變動帶來的好處就是加強了Angular世界的一致性。若是你想用Angular特性,那就加上Angular裝飾器。
之前ModuleWithProviders也接受泛型,但不是強制的。NG 10裏面,泛型參數是必需的,這樣有利於類型安全。若是你遇到第三方庫的報錯:
error TS2314: Generic type 'ModuleWithProviders<T>' requires 1 type argument(s).複製代碼
建議聯繫做者修復,由於NGCC也無法處理。也能夠先把skipLibChecks
設爲 false來跳過。
[foo]=(bar$ | async).fubar
這樣,若是fubar的值跟以前同樣,就不會觸發變化檢測。若是你想要觸發變化檢測,變通的方法就是讓整個引用發生變化。時間日期格式化:formatDate()
和DatePipe 的格式化代碼改了,以前的實現對於跨午夜的日期範圍有問題
UrlMatcher背後的方法utility type如今的返回相似能夠是null
ExpressionChangedAfterItHasBeenChecked 的報錯新增了以前沒檢測到的場景
Angular日誌:模板裏的未知元素/屬性綁定從之前的warning輸出級別提高到error輸出級別
minLength
和maxLength
驗證器:它的值保證包含數值類型的length屬性,之前沒有length屬性的falsy值會引發驗證錯誤。參考遷移指南
此文探索了Angular 10的新特性、廢棄特性,以及重大變動。儘管這個版本不是地震級的轟動發佈,但也修復了不少缺陷,也帶來不少寶藏。感謝Angular團隊和社區!