Angular2 依賴包詳解說明

Angular 應(yīng)用程序以及 Angular 本身都依賴于很多第三方包 ( 包括 Angular 自己 ) 提供的特性和功能。這些包由 Node 包管理器 (npm) 負(fù)責(zé)安裝和維護(hù)。

Angular2開發(fā)時依賴的包在package.json文件中都有定義。

{ 
  “dependencies”: { 
    “@angular/common”: “~2.1.1”, 
    “@angular/compiler”: “~2.1.1”, 
    “@angular/core”: “~2.1.1”, 
    “@angular/forms”: “~2.1.1”, 
    “@angular/http”: “~2.1.1”, 
    “@angular/platform-browser”: “~2.1.1”, 
    “@angular/platform-browser-dynamic”: “~2.1.1”, 
    “@angular/router”: “~3.1.1”, 
    “@angular/upgrade”: “~2.1.1”, 
    “angular-in-memory-web-api”: “~0.1.13”, 
    “core-js”: “^2.4.1”, 
    “reflect-metadata”: “^0.1.8”, 
    “rxjs”: “5.0.0-beta.12”, 
    “systemjs”: “0.19.39”, 
    “zone.js”: “^0.6.25” 
  }, 
  “devDependencies”: { 
    “@types/core-js”: “^0.9.34”, 
    “@types/node”: “^6.0.45”, 
    “concurrently”: “^3.0.0”, 
    “l(fā)ite-server”: “^2.2.2”, 
    “typescript”: “^2.0.3” 
  } 
} 

package.json 包含兩組包: dependencies 和 devDependencies 。

dependencies

dependencies 下的這些包是 運行 本應(yīng)用的基礎(chǔ),而 devDependencies 下的只在 開發(fā) 此應(yīng)用時才用得到。 通過為 install 命令添加 –production 參數(shù),你在產(chǎn)品環(huán)境下安裝時排除 devDependencies 下的包,就像這樣:

npm install my-application –production 

應(yīng)用程序的 package.json 文件中, dependencies 區(qū)下有三類包:

  • 特性 - 特性包為應(yīng)用程序提供了框架和工具方面的能力。
  • 填充 (Polyfills) - 填充包彌合了不同瀏覽器上的 JavaScript 實現(xiàn)方面的差異。
  • 其它 - 其它庫對本應(yīng)用提供支持,比如 bootstrap 包提供了 HTML 中的小部件和樣式。

特性包

  • @angular/core - 框架中關(guān)鍵的運行期部件,每一個應(yīng)用都需要它。 包括所有的元數(shù)據(jù)裝飾器: Component 、 Directive ,依賴注入系統(tǒng),以及組件生命周期鉤子。
  • @angular/common - 常用的那些由 Angular 開發(fā)組提供的服務(wù)、管道和指令。
  • @angular/compiler - Angular 的 模板編譯器 。 它會理解模板,并且把模板轉(zhuǎn)化成代碼,以供應(yīng)用程序運行和渲染。 開發(fā)人員通常不會直接跟這個編譯器打交道,而是通過 platform-browser-dynamic 或離線模板編譯器間接使用它。
  • @angular/platform-browser - 與 DOM 和瀏覽器相關(guān)的每樣?xùn)|西,特別是幫助往 DOM 中渲染的那部分。 這個包還包含 bootstrapStatic 方法,用來引導(dǎo)那些在產(chǎn)品構(gòu)建時需要離線預(yù)編譯模板的應(yīng)用程序。
  • @angular/platform-browser-dynamic - 為應(yīng)用程序提供一些 提供商 和 bootstrap 方法,以便在客戶端編譯模板。不要用于離線編譯。 我們使用這個包在開發(fā)期間引導(dǎo)應(yīng)用,以及引導(dǎo) plunker 中的范例。
  • @angular/http - Angular 的 HTTP 客戶端。
  • @angular/router - 路由器.
  • @angular/upgrade - 一組用于升級 Angular 1 應(yīng)用的工具。
  • system.js - 是一個動態(tài)的模塊加載器, 與 ES2015 模塊 規(guī)范兼容。 還有很多其它選擇,比如廣受歡迎的 webpack 。 SystemJS 被用在了我們的文檔范例中。因為它能工作。

