强制依赖使用特定的子依赖版本

时间:2016-11-30 09:23:15

标签: node.js npm webpack npm-shrinkwrap

我正在使用webpack和npm模块构建我的网站代码并解决以下问题:

我的代码使用jQuery 3.1.1并添加了一些插件。 我还使用了一个依赖于jQuery< = 2.2.4的依赖性。 问题是,子依赖的对象显然不知道我的jQuery插件,因为该模块使用不同的jquery版本。

如何强制所有依赖项(顶级和嵌套)使用一个版本的jQuery?因此require("jquery")总是解析为jQuery 3.1.1。

我尝试使用npm shrinkwrap来覆盖依赖项版本,但这似乎不起作用。这是我修改后的shrinkwrap文件:

{
  "name": "example",
  "version": "0.1.0",
  "dependencies": {
    "can": {
      "version": "2.3.27",
      "from": "can@>=2.3.23 <3.0.0",
      "resolved": "https://registry.npmjs.org/can/-/can-2.3.27.tgz",
      "dependencies": {
        "jquery": {
          "version": "3.1.1",
          "from": "^3.1.1"
        }
      }
    }
  }
}

但是模块的依赖性仍然是jQuery 2.2.4而npm install打印npm ERR! invalid: jquery@3.1.1 /path/.../can/node_modules/jquery

也可以接受使用webpack而不是npm来解决问题的解决方案。

1 个答案:

答案 0 :(得分:3)

我自己使用webpack别名找到了解决方案。

resolve: {
    root: __dirname,
    alias: {
        "jquery": "node_modules/jquery/src/jquery",
    }
}

现在,每个使用require('jquery')的模块都会加载位于别名路径下的jquery模块,而不管模块的package.json中是否有指定的版本。

我现在暂时打开这个问题,因为这个解决方案需要webpack,如果只有npm解决方案,我会感兴趣。