升级Angular项目从4.x版本到5.x版本时的注意事项

我将我参与的项目中的Angular版本从4系升级到了5系。在此过程中做了一些记录。顺便提一下,作为开发环境,我使用的是angular-seed而不是Angular CLI。

升级angular-seed的版本

通过将最新的angular-seed导入到当前存储库中,可以将Angular更新至当前的最新版本(v5.0.1)。

为了将angular-seed存储库合并到当前存储库中,使用git subtree。

首先,将angular-seed的仓库注册为外部仓库upstream。

$ git remote add upstream https://github.com/mgechev/angular-seed

使用-P选项指定任意目录,导入已注册的外部存储库upstream的内容。

$ git subtree pull -P frontend/ upstream master

参考网站

    • Gitのsubtreeについてのまとめ

 

    Git – サブツリーマージ

解决冲突

一旦注意しなければならないのは、必ずしもangular-seedの最新版を取り込むとコンフリクトが発生することです。特にpackage.jsonやyarn.lockといったファイルはかなり混乱しています。

    • 自分で追加したパッケージは残す

 

    追加していないパッケージを取り込み先を反映する

安装相关软件包。

解决package.json和yarn.lock之间的冲突后,还需要将相关包保持最新状态。可使用yarn或npm进行安装。

# yarnでインストールする場合
$ yarn install

# npmでインストールする場合
$ npm install

在这个时候,尝试运行npm start来启动应用程序。如果冲突得到解决并且包正确安装,应该能够成功启动。不过,不应该期望它完全运行正常。

安装@anular/http 5.x系列

Angular 5之后,用于进行HTTP请求的模块@angular/http已经不推荐使用。改为使用从Angular 4.3开始添加的@angular/common/http中的HttpClient。由于这部分需要大量修正工作,目前为了先使其正常工作,我决定更新现有的@angular/http。

用以下命令安装 @angular/http 的最新版本。

# yarnでインストールする場合
$ yarn add @angular/http

# npmでインストールする場合
$ npm i -S @angular/http

如果浏览器的控制台出现以下错误,请检查:

Uncaught SyntaxError: Unexpected token <

在 angular-seed 的 project.config.ts 文件中添加以下内容。

{ name: '@angular/http', path: 'node_modules/@angular/http/bundles/http.umd.min.js' },

调整RouterModule的配置

如果RxJS的版本是5.5.3的话,在Angular 5中会出现无法正确进行路由的问题。所以建议降级到5.5.2版本就可以解决问题。

    Angular 5.0.5 doesn’t work with RxJS

由于实际上在这一次的angular-seed更新中,RxJS的版本变成了5.5.3,所以出现了以下类似的错误。

ERROR Error: Uncaught (in promise): EmptyError: no elements in sequence

如果RouterModule的设置如下:

@NgModule({
  imports: [
    RouterModule.forChild([
      { path: 'home', component: HomeComponent }
    ])
  ],
  exports: [RouterModule]
})

在添加 pathMatch: ‘full’ 后,路由将按照以下方式正常进行。

@NgModule({
  imports: [
    RouterModule.forChild([
      { path: 'home', component: HomeComponent, pathMatch: 'full' }
    ])
  ],
  exports: [RouterModule]
})

安装 @angular/material 5.x系列

暂时来说,我们已经恢复到正常运行了。但是在我们的项目中,我们使用了@angular/material,所以我们决定也将其更新到5.x系列。以前我们使用的是2.0.0-beta.12版本。

使用以下命令进行安装。这次如果不指定版本,最新版本将不会被安装,所以指定了版本进行安装。

# yarnでインストールする場合
$ yarn add @angular/material@5.0.4 @angular/cdk@5.0.4

# npmでインストールする場合
$ npm install --save @angular/material@5.0.4 @angular/cdk@5.0.4

如果浏览器的控制台出现以下错误,

Uncaught SyntaxError: Unexpected token <

在 angular-seed 的 project.config.ts 中添加包。根据我们的情况,似乎没有加载@angular/cdk的accordion和layout,所以请添加以下内容。

{
  name: '@angular/cdk/accordion',
  path: 'node_modules/@angular/cdk/bundles/cdk-accordion.umd.js'
},
{
  name: '@angular/cdk/layout',
  path: 'node_modules/@angular/cdk/bundles/cdk-layout.umd.js'
},

总结

总之,现在基本上和4.x系列的时候一样工作了。我要确认我自己添加的包在Angular 5上也能正常工作,如果有什么问题就要解决。另外,从Angular 5开始,采用了RxJS v5.5.2或更高版本,并且操作符的导入方式也有所变化。我也希望逐步进行相应的调整。同样地,正如我在文章中提到的,我也希望在HTTP请求方面使用@angular/common/http下的HttpClient,因为它得到推荐。

广告
将在 10 秒后关闭
bannerAds