npm与package.json
从概念上讲,npm-install的“输入”是package.json,而其“输出”是一个完整的node_modules树:表示您声明的依赖项。在理想的世界中,npm就像一个纯函数一样工作:package.json相同的node_modules 树应该随时产生完全相同的树。
但是在许多其他情况下,npm无法做到这一点。原因有很多:
1,可能已经使用了不同版本的npm(或其他软件包管理器)来安装软件包,每种版本使用的安装算法略有不同。
2,自上次安装软件包以来,可能已经发布了直接semver-range软件包的新版本,因此将使用较新的版本。
3,您的一个依赖项的一个依赖项可能已经发布了一个新版本,即使您使用固定的依赖项指定符(1.2.3代替^1.2.3),该版本也会更新。
4,您从中安装的注册表不再可用,或允许版本发生变化(与主要的npm注册表不同),并且现在在同一版本号下存在一个软件包的不同版本。
package-lock.json的存在会更改安装行为,从而:
1,包锁描述的模块树被复制。这意味着使用“已解决”中引用的特定文件(如果有)来重现文件中描述的结构,如果没有,则使用“版本”降到正常的包解析度。
2,遍历树,以常规方式安装所有丢失的依赖项
当我们使用 nvm 切换不同 node 版本的同时,npm 的版本同时也会被切换掉(因为不同node版本自带的npm版本不同),所以当我们切换npm版本的时候,若遇到运行或者安装报错,建议执行如下命令
npm cache clear --force npm uninstall rm -rfv node_modules rm -rfv package-lock.json npm install
即先删除npm安装模块node_module,然后清除node_module的缓存,删除包锁定文件package-lock.json文件,最后重新安装依赖