ycloud多版本依赖冲突案例分析

@songhlc 2018-01-26 02:28:29发表于 yonyouyc/blog

案例描述:开发人员A在项目中同时使用了ycloud和ycloud-refer两个库,启动之后发现工程之中组件注册重复了。

由于ycloud-refer依赖ycloud,当前使用版本ycloud-refer依赖的是ycloud@1.4.8,怀疑是出现版本冲突了。

进入工程查看ycloud当前版本依赖情况

npm ls ycloud

发现如下情况

|-- ycloud@1.3.23
|-- ycloud-refer@1.1.3
    |——ycloud@1.4.8

再查看打包好的lib.0.js. 里面打包进了两个ycloud.min.js。

由于ycloud中加载时会动态注册组件,所以在运行的时候出现上面组件注册重复出错的情况。

将本地依赖的ycloud改成1.4.8,问题解决!!!

=================== 分割线 ======================

但,这并不是最终解决方案,如果以后ycloud升级了,还是依然会有问题。

分析:由于此处ycloud-refer是必须依赖ycloud进行运行的,所以在ycloud-refer工程中的package依赖做了处理。

// 老的依赖
"dependencies": {
    "knockout": "^3.4.2",
    "lodash": "^4.17.4",
    "ycloud": "^1.4.8"
}
// 新的依赖
"devDependencies":{
    "ycloud": "^1.4.8"
}
"dependencies": {
    "knockout": "^3.4.2",
    "lodash": "^4.17.4"
}

没错,把对ycloud的依赖从dependencies移到了devDependencies里!

ycloud-refer发布后在工程中重新安装修改后的ycloud-refer

yarn add ycloud-refer@1.1.4

npm ls ycloud

结果

|-- ycloud@1.4.8

完美,只剩下node_modules下的ycloud了.

关于devDependencies和dependencies的区别这个例子就更能加深大家的理解了

node_modules下的包查找依赖的优先顺序:先从当前目录下的node_modules里找,如果找不到,会到父级目录里继续找。直到根目录。所以在项目中依赖的ycloud-refer找它依赖的ycloud就会找到它上一级目录的ycloud,这样就保证都依赖同一个包了

注:此解决方案仅针对ycloud这种特殊场景,通用第三方类库是允许存在依赖不同版本的,只要确保相互之间不会有冲突即可。