如何將Angular單專案升級為多專案

myskies發表於2021-10-26

有時候在開發的過程中發現一個Angular專案不太夠用,兩個獨立的專案又不太好複用。比如當前我們需要一個新的執行於微信小程式端的H5專案,但卻在想在新的H5專案中應用原WEB專案中實體、Share、Serivce以及MockApi等模組。此時,便需要將原來的Angular專案簡單做個升級。

情景:

  1. 當前已經有了一個執行於瀏覽器端的web專案。
  2. 在當前專案的基礎上新增一個wechat專案。
  3. 將web專案中的一些公有的東西抽離出來組成一個公共庫
  4. 原web專案、新的wechat專案均能呼叫其公共庫

開發環境

本文開發環境如下:

panjie@panjies-iMac web % ng --version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/
    

Angular CLI: 12.1.4
Node: 14.16.0
Package Manager: npm 6.14.11
OS: darwin x64

Angular: 12.1.5
... animations, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router

Package                         Version
---------------------------------------------------------
@angular-devkit/architect       0.1201.4
@angular-devkit/build-angular   12.1.4
@angular-devkit/core            12.1.4
@angular-devkit/schematics      12.1.4
@angular/cli                    12.1.4
@schematics/angular             12.1.4
rxjs                            6.6.7
typescript                      4.3.5

生成新工程

我們進入原web專案的根資料夾,執行ng generate application wechat

panjie@panjies-iMac web % ng generate application wechat
? Would you like to add Angular routing? Yes

選擇是否使用路由以及css樣式類別後angular cli將為我們生成projects資料夾:

projects
└── wechat
    ├── karma.conf.js
    ├── src
    │   ├── app
    │   │   ├── app-routing.module.ts
    │   │   ├── app.component.html
    │   │   ├── app.component.scss
    │   │   ├── app.component.spec.ts
    │   │   ├── app.component.ts
    │   │   └── app.module.ts
    │   ├── assets
    │   ├── environments
    │   │   ├── environment.prod.ts
    │   │   └── environment.ts
    │   ├── favicon.ico
    │   ├── index.html
    │   ├── main.ts
    │   ├── polyfills.ts
    │   ├── styles.scss
    │   └── test.ts
    ├── tsconfig.app.json
    └── tsconfig.spec.json

5 directories, 17 files

同時更新了angular.json檔案,寫入了wechat這個新的專案的配置資訊。

此時我們便可以使用ng s wechat來啟動wechat專案,使用ng t wechat來測試wechat專案,以及使用ng build wechat來構建wechat的專案了。

wechat專案有了以後,我們當前得到了如下的目錄樹:

panjie@panjies-iMac web % tree -L 1 -a
.
├── .browserslistrc ②
├── .editorconfig ①
├── .eslintrc.json ②
├── README.md ①
├── angular.json ①
├── dist ①
├── karma.conf.js ②
├── node_modules ①
├── package-lock.json ①
├── package.json ①
├── projects ①
├── src ②
├── tsconfig.app.json ②
├── tsconfig.json ②
└── tsconfig.spec.json ②

① Angular工程檔案,對web及wechat專案均生效
② web專案的專屬檔案

移動web專案

為了更加的整齊劃一,我們將以②為標識的檔案統一移動到projects資料夾中。新建資料夾名為web
image.png

專案移動完成後,我們對應修正專案的配置資訊

angular.json

該檔案存放的是Angular專案的配置資訊,配置不正確將直接導致ng s等命令無法正常啟動。
我們對應修正如下:

{
  "projects": {
    "web": {
-      "root": "", 
+      "root": "projects/web",
-            "tsConfig": "tsconfig.app.json",
+            "tsConfig": "projects/web/tsconfig.app.json",
-            "tsConfig": "tsconfig.spec.json",
+            "tsConfig": "projects/web/tsconfig.spec.json",
-            "karmaConfig": "karma.conf.js",
+            "karmaConfig": "projects/web/karma.conf.js",

然後使用全域性替換,將"src替換為"projects/web/src
image.png

修改完成後,執行ng s webng t來檢查是否存在其它的語法錯誤(主要是在遷移過程中可能發生的引用錯誤),有的話按提示進行修正。

至此,歷史專案遷移完畢。

公共模組

接下來便可以在projects裡面新一個common資料夾,然後將公用的實體、服務、元件等全部移過去了。這些小的功能模組即可以在web工程中使用,也可以在wechat中使用,這樣以來同樣的輪子我們只造一個就可以了。

相關文章