用过 NPM 的朋友可能都有过下面的经历:
你创建了一个项目,用 npm 安装了一些第三方模块。一个月过去了,另外一个人想跟你一起开发这个项目,但他却无法在他的电脑上正常运行你的项目,尽管在你自己的电脑上一切如常。
你可能已经猜到了,这是因为你自己电脑上的第三方模块和他电脑上的第三方模块的版本不一致导致的。
出现这个问题的过程是这样的:当你第一次安装一个模块的时候,假设它的版本号是 1.0.0,但在 package.json 里 npm 会自动帮你设置一个版本范围:^1.0.0。一个月过去了,这个模块已经更新到了 1.1.0,但是你从来没有更新过,可是当别人在安装你的项目的时候,npm 会在他的电脑上安装这个版本范围内的最新版本,也就是 1.1.0,这里面可能会包含一些 「Breaking Changes」,所以就导致了在你电脑上好好的项目,在别人的电脑上却跑不起来。
即使这个项目只有你一个人开发,你也不应该依赖 npm 自动帮你设置的“版本范围”——一旦你一不小心运行了 npm update 来升级你的第三方依赖,你仍然会遇到上面的问题,更糟糕的是,你根本不知道你升级前用的是哪个版本的第三方模块,你可能不得不去挨个翻看你依赖的模块们有哪些 「Breaking Changes」并逐个更改,等你差不多改完的时候也该下班了,然而跟别人说好今天要完成的功能你还一点都没有开始做。
所以,聪明的开发者都会在 package.json 里锁定模块的版本号,以保证在任何情况下大家安装的模块都是一致的。
即使你的项目是用 Yarn 安装模块的,我仍然建议你锁定你的版本号。
在你使用 Yarn 安装模块的时候,这个模块的版本号会被写在 yarn.lock 这个文件里,所以当其他人也使用 Yarn 安装项目里的模块时,Yarn 会优先读取 yarn.lock 里的模块版本号以保证大家安装的模块版本是一致的——
但如果其他人使用 npm 安装了你项目的模块呢?
跟前文说到的情况一样,用 npm 安装你项目模块的人仍然会安装到最新版本的模块—— npm 并不会从 yarn.lock 文件里读取你所安装的模块的版本,这就又会导致前文提到的问题。即使你在项目的 README.md 里提到了要用 Yarn 安装项目的模块,也无法保证会没人使用 npm 安装模块,因为大家都认为,Yarn 和 npm 是兼容的。
所以,无论项目使用的是 npm 还是 Yarn,我都建议锁定模块的版本号,这样一来就可以保证无论大家在何时使用哪种包管理器,所安装的模块都是一致的。