npm官方文档里明确说明:
This file is
intended to be committed into source repositories
, and serves various purposes:
这个文件(指package-lock.json),被设计出来就是要提交到源码库,原因如下
:
Describe a single representation of a dependency tree such that teammates, deployments, and continuous integration are guaranteed to install exactly the same dependencies.
Provide a facility for users to “time-travel” to previous states of node_modules without having to commit the directory itself.
To facilitate greater visibility of tree changes through readable source control diffs.
And optimize the installation process by allowing npm to skip repeated metadata resolutions for previously-installed packages.
(懒得翻译了)
下面说人话
今天上线,本地测试完全ok,上线之后部署总是出bug。
经过一番痛苦的排查,发现:一个npm包自动升级了,导致与别的包,或者与部署环境不兼容,导致报错,或者bug。
临时解决方案:锁定版本,也就是将
"^1.0.0"
写成
"1.0.0"
,重新部署,暂时搞定!
下来思考,相避免这种问题,如果把package.json里所有的包都锁定版本,行吗?不行。why?
因为npm包的依赖关系是树状的,手动能锁定的只有package.json里的第一层包的版本,每个包往下还有数不清的依赖分支,每个依赖中都有自己独立的package.json,这些你没办法都手动锁定版本,它们升级的话,一样会造成同样的问题。
package-lock.json 的出现就是为了解决上面的问题,
对整个依赖树进行版本锁定
。 这个方案大概是在npm 5之后出现的。
所以你既然选择锁定版本,那package-lock.json一定要在源码库里。
那假如说你完全不需要锁定版本这个功能,那你可以在.npmrc文件中写一句
package-lock=false
来关掉它。这样package-lock.json压根就不会生成。但你要明确的知道你为什么不需要它。
之前听到一个有趣的说法,也有一定道理。讲的是,一定不要锁定版本。因为任何npm包都有潜在的bug,你锁定了版本等于永远有一个地雷在包里,就算它已经被开发者修复升级了,由于你锁定了版本,那个地雷还是存在,指不定哪天就被你踩到。
所以
锁版本
和
不锁版本
都没错,只要你理解了其中原理,自然会根据实际情况去做出好的选择。