npm和yarn哪里不一样

npm是啥?

npm是javascript的包管理工具,是前端模块化下的一个标志性产物。简单地说,就是通过npm下载模块,复用已有的代码,提高工作效率。

其实在最早期的npm版本(npm v2),npm的设计可以说是非常的简单,在安装依赖的时候会将依赖放到 node_modules文件中。

安装机制

  • npm install执行之后, 首先会检查和获取 npm的配置
    优先级为: 项目级的.npmrc文件 > 用户级的 .npmrc文件 > 全局级的 .npmrc > npm内置的 .npmrc 文件
  • 检查项目中是否有 package-lock.json文件
  • 有, 检查 package-lock.json和 package.json声明的依赖是否一致:
  • 一致, 直接使用package-lock.json中的信息,从网络或者缓存中加载依赖
  • 不一致

npm version <= v5.0.x 根据package-lock文件下载,
npm version v5.1.5-v5.4.2 当package.json声明的依赖版本规范有符合的版本时,会忽略lock文件。安装package.json安装,并在安装后更新lock文件。
npm version >= v5.4.2 当package.json声明的依赖版本规范和lock文件中的版本对比,相符合则按照lock文件安装依赖,若不符合则按照package.json安装,并在安装后更新lock文件。

  • 没有 根据package.json递归构建依赖树
  • 根据依赖树检索是否有缓存
  • 有 直接获取缓存中的依赖解压到 node_modules
  • 没有 从npm远端仓库下载包,校验包的完整性,同时添加到缓存中,解压到 node_modules
  • 生成 package-lock.json 文件

缺点

  • 速度慢
  • 安装的无法保持一致性
  • 存在嵌套地狱
  • 输出冗长

优点

官方推荐

yarn是啥?

yarn 是一个由Facebook、Google、Exponent和Tilde构建的新的JavaScript包管理器。它的出现是为了解决历史上npm的某些不足

安装机制

  • 检测(checking)
    检测我们的项目中是否存在npm相关的文件,比如package-lock.json等;如果有,就会有相关的提示用户注意:这些文件可能会存在冲突。在这一步骤中 也会检测系统OS, CPU等信息
  • 解析包(Resolving Packages)
    析依赖树中的每一个包的信息
  • 获取首层依赖
    dependencies、devDependencies、optionalDependencies
  • 获取包的依赖信息
    遍历首层依赖的方式
  • 获取包
  • 链接包
  • 构建包

优点

  • 并行安装
  • 离线安装
  • 版本统一
  • 输出简洁
  • 更好的语义化