Angular4升級為Angular7進階指南

前言

光陰似箭,入職現在的公司已經一年多了,回想剛入職時還是第一次接觸到angular,當時angular4出來也沒有多久,所以對這門新技術也是報以期待。
一年多內,我們的產品也從我剛來時的v1.03版本迭代到了v2.0。但在此過程中,我們前端團隊一直忙于業(yè)務功能的開發(fā),而忽視了“工具”本身的進階。導致angular中很多新的功能甚至是很多新的UI組件不能使用。
在年前開發(fā)完公司產品的v2.0版本之后,我終于能抽出來一些時間為整個項目做一個升級,以下為此次升級的一些步驟已經才到的坑,希望能對小伙們有一些幫助。

1. 開始前準備

1.備份你的項目
2.確保你的環(huán)境滿足一下要求

$ node -v node >= 8.9.0  
$ npm -v npm >= 5.6.0

3.刪除你項目根目錄下的 package-lock.json 文件

2. Angular4升級為Angular5

由于整個項目過于龐大,也是為了試試水,所以在此次升級的過程中,我想先升級為5.0來看看。
查閱了一些資料,發(fā)現Angular官網是有一篇升級指南
打開升級指南,將初始版本號選擇4.0,升級到的版本號選擇到5.0。點擊Show me how to update!按鈕,查看升級步驟。

image.png

在升級步驟中,前面兩個小步驟提示按上面的做法做就可以了。如果你的項目不是使用en-us以外的語言環(huán)境的應用程序,則直接在項目的根目錄執(zhí)行一下命令:

npm install @angular/animations@^5.0.0 @angular/common@^5.0.0 @angular/compiler@^5.0.0 @angular/compiler-cli@^5.0.0 @angular/core@^5.0.0 @angular/forms@^5.0.0 @angular/http@^5.0.0 @angular/platform-browser@^5.0.0 @angular/platform-browser-dynamic@^5.0.0 @angular/platform-server@^5.0.0 @angular/router@^5.0.0 typescript@2.4.2 rxjs@^5.5.2
npm install typescript@2.4.2 --save-exact

或者使用淘寶鏡像cnpm。

升級完之后,如果你的項目中使用了router,會看到使用路由的地方爆一些錯,查閱了一下資料,是Angular5中路由的一些改動,由于在后面的版本中也做了相應的調整,所以在這里我就沒有管它,而是繼續(xù)后面的升級。

3. 升級本地的Angular-cli

在這里我是先卸載原先的Angular-cli,然后再安裝最新版。

$ npm uninstall -g @angular/cli    // 卸載舊版本cli。
$ npm cache clean   // 清除緩存,確保卸載干凈
$ npm install -g @angular/cli@latest  //安裝最新版本的cli

注:如果卸載全局包失敗可以在本地目錄下手動刪除(window10)
C:\Users\HUAWEI\AppData\Roaming\npm\node_modules(一般存在于C盤的用戶文件夾下)

安裝完畢之后使用指令查看:

$ ng -v

4. Angular5到Angular7

升級了本地的Angular-cli之后,就可以對項目進行升級了。
依次執(zhí)行一下命令

npm install @angular/cli
ng update @angular/cli
ng update @angular/core
ng update
npm install -g rxjs-tslint
rxjs-5-to-6-migrate -p src/tsconfig.app.json

上面依次更新的是angular/cli,angular/core,以及rxjs。

5. 項目代碼報錯調整

升級完畢之后,打開項目文件,許多代碼可能會報錯,一般都是在你的http方法中。

5.1 Observable和Subject

若是你的代碼中有使用到

import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';

的地方,則可能會報錯,因為新版本的rxjs做了一些改變,你只需要按以下寫法就可以

import { Observable ,  Subject } from 'rxjs';

5. 2 timeout, map, filter, mergeMap等

同時有用到timeout,map, filter, mergeMap的地方(一般http請求的時候有用到),也需要進行響應調整

import { timeout, map, filter, mergeMap } from 'rxjs/operators'

新版本的timeout,map, filter, mergeMaprxjs/operators中調用。
原來的引用方式是:

let xhr = this.http
.post(url, data, option)
.timeout(60000)
.toPromise()
.then(res => {
  ...
})

此時也要修改為

let xhr = this.http
.post(url, data, option)
.pipe(timeout(60000))
.toPromise()
.then(res => {
  ...
})

在使用時需要用pipe()盛放起來。
同理:

this.router.events
    .pipe(
      filter(event => event instanceof NavigationEnd),
      map(() => this.activatedRoute),
      map(route => {
        while (route['firstChild']) route = route['firstChild'];
        return route;
      }),
      filter(route => route['outlet'] === 'primary'),
      mergeMap(route => route['data'])
    )
  .subscribe(event => {
    ...
  })

后語

在將項目成功升級之后,就可以開心的使用NG-ZORRO了(原本使用的UI庫為primeng)。在這里安利一波antd,這真的是一個很強大的UI庫,現在前端主流的三大框架vue, react, angular,它都有對應的庫,如angular中的NG-ZORRO
升級參考:
記NG4 遷移到 NG6 的一次實踐

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容