浅谈 npm

1. node 与 npm 的关系


  • 首先,npm 是用 node 编写的,所以我们在安装 node 之后才能使用 npm。当然,我们安装 node 时,会自动安装 npm。
  • 正因为 npm 是用 node 编写的,所以 node 和 npm 版本之间存在一个依赖关系,我们可以使用 nvm 来做 node 版本管理的工作,这样不仅可以避免一些安装错误,还可以轻松地切换 node 和 npm 的版本。当然这样的 node 版本管理工具还很多,大家可以根据需要选择合适的版本管理工具。
  • 我们可以通过 nrm 更加轻松地管理我们的 npm 镜像。

2. npm 2 和 npm 3+ 安装依赖的区别


  • npm 3+ 版本安装的依赖是同级的,比如我们有一个 app 依赖了包 a 和包 b,包 a 依赖包 c,包 b 也依赖包 c,那么安装依赖之后,a、b、c 三个包会同级出现在 node_modules 中。这里会出现一种情况,如果包 a 依赖 v1.0.0 的包 c,包 b 依赖 v2.0.0 的包 c,那么安装依赖的之后的 node_modules 是怎样的呢?
  • 当 node_modules 中已经存在了 v1.0.0 的包 c 时,包 b 依赖的 v2.0.0 的包 c 会被嵌套安装在包 b 的 node_modules 中。
  • npm 2 版本安装的依赖是嵌套的,也就是说在 node_modules 的浅层只会存在包 a 和包 b,v1.0.0 的包 c 会被安装到包 a 的 node_modules 下,v2.0.0 的包 c 会被安装到包 b 的 node_modules 下。

3. yarn 和 npm


  • yarn 为了能准确存储每个依赖的安装版本,保证安装的一致性,在根目录下创建了 yarn.lock 文件,并且在添加、升级、删除时能自动更新。不仅如此,yarn 对此前安装的依赖进行离线缓存,再次安装时可以在没有任何互联网连接的情况下进行。
  • 或许是由于 yarn 对 npm 的冲击,npm 5+ 安装依赖时会在根目录下默认添加 package-lock.json,如果你使用了 npm shrinkwrap 来锁定依赖包的版本,那么此命令创建和更新的文件将优先于其他任何现有或将有的 package-lock.json 文件。伴随 node 10+ 而来的 npm 6+ 在安全和性能方面都有所增强。

4. yarn run 和 npx


  • <待更新>

5. 语义化版本


  • x.y.z(主要版本号.次要版本号.补丁版本号),在根目录中不存在版本锁定文件时,通过 npm i -S 安装的依赖都为最新版本,并会在 package.json 文件中登记一个最优版本号,在下次通过 npm i 安装依赖时,^ 意味着所安装的依赖可能为更高的次版本号或补丁版本号,~ 意味着所安装的依赖可能为更高的补丁版本号,* 意味着所安装的依赖可能为最新版本。
  • 比较特殊的情况是主要版本号为 0,或主要版本号和次要版本号均为 0 的情况,官方文档中介绍的非常详细。

6. dependencies、devDependencies、peerDependencies


  • dependencies 会将工程依赖的包名和版本范围在一个简单的对象中进行指定,不要在 dependencies 中放置转换器和测试工具,放置在 devDependencies 是更好的选择。
  • 在 npm 2 中,包 a package.json 中 peerDependencies 所指定的依赖会随着包 a 的安装被强制的安装在主工程 node_modules 的浅层,与包 a 同级。在 npm 3+,我们不会再陷入依赖地狱中,如果主工程依赖的包指定了 peerDependencies,那么我们将收到一条警告,指出未安装 peerDependencies。peerDependencies 的主要目的是提示主工程安装满足包所指定依赖版本的包,避免一些由于版本依赖的报错。

你可能感兴趣的:(浅谈 npm)