今后,應(yīng)用程序很可能還會需要更多的包,比如 HTML 控件、主題、數(shù)據(jù)訪問,以及其它多種工具

填充 (Polyfill) 包

在應(yīng)用程序的運行環(huán)境中, Angular 需要某些 填充庫 。 我們通過特定的 npm 包來安裝這些填充庫, Angular 本身把它列在了package.json 中的 peerDependencies 區(qū)。

但我們必須把它列在我們 package.json 文件的 dependencies 區(qū)。

查看下面的“ 為什么用 peerDependencies? ”,以了解這項需求的背景。

  • core-js - 為全局上下文 (window) 打的補(bǔ)丁,提供了 ES2015(ES6) 的很多基礎(chǔ)特性。 我們也可以把它換成提供了相同內(nèi)核 API 的其它填充庫。 一旦所有的“主流瀏覽器”都實現(xiàn)了這些 API ,這個依賴就可以去掉了。
  • reflect-metadata - 一個由 Angular 和 TypeScript 編譯器共享的依賴包。 開發(fā)人員需要能單獨更新 TypeScript 包,而不用升級 Angular 。這就是為什么把它放在本應(yīng)用程序的依賴中,而不是 Angular 的依賴中。
  • rxjs - 一個為 可觀察對象 (Observable) 規(guī)范 提供的填充庫,該規(guī)范已經(jīng)提交給了 TC39 委員會,以決定是否要在 JavaScript 語言中進(jìn)行標(biāo)準(zhǔn)化。 開發(fā)人員應(yīng)該能在兼容的版本中選擇一個喜歡的 rxjs 版本,而不用等 Angular 升級。
  • zone.js - 一個為 Zone 規(guī)范 提供的填充庫,該規(guī)范已經(jīng)提交給了 TC39 委員會,以決定是否要在 JavaScript 語言中進(jìn)行標(biāo)準(zhǔn)化。 開發(fā)人員應(yīng)該能在兼容的版本中選擇一個喜歡的 zone.js 版本,而不用等 Angular 升級。

其它輔助庫

  • angular-in-memory-web-api - 一個 Angular 的支持庫,它能模擬一個遠(yuǎn)端服務(wù)器的 Web API ,而不需要依賴一個真實的服務(wù)器或發(fā)起真實的 HTTP 調(diào)用。 對演示、文檔范例和開發(fā)的早期階段 ( 那時候我們可能還沒有服務(wù)器呢 ) 非常有用。 請到 Http 客戶端 一章中了解更多知識。
  • bootstrap - bootstrap 是一個廣受歡迎的 HTML 和 CSS 框架,可用來設(shè)計響應(yīng)式網(wǎng)絡(luò)應(yīng)用。 有些文檔中的范例使用了 bootstrap 來強(qiáng)化它們的外觀。

devDependencies

