为何不少时候咱们喜欢用yarn管理项目,而不喜欢用npm呢?node
场景:
咱们常常遇到的一种状况是:你设置好了你的网络,顺利地安装好了一切依赖,写好了package.json,npm给你自动生成了一个package-lock.
json,在你的电脑上没有问题,可是你上传到git,再交给别的同窗或者上传到服务器的时候,他们却怎么npm install也不成功了,这是由于
了确保一致性,npm在package-lock.json里写明了每个包的网络下载路径,而你同窗的网络环境没有你这里好,因此你能成功下载的东西到
他这里就下载不了了,结果为了这个网络设置又要折腾很长时间,虽说国内也有淘宝镜象的cnpm这样的替代品,但也不时出现各类奇怪现象,
仍是不如正宗的npm顺畅。
复制代码
为了完全解决这个问题,咱们须要用到Yarn。git
安装yarnnpm
brew install yarn
复制代码
关于brew查看https://brew.sh/json
yarn
复制代码
这时它会生成一个yarn.lock的文件,这个文件的内容和npm生成的package-lock.json文件很像,也包含了各个依赖包的网络下载路径(实际上,npm的package-lock.json这个概念就是从yarn借鉴过来的)。而后你能够执行yarn start来启动开发环境,或者yarn run build来执行编译,npm能执行什么命令,yarn也能够。至此为止,彷佛没有看到yarn有什么神奇之处。缓存
离线下载资源才是yarn的关键点bash
为了能有一个地方存储yarn下载下来的安装包,咱们须要设置一个与项目和机器完全无关的文件夹,假定咱们就在电脑的根目录下存储这些文件,咱们首先创建一个文件夹,容许别人访问它:服务器
sudo mkdir /Projects
sudo chmod 777 /Projects
复制代码
而后,咱们告诉yarn到这里来存储和读取离线安装包:网络
yarn config set yarn-offline-mirror /Projects/yarn-offline-mirror
复制代码
这时候,yarn会在你当前用户的根目录下生成一个.yarnrc的文件,你能够把这个文件搬到你项目的根目录下:网站
mv ~/.yarnrc ./
复制代码
这个文件的内容很短,打开来看一下:ui
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
复制代码
lastUpdateCheck 1520049128107
yarn-offline-mirror "/Projects/yarn-offline-mirror"
复制代码
它的大意是说这是一个自动生成的文件,你不该该直接修改文件内容(不过其实若是你知道你在干的是什么的,修改也是没有关系的,毕竟不是二进制文件)。这里面就列出了咱们离线包的存储位置。
接下来咱们开始往咱们的离线文件夹灌入内容。咱们先把咱们当前项目的node_modules文件夹和yarn.lock文件删除:
rm -rf node_modules/ yarn.lock
复制代码
而后,咱们执行一下
yarn install
复制代码
这时候你会看到yarn不但从新生成了node_modules文件夹和yarn.lock文件,而且把下载下来的安装包全都放入了咱们刚才设定好的离线安装路径/Projects/yarn-offline-mirror。
咱们怎么验证yarn确实能够离线安装呢?咱们仍是先把node_modules文件夹删掉,注意,此次不要再删yarn.lock文件了:
rm -rf node_modules
复制代码
为了完全起见,咱们把yarn的缓存也删掉:
yarn cache clean
复制代码
而后,咱们把wifi关掉,把网线拔掉,而后咱们再执行:
yarn install -offline
复制代码
成功了!在没有任何网络的状况下,咱们继续能够重建node_modules文件夹,它取的就是咱们刚才设定好的/Projects/yarn-offline-mirror里的内容。
意义 那么这有什么意义呢?仅仅如此仍是不够的,咱们须要把整个yarn-offline-mirror上传到咱们本身的git库里,为它单独建一个库,这样咱们的多个项目就能够共享这同一个yarn-offline-mirror,而没必要浪费太多的空间。而且因为这是在咱们本身的文件系统中,若是是在服务器端或者其余同事的电脑中执行yarn install -offline的话,它也不会再去访问npm的官方网站获取安装包,毕竟那样访问不通的几率很大,在中国目前这种网络环境下。
这么麻烦,为何我不直接把整个node_modules文件夹放入git库呢?这不也是同样的效果吗?某种意义上说,的确是这样的,可是
node_modules里存储的是解压缩以后的全部文件,动辄几万甚至几十万个文件都很常见,因此一般咱们在建项目的时候是把
node_modules文件夹放在.gitignore文件中忽略掉的。而yarn-offline-mirror里存放的是安装包自己,是未经解压缩的.tgz文件,
通常一个项目几十最多几百个文件就够了,这样对于咱们的git服务器的管理也是一件好事,因此咱们能够把它放在git里管理起来。
复制代码
yarn的使用
如今Yarn已经 安装完毕,能够开始使用。如下是一些你须要的最经常使用的命令:
初始化新项目
yarn init
复制代码
添加依赖包
yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]
复制代码
将依赖项添加到不一样依赖项类别
分别添加到 devDependencies、peerDependencies 和 optionalDependencies:
yarn add [package] --dev
yarn add [package] --peer
yarn add [package] --optional
复制代码
升级依赖包
yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]
复制代码
移除依赖包
yarn remove [package]
安装项目的所有依赖
复制代码
yarn
或者
yarn install
复制代码