Running Yarn with offline mode

yarn 版本 v1.16.0 (多少版本都无所谓啦我觉得

简单介绍一下yarn安装包的机制、yarn的缓存、yarnoffline mode的开启方式与验证方式

1. Yarn自身的Cache

首先我们在workspace文件夹下创建一个package.json文件,内容如下:

{
  "name": "yarn-offline",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "is-array": "^1.0.1"
  }
}

然后,在workspace下运行指令

yarn

可以得到结果

$ yarn
yarn install v1.16.0
info No lockfile found.
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
Done in 1.02s.

此时可以发现,yarnworkspace下新建了文件yarn.lock,文件中包含以下内容

is-array@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-array/-/is-array-1.0.1.tgz#e9850cc2cc860c3bc0977e84ccf0dd464584279a"
  integrity sha1-6YUMwsyGDDvAl36EzPDdRkWEJ5o=

其中resolved字段可以简单的理解为这个包的下载路径。如果我们将node_module文件夹删除,并且清除yarn的安装缓存文件后再执行一遍yarn指令,包管理系统会从resolved指示的网址重新下载我们需要的包。

所以当我们发布一个项目的时候我们应该将yarn.lock文件一并发布以保证在不同的主机上可以拥有相同版本的第三方依赖。

当我们在一台机器上执行过yarn的安装指令过后,yarn会将这个包缓存在文件系统中以便我们重新安装。

可以试着抓包看看,需要做的操作:

  1. 删除node_modules文件夹
  2. 修改yarn.lock文件,将https改为http(方便抓包
  3. workspace下执行yarn
rm -rf node_modules
# 修改yarn.lock文件
yarn

可以看到,未抓到任何http请求。

我们可以尝试着清楚yarn的缓存再执行一遍操作

rm -rf node_modules && yarn cache clean && yarn

此时有请求了

2. offline mode

在弱网环境下想在一台没有缓存的机器上装包显得很困难。所幸的是yarn提供了离线环境offline专门处理弱网环境下的安装问题。

想要启用offline mode,我们得做以下操作。

1. 设置.yarnrc文件

workspace目录下新建.yarnrc文件用于设置项目层面的yarn配置。

.yarnrc文件内添加

yarn-offline-mirror "./npm-packages-offline-cache"
yarn-offline-mirror-pruning true

为什么不使用yarn config指令?

它会在用户层面的.yarnrc文件内新增配置,会对机器上所有使用yarn的项目都产生影响

2. 重置项目

删除node_modules目录以及yarn.lock文件,并重新安装项目依赖

rm -rf node_modules/ yarn.lock
yarn

此时会发现,生成了和之前相同的yarn.lock,生成了node_modules文件夹,生成了npm-packages-offline-cache文件夹并且其中包含is-array-1.0.1文件

3. 验证

验证一下自己是否已经可以在无网络环境下安装依赖

  1. 关闭wifi
  2. 清空yarn缓存 - yarn cache clean
  3. workspace目录下执行yarn

此时,在联网环境下使用yarn指令安装包也不会再发送网络请求。