列在 package.json 文件中 devDependencies 區(qū)的包會幫助我們開發(fā)該應(yīng)用程序。 我們不用把它們部署到產(chǎn)品環(huán)境的應(yīng)用程序中——雖然這樣做也沒什么壞處。

  • concurrently - 一個用來在 OS/X 、 Windows 和 Linux 操作系統(tǒng)上同時運行多個 npm 命令的工具
  • lite-server - 一個輕量級、靜態(tài)的服務(wù)器, 由 John Papa 開發(fā)和維護(hù)。對使用到路由的 Angular 程序提供了很好的支持。
  • typescript - TypeScript 語言的服務(wù)器,包含了 TypeScript 編譯器 tsc
  • @types/* - “TypeScript 定義”文件管理器。 要了解更多,請參見 TypeScript 配置 頁。

為什么使用 peerDependencies ?

在“快速起步”的 package.json 文件中,并沒有 peerDependencies 區(qū)。 但是 Angular 本身在 它自己的 package.json 中有, 它對我們的應(yīng)用程序有重要的影響。

它解釋了為什么我們要在“快速起步”的 package.json 文件中加載這些 填充庫 (polyfill) 依賴包, 以及為什么我們在自己的應(yīng)用中會需要它們。

然后是對 平級依賴 (peer dependencies) 的簡短解釋。

每個包都依賴其它的包,比如我們的應(yīng)用程序就依賴于 Angular 包。

兩個包, “A” 和 “B” ,可能依賴共同的第三個包 “C” 。 “A” 和 “B” 可能都在它們的 dependencies 中列出了 “C” 。

如果 “A” 和 “B” 依賴于 “C” 的不同版本 (“C1” 和 “C2”) 。 npm 包管理系統(tǒng)也能支持! 它會把 “C1” 安裝到 “A” 的 node_modules 目錄下給 “A” 用,把 “C2” 安裝到 “B” 的 node_modules 目錄下給 “B” 用。 現(xiàn)在, “A” 和 “B” 都有了它們自己的一份 “C” 的復(fù)本,它們運行起來也互不干擾。

但是有一個問題。包 “A” 可能只需要 “C1” 出現(xiàn)就行,而實際上并不會直接調(diào)用它。 “A” 可能只有當(dāng) 每個人都使用 “C1” 時 才能正常工作。如果程序中的任何一個部分依賴了 “C2” ,它就會失敗。

要想解決這個問題, “A” 就需要把 “C1” 定義為它的 平級依賴 。

在 dependencies 和 peerDependencies 之間的區(qū)別大致是這樣的:

dependency 說:“我需要這東西 對我 直接可用?!?/p>

peerDependency 說:“如果你想使用我,你得先確保這東西 對你 可用”

Angular 就存在這個問題。 因此, Angular 的 package.json 中指定了一系列 平級依賴 包, 把每個第三方包都固定在一個特定的版本上。

我們必須自己安裝 Angular 的 peerDependencies 。
當(dāng) npm 安裝那些在 我們的 dependencies 區(qū)指定的包時, 它也會同時安裝上在 那些包 的 dependencies 區(qū)所指定的那些包。 這個安裝過程是遞歸的。

但是在 npm 的第三版中, 它不會 安裝列在 peerDependencies 區(qū)的那些包。

這意味著,當(dāng)我們的應(yīng)用程序安裝 Angular 時, npm 將不會自動安裝列在 Angular 的 peerDependencies 區(qū)的那些包

幸運的是, npm 會在下列情況下給我們警告: (a) 當(dāng)任何 平級依賴 缺失時或 (b) 當(dāng)應(yīng)用程序或它的任何其它依賴安裝了與 平級依賴 不同版本的包時。

這些警告可以避免因為版本不匹配而導(dǎo)致的意外錯誤。 它們讓我們可以控制包和版本的解析過程。

我們的責(zé)任是,把所有 平級依賴 包都 列在我們自己的 devDependencies 中 。

PEERDEPENDENCIES 的未來

Angular 的填充庫依賴只是一個給開發(fā)人員的建議或提示,以便它們知道 Angular 期望用什么。 它們不應(yīng)該像現(xiàn)在一樣是硬需求,但目前我們也不知道該如何把它們設(shè)置為可選的。

不過,有一個 npm 的新特性申請,叫做“可選的 peerDependencies ”,它將會允許我們更好的對這種關(guān)系建模。 一旦它被實現(xiàn)了, Angular 將把所有填充庫從 peerDependencies 區(qū)切換到 optionalPeerDependencies 區(qū)。

轉(zhuǎn)自CSDN

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,769評論 25 709
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,253評論 6 342
  • “看東西只有用心才能看清楚,重要的東西用眼睛是看不見的?!?by《小王子》 讀完《小王子》好些天了,直到今天的...
    靈犀victory閱讀 366評論 4 4
  • 海水拍打著的小島 難道是顧城和英兒戀愛的小島嗎 它是充滿詩情畫意的激流島嗎 定格的記憶在小島背風(fēng)的閣樓里 冷風(fēng)里吹...
    泰王國的中國人閱讀 165評論 0 0

友情鏈接更多精彩內(nèi)容