Angular第三方庫開發實踐

從接觸Angular到如今,做了不少Angular項目,使用了不少第三方庫,但是卻沒有勇氣觸碰第三方庫的開發,一是沒有太多的積累,二是沒有找到合適的“Hello world”的文檔。
最近有機會要把項目中常用的Component做成第三方庫,方便更多的項目使用。根據網上找到的各種資料,加上走的各種彎路,終于摸清楚了開發第三方庫的流程。

搭建項目框架

為了方便第三方庫的開發,我們首先要創建一個主應用A:

ng new projectnameA    //創建主應用

主應用A創建好之后,創建Lib:

cd projectnameA
ng g library libName --prefix  prefixName //--prefix是Lib使用的前綴

上述命令會對主應用如下改變:

  1. 在主應用A下創建 projects/libName 目錄,并將Lib的相關文件放于此;

  2. 在 angular.json 文件中添加 libName 項目;

     "libName": {
       "root": "projects/libName",
       "sourceRoot": "projects/libName/src",
       "projectType": "library",
       "prefix": "dteam-top",
       "architect": {
         "build": {
           "builder": "@angular-devkit/build-ng-packagr:build",
           "options": {
             "tsConfig": "projects/libName/tsconfig.lib.json",
             "project": "projects/libName/ng-package.json"
           },
           "configurations": {
             "production": {
               "project": "projects/libName/ng-package.prod.json"
             }
           }
         },
         "test": {...},
         "lint": {...}
       }
     }
    

    其中:
    root為Lib的根目錄;
    sourceRoot為Lib的源代碼目錄;
    projectType為項目的類型;
    prefix為組件使用的前綴;
    architect為Angular的構建配置,可設置 build、test 和 lint。

  3. 在 package.json 文件中添加 ng-packagr 依賴;

  4. 在 tsconfig.json 文件中添加 libName 庫的引用;

        {    
            ...
            "paths": {
                "libName": [
                    "dist/libName"
                ]
            }
            ...
        }
    

這樣項目框架就搭建好了,可以開始寫Lib的代碼了。

Lib開發

在Lib中需要注意一個文件:public_api.ts,這個文件是Lib的入口文件,取代了之前使用的index.ts文件,其中定義了Export的內容:

````
export * from './app/libName.component';
export * from './app/libName.module';
````

主應用A要使用Lib,在app.module.ts文件中直接引用:

import { LibNameModule } from '../../../../projects/libName/src/app/libName.module'

imports: [
    ...
    LibNameModule,
    ...
]

對于Lib中使用的其他組件,可在主應用A下通過npm安裝,這里提醒下,這里是安裝到主應用A的目錄下,修改的是主應用A的package.json和package.lock.json文件。
這樣,就可以開發自己的Lib了。

測試Lib的安裝

Lib開發好之后,需要先在本地試安裝。這時有疑問了,Lib中用到的其他組件的引入都是在主應用A的package.json中聲明的,這對于Lib是不對滴。
細心的開發者會發現,在Lib的目錄下也有一個package.json文件,其缺省內容為:

{
    "name": "libName",
    "version": "0.0.1",
    "peerDependencies": {
        "@angular/common": "7.0.2",
        "@angular/core": "7.0.2",
    }
}

我們需要把這個文件補充完整,將Lib中用到的其他第三方組件在peerDependencies中引入,并將Lib的其他屬性也加入。例如:

{
    "name": "ligName",
    "version": "0.0.1",
    "keywords": ["keyword1","keyword2"],
    "license": "MIT",
    "author": "authorName",
    "description": "description",
    "peerDependencies": {
        "@angular/common": "7.0.2",
        "@angular/core": "7.0.2",
        "@angular/forms": "7.0.2",
        "@angular/router": "7.0.2", 
        "@angular/cdk": "7.0.2",
        "@angular/material": "7.0.2",
        "ngx-spinner": "7.0.0",
        "ngx-clipboard": "12.0.0", 
        "ethers": "4.0.27",
        "rxjs": "6.3.3"
    }
}

同時,還可以添加一個README.md文件,介紹Lib的使用方法。
準備工作做好之后,將Lib編譯成產品:

ng build libName --prod

編譯后的文件會放置在主應用A的dist/libName目錄下。另外創建一個Angular應用B,在此應用下執行:

npm install 主應用A/dist/libName 

安裝時會對libName使用的其他第三方庫給出類似如下的提示:

npm WARN libName@0.0.1 requires a peer of @angular/core@^7.2.0 but none is installed. You must install peer dependencies yourself.

根據提示,自行安裝缺少的組件即可。
在應用B的package.json中會看到對libName的引入:

 "libName": "file:../projectnameA/dist/

在應用B的package-lock.json文件中加入如下內容:

"libName": {
  "version": "file:../projectnameA/dist/libName",
  "requires": {
    "tslib": "^1.9.0"
  },
  "dependencies": {
    "tslib": {
      "version": "1.9.3",
      "bundled": true
    }
  }
}

在應用B的app.module.ts文件中引入libName:

import { LibNameModule } from 'libName';

...
imports: [
    ...
    LibNameModule,
    ...
],
...

在應用B中可以測試libName能否正常使用。

Lib發布

上述過程結束后,就可以將應用發布到npm上。準備工作:

  1. npm上注冊賬號。
  2. 在命令行下執行:npm adduser,將賬號添加到本地。

好了,可以發布libName了。進入到projectnameA/dist/libName目錄下執行:

npm publish

看到了發布成功提示,還有點小激動。進入到npm中,可以看到已經發布成功的libName。
如果想刪除這個libName,可以使用如下命令:

npm unpublish libNamet@0.0.1 --force

這里需要特別注意的是:刪除后的libName,在24小時內不能再發布了,見如下提示:

npm ERR! libName cannot be republished until 24 hours have passed. 

總結

npm為第三方庫的開發還提供了一些便利的方法,如npm link命令。這些都有待我們在今后的開發中摸索和體驗,以便更好的打磨精品組件。

附錄

在開發過程中遇到了幾個錯誤,現匯總如下:

  1. 權限錯誤:

     npm ERR! publish Failed PUT 403
     npm ERR! code E403
     npm ERR! You do not have permission to publish "libName". Are you logged in as the correct user? : libName
    

    解決辦法,執行: npm adduser

  2. libName若注入了其第三方的服務,主應用調用時出現如下錯誤:

    Error: inject() must be called from an injection context 
    

    解決方法,在主應用的angular.json文件中添加:

    "projects": {
        "projectName": {
            "architect": {
                "build": {
                    "options": {
                        "preserveSymlinks":true
                    },
                },
            }
        }
      }
    },
    
  3. 若libName定義了自己的route,需要在主應用中注入RouterModule。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374