TL;DR
如果你想将一个由npm管理的项目改成由yarn管理,yarn import
正好能满足你。
为什么要改用yarn?看看下面的表格:
命令 | npm | yarn | 相差字符数(算上空格) |
---|---|---|---|
安装package.json里的依赖 | npm install | yarn | 7 |
安装新的依赖 | npm install <name> | yarn add <name> | 3 |
执行scripts里的命令 | npm run <name> | yarn <name> | 4 |
平均每个命令,yarn可以节省(7 + 3 + 4) ÷ 3 ≈ 4.67
个字符。这代表了什么?
这图是我在一个练习打字的平台上一分钟所敲单词个数的证明。
按照上图所示,我每分钟可以敲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 theirnode_modules
into source control because they have fragile dependency trees. These projects can’t easily migrate to Yarn, becauseyarn install
could produce a wildly different logical dependency tree. Not all trees can be represented by Yarn’syarn.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所生成的依赖关系树并不一致,手动迁移存在依赖版本不一致导致执行出错的情况,这也正是本文成文的原因。
码上证明?
执行
mkdir yarn-import-demo
创建一个文件夹yarn-import-demo
,然后进入文件夹cd yarn-import-demo
;执行
npm init -y
初始化当前项目;执行
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
}
}
}
- 执行
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,那么很有可能会导致程序执行异常。
- 删掉
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.lock
跟package-lock.json
里的版本号是完全一致的。