什么是环境依赖关系和常规依赖关系的区别

时间:2016-06-23 14:28:43

标签: typescript typescript-typings

在下面的typings.json文件中,ambientDependencies(或globalDependencies)和常规依赖项之间有什么区别:

{
  "ambientDependencies": {
    "es6-shim": "registry:dt/es6-shim#0.31.2+20160317120654",
    "jasmine": "registry:dt/jasmine#2.2.0+20160412134438",
    "jquery": "registry:dt/jquery#1.10.0+20160417213236"
  },
  

"依赖":{},< ---这是做什么的?

}

typings install <something> --save将保存为依赖项,但这意味着什么?

1 个答案:

答案 0 :(得分:6)

假设您有两个依赖项:

<强>的package.json

{
    "dependencies": {
        "a": "1.0",
        "b": "2.0"
    }
}

依赖树的位置如下:

|-a@1.0
|-b@2.0

在这种情况下,将它们都设为globalDependenciesdependencies之间没有区别。 但是,当它们有自己的依赖项时会出现问题。想象一下你的依赖树看起来像这样:

|-a@1.0
|  |-b@1.0
|  |-c@1.0
|-b@2.0

当您将a@1.0安装为全局依赖项时,它将删除对b@1.0c@1.0的引用,并会要求您将这些依赖项安装为全局变量。它要求您将依赖关系树展平为:

|-a@1.0
|-b@1.0
|-b@2.0
|-c@1.0

这适用于c@1.0,但现在需要两个版本的ba@1.0取决于b@1.0,但您的应用取决于b@2.0。你安装了哪种类型的版本?如果您安装b@2.0a@1.0的类型定义可能会中断。如果您安装b@1.0,您的应用类型可能会中断。这是问题globalDependencies面临的问题。

使用typings构建类型定义并将其安装为常规依赖项时,它会包装子依赖项,而不会将它们暴露给您的应用程序。这意味着,如果您将a@1.0作为常规依赖项安装,则不会使用顶级b@2.0定义。它将改为使用自己的私有b@1.0,它不会污染您的全局命名空间。实际上,常规依赖关系保留了依赖关系树结构,它们是接近定义的首选方式。问题是并非所有库都将类型定义构建为常规依赖项。理想情况下,随着人们写出更多定义,全局变量将自然被逐步淘汰。