我爱编程Angular

Angular2 依赖包详解说明

2016-12-13  本文已影响375人  jicemoon

Angular 应用程序以及 Angular 本身都依赖于很多第三方包 ( 包括 Angular 自己 ) 提供的特性和功能。这些包由 Node 包管理器 (npm) 负责安装和维护。

Angular2开发时依赖的包在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”, 
    “lite-server”: “^2.2.2”, 
    “typescript”: “^2.0.3” 
  } 
} 

package.json 包含两组包: dependencies 和 devDependencies 。

dependencies

dependencies 下的这些包是 运行 本应用的基础,而 devDependencies 下的只在 开发 此应用时才用得到。 通过为 install 命令添加 –production 参数,你在产品环境下安装时排除 devDependencies 下的包,就像这样:

npm install my-application –production 

应用程序的 package.json 文件中, dependencies 区下有三类包:

  • 特性 - 特性包为应用程序提供了框架和工具方面的能力。
  • 填充 (Polyfills) - 填充包弥合了不同浏览器上的 JavaScript 实现方面的差异。
  • 其它 - 其它库对本应用提供支持,比如 bootstrap 包提供了 HTML 中的小部件和样式。

特性包

今后,应用程序很可能还会需要更多的包,比如 HTML 控件、主题、数据访问,以及其它多种工具

填充 (Polyfill) 包

在应用程序的运行环境中, Angular 需要某些 填充库 。 我们通过特定的 npm 包来安装这些填充库, Angular 本身把它列在了package.json 中的 peerDependencies 区。

但我们必须把它列在我们 package.json 文件的 dependencies 区。

查看下面的“ 为什么用 peerDependencies? ”,以了解这项需求的背景。

其它辅助库

devDependencies

列在 package.json 文件中 devDependencies 区的包会帮助我们开发该应用程序。 我们不用把它们部署到产品环境的应用程序中——虽然这样做也没什么坏处。

为什么使用 peerDependencies ?

在“快速起步”的 package.json 文件中,并没有 peerDependencies 区。 但是 Angular 本身在 它自己的 package.json 中有, 它对我们的应用程序有重要的影响。

它解释了为什么我们要在“快速起步”的 package.json 文件中加载这些 填充库 (polyfill) 依赖包, 以及为什么我们在自己的应用中会需要它们。

然后是对 平级依赖 (peer dependencies) 的简短解释。

每个包都依赖其它的包,比如我们的应用程序就依赖于 Angular 包。

两个包, “A” 和 “B” ,可能依赖共同的第三个包 “C” 。 “A” 和 “B” 可能都在它们的 dependencies 中列出了 “C” 。

如果 “A” 和 “B” 依赖于 “C” 的不同版本 (“C1” 和 “C2”) 。 npm 包管理系统也能支持! 它会把 “C1” 安装到 “A” 的 node_modules 目录下给 “A” 用,把 “C2” 安装到 “B” 的 node_modules 目录下给 “B” 用。 现在, “A” 和 “B” 都有了它们自己的一份 “C” 的复本,它们运行起来也互不干扰。

但是有一个问题。包 “A” 可能只需要 “C1” 出现就行,而实际上并不会直接调用它。 “A” 可能只有当 每个人都使用 “C1” 时 才能正常工作。如果程序中的任何一个部分依赖了 “C2” ,它就会失败。

要想解决这个问题, “A” 就需要把 “C1” 定义为它的 平级依赖 。

在 dependencies 和 peerDependencies 之间的区别大致是这样的:

dependency 说:“我需要这东西 对我 直接可用。”

peerDependency 说:“如果你想使用我,你得先确保这东西 对你 可用”

Angular 就存在这个问题。 因此, Angular 的 package.json 中指定了一系列 平级依赖 包, 把每个第三方包都固定在一个特定的版本上。

我们必须自己安装 Angular 的 peerDependencies 。
当 npm 安装那些在 我们的 dependencies 区指定的包时, 它也会同时安装上在 那些包 的 dependencies 区所指定的那些包。 这个安装过程是递归的。

但是在 npm 的第三版中, 它不会 安装列在 peerDependencies 区的那些包。

这意味着,当我们的应用程序安装 Angular 时, npm 将不会自动安装列在 Angular 的 peerDependencies 区的那些包

幸运的是, npm 会在下列情况下给我们警告: (a) 当任何 平级依赖 缺失时或 (b) 当应用程序或它的任何其它依赖安装了与 平级依赖 不同版本的包时。

这些警告可以避免因为版本不匹配而导致的意外错误。 它们让我们可以控制包和版本的解析过程。

我们的责任是,把所有 平级依赖 包都 列在我们自己的 devDependencies 中 。

PEERDEPENDENCIES 的未来

Angular 的填充库依赖只是一个给开发人员的建议或提示,以便它们知道 Angular 期望用什么。 它们不应该像现在一样是硬需求,但目前我们也不知道该如何把它们设置为可选的。

不过,有一个 npm 的新特性申请,叫做“可选的 peerDependencies ”,它将会允许我们更好的对这种关系建模。 一旦它被实现了, Angular 将把所有填充库从 peerDependencies 区切换到 optionalPeerDependencies 区。

转自CSDN

上一篇 下一篇

猜你喜欢

热点阅读