背景我们现在的项目都是用yarn来管理包的,有一个老项目是用npm来管理的。所以我决定改变一下。我的具体方法简单粗暴,直接yarninstall。问题结果发现之前好好的项目突然出现了各种问题。问题之一是反复渲染ANTD图标,显示了两个。找了一圈,发现一个好像是版本变更的ISSUE。这...可能是我切换包管理器造成的。分析问题我们项目依赖antd3.2.2版本,另外一个库json-schema-editor-visual依赖ntd@^3.1.6。在package-lock.json中,两个antd版本合二为一,最后只安装了3.2.2版本。这是因为json-schema-editor-visual中使用的是^3.1.6,没有锁定版本,所以直接和外面同时下载了一个版本。回顾下面的基础知识,npm的版本锁定规则如下:符号^:表示当主版本固定后,可以更新到最新版本。比如:vuex:"^3.1.3",3.1.3以上的3.x.x都满足。符号~:表示在固定小版本的情况下可以更新到最新版本。比如:vuex:"~3.1.3",3.1.3和3.1.x以上的都满足。Unsigned:Unsigned表示一个固定的版本号,例如:vuex:"3.1.3",此时必须安装3.1.3版本。但是使用yarninstall后发现json-schema-editor-visual还是安装了antd@3.1.6的一个版本,导致版本不一致导致的问题。示意图如下:如何使用yarnimport破局。这个命令是yarn帮助迁移当前依赖项目的package-lock.json,最小化锁文件和现有依赖树的差异。在执行的时候,也发现了一个错误。这个问题,我一直以为是node版本的问题,但是切换node版本也解决不了。最后谷歌帮我解决了问题。从这个问题中我找到了答案。最后我手动修改了package-lock.json中upath的版本为^1.0.5。执行纱线导入。终于成功了,泪目。思考与结论虽然上面只是提到了antd版本不一致导致的问题,但其实还有其他版本不一致导致的问题。因此,我们在切换包管理时,尽量保持包版本一致。一般可以使用官方的命令,比如yarn的yarnimport,还有pnpm提供的。使用pnpmimport来处理它们是最合适的。
