有時候在開發的過程中發現一個Angular專案不太夠用,兩個獨立的專案又不太好複用。比如當前我們需要一個新的執行於微信小程式端的H5專案,但卻在想在新的H5專案中應用原WEB專案中實體、Share、Serivce以及MockApi等模組。此時,便需要將原來的Angular專案簡單做個升級。
情景:
- 當前已經有了一個執行於瀏覽器端的web專案。
- 在當前專案的基礎上新增一個wechat專案。
- 將web專案中的一些公有的東西抽離出來組成一個公共庫
- 原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
。
專案移動完成後,我們對應修正專案的配置資訊
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
修改完成後,執行ng s web
或ng t
來檢查是否存在其它的語法錯誤(主要是在遷移過程中可能發生的引用錯誤),有的話按提示進行修正。
至此,歷史專案遷移完畢。
公共模組
接下來便可以在projects裡面新一個common資料夾,然後將公用的實體、服務、元件等全部移過去了。這些小的功能模組即可以在web工程中使用,也可以在wechat中使用,這樣以來同樣的輪子我們只造一個就可以了。