Skip to main content

日行一令:yarn import

· 约4分钟
Fortran Lee

TL;DR

如果你想将一个由npm管理的项目改成由yarn管理,yarn import正好能满足你。

为什么要改用yarn?看看下面的表格:

命令npmyarn相差字符数(算上空格)
安装package.json里的依赖npm installyarn7
安装新的依赖npm install <name>yarn add <name>3
执行scripts里的命令npm run <name>yarn <name>4

平均每个命令,yarn可以节省(7 + 3 + 4) ÷ 3 ≈ 4.67个字符。这代表了什么?

certificate of accomplishment

这图是我在一个练习打字的平台上一分钟所敲单词个数的证明。

按照上图所示,我每分钟可以敲38个单词,而平均每个单词的字符数为4.7,所以我每分钟可以敲 38 x 4.7 = 178.6 个字符,而6个字符相当于 4.67 ÷ 178.6 ≈ 0.026 分钟,≈ 1.57秒。使用yarn执行100个上述的命令,我可以节省 157 秒,何乐而不为?

其实,yarn在安装依赖时是并行的,而npm是串行的,在速度上,yarn有明显的优势;其次,团队推行统一的规范,我们自有的项目已经在使用yarn作为依赖管理工具。

“换个依赖管理工具而已,换个命令重新执行就可以了,大不了把node_modules删了再重新安装,用不着多执行一个命令…”

确实,在只有package-lock.json文件的项目里执行yarn安装命令,你有很大概率是能成功创建一个yarn.lock文件,并能正常执行程序的,但这并不是最佳实践。

Many projects currently use package-lock.json or check their node_modules into source control because they have fragile dependency trees. These projects can’t easily migrate to Yarn, because yarn install could produce a wildly different logical dependency tree. Not all trees can be represented by Yarn’s yarn.lock, and some valid trees will be automatically deduped upon install. These nuances and others present a significant barrier to manual migration.

上述引用自yarn import的官方文档,文中指出,yarn和npm所生成的依赖关系树并不一致,手动迁移存在依赖版本不一致导致执行出错的情况,这也正是本文成文的原因。

码上证明?

  1. 执行mkdir yarn-import-demo 创建一个文件夹 yarn-import-demo,然后进入文件夹 cd yarn-import-demo

  2. 执行npm init -y 初始化当前项目;

  3. 执行npm install -D typescript@4.2.2 安装指定版本依赖;

当前package-lock.json的内容如下:

{
"name": "yarn-import-demo",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"typescript": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.2.tgz",
"integrity": "sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ==",
"dev": true
}
}
}
  1. 执行yarn生成yarn.lock文件,具体内容如下:
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


typescript@^4.2.2:
version "4.8.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6"
integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==

可以看到yarn.lock文件中typescript的实际版本号是4.8.4,如果当前程序不兼容该版本的typescript,那么很有可能会导致程序执行异常。

  1. 删掉yarn.lock文件,并执行yarn import,再次查看yarn.lock的内容:
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


typescript@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.2.tgz#1450f020618f872db0ea17317d16d8da8ddb8c4c"
integrity sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ==

可以看到该yarn.lockpackage-lock.json里的版本号是完全一致的。

支持一下

暂无评论,来留下友好的评论吧