February 6, 2024
By: zs.d

前端项目包管理工具(npm&yarn)的规范使用

背景

yarnnpm是前端最常见的nodejs包管理工具, 咱们项目中有混用的情况(不是不可以, 要搞清原理), 国内的网络环境复杂, 以前最大的国内镜像CNPM域名发生变化后前端都遇到了证书错误的问题.

本文对两者的交叉使用做了介绍, 也对使用方法给出了建议.

npm 和 yarn 的简介

  • npm(Node Package Manager):是Node.js的包管理器,自2009年起伴随Node.js发布,目标是让JavaScript开发者轻松分享和重用代码。它支持安装和发布遵循CommonJS规范的包,是世界上最大的软件注册表,提供了丰富的JavaScript库和应用。

  • Yarn:由Facebook、Google、Exponent和Tilde在2016年共同开发,旨在改进包的安装速度、安全性和依赖管理。Yarn通过缓存和并行下载提高了性能,引入了yarn.lock文件来确保依赖版本的一致性。

性能和特性对比

  • 安装速度Yarn由于其缓存和并行处理机制,在性能上通常比npm更快。
  • 安全性Yarn在包安装前进行完整性校验,增强了安全性。
  • 依赖管理npm使用package-lock.json,而Yarn使用yarn.lock文件来锁定依赖,两者都旨在确保项目依赖的一致性。
  • 缓存机制:两者都提供了缓存机制,npm从5版本开始自动缓存下载过的包,减少了重复下载的需要。

远程包服务器

  • 共享的包注册表npmYarn默认都使用npm官方的包注册表(registry),意味着它们访问和下载的是相同的包和版本。
  • 注册表配置灵活性:两者都允许用户配置使用不同的包注册表,包括设置为私有注册表,满足特定的项目需求或安全要求。
  • 国内镜像: https://npmmirror.com/

配置文件加载顺序

两者的配置不交叉, 不互相读取, yarn的配置文件为.yarnrc, npm的配置文件为.npmrc, 都遵循最近原则, 离代码越近, 配置的优先级越高.

.yarnrc 加载顺序:

  1. 项目级别 .yarnrc
  2. 用户级别 ~/.yarnrc
  3. 全局配置 yarn_root/config/.yarnrc

.npmrc 加载顺序:

  1. 项目级别 .npmrc
  2. 用户级别 ~/.npmrc
  3. 全局配置 npm_root/config/.npmrc

需要注意点是, yarn和npm 各自只管自己的配置文件. 如果项目内有yarnrc, 无npmrc, 那么 yarn install 时, 找不到项目内的 yarnrc, 就会去找用户级别yarnrc, 再找不到就找全局级别的yarnrc. 总之就是不会找 npmrcs. npm install 也是同样道理会只关注自己的npmrc.

这也解释了为什么yarn安装证书出错之后, npm有可能安装成功.

配置文件: 特定包配特定源

项目中有配置xxx_mirror的情况, 比如electron_mirror, 这是因为支持二进制文件的独立映射, 以前国内镜像不完善的情况下有部分映射的需求.

这种做法现在不推荐, 此处只是作为介绍.

格式为 ${packageName}_mirror ${URL_mirror_package}

举例:

electron_mirror "https://registry.npmmirror.com/binary.html?path=electron/"
electron_builder_binaries_mirror "https://registry.npmmirror.com/binary.html?path=electron-builder-binaries/"
flow_mirror "https://registry.npmmirror.com/binary.html?path=flow/"
node_unofficial_builds_mirror "https://registry.npmmirror.com/binary.html?path=flow/"

配置命令

commanddescription
yarn config get proxy查看用户级别 HTTP 代理
yarn config get https-proxy查看用户级别 HTTPS 代理
yarn config set proxy http://localhost:1080设置用户级别 HTTP 代理
yarn config set https-proxy http://localhost:1080设置用户级别 HTTPS 代理
yarn config delete proxy删除用户级别 HTTP 代理
yarn config delete https-proxy删除用户级别 HTTPS 代理
yarn config list -l查看 yarn 的所有配置
npm config get proxy查看用户级别 HTTP 代理
npm config get https-proxy查看用户级别 HTTPS 代理
npm config set proxy http://localhost:1080设置用户级别 HTTP 代理
npm config set https-proxy http://localhost:1080设置用户级别 HTTPS 代理
npm config delete proxy删除用户级别 HTTP 代理
npm config delete https-proxy删除用户级别 HTTPS 代理
npm config list -l查看 npm 的所有配置

依赖安装以及lock

项目中, yarnnpm都以package.json作为自己的信息来源, 下载的包都会放到node_modules之下.

yarn诞生时候主打特性是本地缓存, 这要求有精确的版本对应, 引入了yarn.lock文件.

npm在5.0以后, 也引入了缓存和锁的机制. 以package-lock.json为版本锁.

锁文件中以源地址+版本号作为标识.

npm无视yarn.lock, 但是yarn会尊重package-lock.json的版本规则.

所以, 在CNPM镜像域名切换前的lock文件如果存在, 不论npm还是yarn都不会安装成功.

结论&共识

  1. 删除过期的镜像配置, 如果能翻墙, 是不需要配置镜像的.
    • yarn 删除 yarn config delete registry
    • npm 删除 npm config delete registry --global
  2. 如果需要配置, 参照最后一节中的链接, 配置正确的url.
  3. 只需配置一个镜像, 不需要为electron之类二级二进制依赖单独配置.
  4. 统一使用yarn来安装应用.
  5. 原来有对已经停用npm镜像有依赖的项目, 还需要删除lock文件, 重新yarn install生成lock后提交到代码管库.

参考链接

Tags: 前端