使用ng-packagr打包Angular的方法示例
寫在前面
為了讓 Angular 類庫應用范圍更自由,Angular 提出一套打包格式建議名曰:Angular Package Format,包括 FESM2015、FESM5、UMD、ESM2015、ESM5、ES2015 格式,不同格式可以在不同的環(huán)境(Angular Cli、Webpack、SystemJS等)中使用。
傳統(tǒng)方式需要對這些格式逐一打包,一個示例打包腳本寫法。這種寫法只能針對不同項目的配置,而且除非你了解這些格式的本質(zhì)否則很難維護;后來社區(qū)根據(jù) APF 規(guī)范實現(xiàn)了類庫 ng-packagr,通過簡單的配置可以將你的類庫打包成 APF 規(guī)范格式。
至 V6 以后 Angular Cli 也基于 ng-packagr 實現(xiàn)了另一個 @angular-devkit/build-ng-packagr 應用構(gòu)建器。
如何使用
既然 ng-packagr 被 Angular Cli 內(nèi)置,這讓我們進一步簡化了生產(chǎn)一個 APF 規(guī)范格式的類庫的成本。在 Angualr Cli 里使用 ng g library
來創(chuàng)建一個類庫模板,例如在一個新的 Angular 應用里執(zhí)行:
ng g library <library name>
而打包,則:
ng build <library name>
最終,將生成的 dist/<libary name>
目錄下文件上傳相應包管理服務器(例如:npm)提供給其他 人使用。
配置說明
由 Angular Cli 生成的類庫模板大部分內(nèi)容同 Angular 應用一樣,只是多了一個 ng-package.json
的配置文件(對于生產(chǎn)環(huán)境是 ng-package.prod.json
),它是專門針對 ng-packagr 的一個配置文件,如同 angular.json 一般也是基于 JSON Schema 格式,因此可以通過訪問ng-package.schema.json 了解所有細節(jié),以下描述一些重點項。
whitelistedNonPeerDependencies
ng-packagr 默認會根據(jù) package.json 的 peerDependencies
節(jié)點清單來決定類庫所需要第三方依賴包,這些依賴包是不會被打包至類庫。
然而,所依賴包不存在 peerDependencies
節(jié)點里時(當然建議需要依賴的項應該在里面),就需要該屬性的配置。
lib/entryFile
指定入口文件。
lib/umdModuleIds
UMD 格式采用 rollup 打包,當類庫需要引用一些無法猜出正確 UMD 標識符時,就需要你手動映射這些類庫的標識。
"umdModuleIds": { "lodash": "_" }
angular.json
Angular Cli 配置文件 angular.json 內(nèi)會增加一個以 <libary name>
命名的構(gòu)建配置,絕大多數(shù)配置性同普通 Angular 應用如出一轍,唯一不同的是 builder
節(jié)點為:
"builder": "@angular-devkit/build-ng-packagr:build"
次級入口
有時候一個類庫可能會包含著多個二次入口,就像 @angular/core
類庫包含著一個 @angular/core/testing
模塊,它只是運用于測試,因此并不希望在項目中引入 @angular/core
時也包含測試代碼,但同時二者又是同一個功能性時,這種次級導入顯得非常重要。
另一種像 ngx-bootstrap、@angular/cdk/ally 等都提供次級模塊的導入,可以更好的優(yōu)化體積。
不論出于何種目的,都可以通過 Angular Cli 簡單的文件組織進一步打包出主、次級分明的類庫。
ng g library
生成的結(jié)構(gòu)大概如下:
<libary name> ├── src | ├── public_api.ts | └── lib/*.ts ├── ng-package.json ├── ng-package.prod.json ├── package.json ├── tsconfig.lib.json └── tsconfig.spec.json
當根目錄下包含README.md
、LICENSE
時會自動被復制到dist
目錄中,Npm 規(guī)定必須包含 README.md 文件,否則訪問已發(fā)布類庫頁時會有未找到描述文件錯誤提示。
若想創(chuàng)建一個 <libary name>/testing
的次級入口,只需要在 <libary name>
根目錄下創(chuàng)建一個 testing
目錄:
<libary name> ├── src | ├── public_api.ts | └── lib/*.ts ├── ng-package.json ├── ng-package.prod.json ├── package.json ├── tsconfig.lib.json ├── tsconfig.spec.json └── testing ├── src | ├── public_api.ts | └── *.ts └── package.json
核心是需要提供一個 package.json
文件,而且內(nèi)容簡單到姥姥家。
{ "ngPackage": {} }
最后,依然使用 ng build <libary name>
,會產(chǎn)生一個次級導入模塊。
小結(jié)
至此,基本上利用 Angular Cli 可以快速的構(gòu)建一個可發(fā)布于 Npm Angular 類庫,更復雜的可以構(gòu)建像 ngx-bootstrap、@angular/cdk/* 類庫。
自定義構(gòu)建
Angular Cli 雖然提供非常便利的環(huán)境,但是對于一些復雜環(huán)境像 Delon 類庫(ng-alain基建系列類庫)包含著多個類庫、類庫又包含多個次級導入時,Angular Cli 會顯得有點啰嗦,特別是對每個類庫的 angular.json 配置。其實 @angular-devkit/build-ng-packagr 非常簡單,如果將取進一步簡化,整個實現(xiàn)差不多相當于:
const path = require('path'); const ngPackage = require('ng-packagr'); const target = path.resolve(__dirname, './projects/<libary name>'); ngPackage .ngPackagr() .forProject(path.resolve(target, `ng-package.prod.json`)) .withTsConfig(path.resolve(target, 'tsconfig.lib.json')) .build() .then(() => { // 構(gòu)建完成后干點事 });
將上面的代碼放到 ./build.js
,執(zhí)行:
node scripts/build.js
其結(jié)果完成是等價。
build()
返回的是一個 Promise
對象,意味著可以確保構(gòu)建開始前和結(jié)束后做一點額外的事。
總結(jié)
ng-packagr 極大簡化 Angular 類庫被打包出一個 APF 規(guī)范建議,雖然它以 ng-
開頭,但本質(zhì)上并不一定非要在 Angular 中運用,也可以使用在 React、VUE。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
angular內(nèi)置provider之$compileProvider詳解
下面小編就為大家?guī)硪黄猘ngular內(nèi)置provider之$compileProvider詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09解決angularjs前后端分離調(diào)用接口傳遞中文時中文亂碼的問題
今天小編就為大家分享一篇解決angularjs前后端分離調(diào)用接口傳遞中文時中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08