本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
- 前言
大家好,我是若川。为了能帮助到更多对源码感兴趣、想学会看源码、提升自己前端技术能力的同学。我倾力组织了每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信
ruochuan02
参与。
想学源码,极力推荐之前我写的《学习源码整体架构系列》 包含jQuery
、underscore
、lodash
、vuex
、sentry
、axios
、redux
、koa
、vue-devtools
、vuex4
、koa-compose
、vue-next-release
、vue-this
、create-vue
、玩具vite
等20余篇源码文章。
最近组织了源码共读活动,大家一起学习源码。于是搜寻各种值得我们学习,且代码行数不多的源码。
之前写了 Vue3
相关的两篇文章。
文章里都是写的使用 yarn
。参加源码共读的小伙伴按照我的文章,却拉取的最新仓库代码,发现 yarn install
安装不了依赖,向我反馈报错。于是我去 github仓库
一看,发现尤雨溪把 Vue3仓库
从 yarn
换成了 pnpm
。贡献文档中有一句话。
We also recommend installing ni to help switching between repos using different package managers.
ni
also provides the handynr
command which running npm scripts easier.
我们还建议安装 ni 以帮助使用不同的包管理器在 repos 之间切换。
ni
还提供了方便的nr
命令,可以更轻松地运行 npm 脚本。
这个 ni
项目源码虽然是 ts
,没用过 ts
小伙伴也是很好理解的,而且主文件其实不到 100行
,非常适合我们学习。
阅读本文,你将学到:
1 | sh复制代码1. 学会 ni 使用和理解其原理 |
- 原理
ni 假设您使用锁文件(并且您应该)
在它运行之前,它会检测你的 yarn.lock
/ pnpm-lock.yaml
/ package-lock.json
以了解当前的包管理器,并运行相应的命令。
单从这句话中可能有些不好理解,还是不知道它是个什么。我解释一下。
1 | bash复制代码使用 `ni` 在项目中安装依赖时: |
我看源码发现:ni
相关的命令,都可以在末尾追加\?
,表示只打印,不是真正执行。
所以全局安装 ni
后,可以尽情测试,比如 ni \?
,nr dev --port=3000 \?
,因为打印,所以可以在各种目录下执行,有助于理解 ni
源码。我测试了如下图所示:
假设项目目录下没有锁文件,默认就会让用户从npm、yarn、pnpm
选择,然后执行相应的命令。
但如果在~/.nirc
文件中,设置了全局默认的配置,则使用默认配置执行对应命令。
Config
1 | ini复制代码; ~/.nirc |
因此,我们可以得知这个工具必然要做三件事:
1 | bash复制代码1. 根据锁文件猜测用哪个包管理器 npm/yarn/pnpm |
接着继续看看 README
其他命令的使用,就会好理解。
- 使用
看 ni github文档。
npm i in a yarn project, again? F**k!ni - use the right package manager
全局安装。
1 | bash复制代码npm i -g @antfu/ni |
如果全局安装遭遇冲突,我们可以加上 --force
参数强制安装。
举几个常用的例子。
3.1 ni - install
1 | bash复制代码ni |
1 | bash复制代码ni axios |
3.2 nr - run
1 | bash复制代码nr dev --port=3000 |
1 | bash复制代码nr |
1 | bash复制代码nr - |
3.3 nx - execute
1 | bash复制代码nx jest |
- 阅读源码前的准备工作
4.1 克隆
1 | sh复制代码# 推荐克隆我的仓库(我的保证对应文章版本) |
众所周知,看一个开源项目,先从 package.json 文件开始看起。
4.2 package.json 文件
1 | js复制代码{ |
根据 dev
命令,我们找到主入口文件 src/ni.ts
。
4.3 从源码主入口开始调试
1 | ts复制代码// ni/src/ni.ts |
找到 ni/package.json
的 scripts
,把鼠标移动到 dev
命令上,会出现运行脚本
和调试脚本
命令。如下图所示,选择调试脚本。
- 主流程 runner - runCli 函数
这个函数就是对终端传入的命令行参数做一次解析。最终还是执行的 run
函数。
对于 process
不了解的读者,可以看阮一峰老师写的 process 对象
1 | ts复制代码// ni/src/runner.ts |
我们接着来看,run
函数。
- 主流程 runner - run 主函数
这个函数主要做了三件事:
1 | bash复制代码1. 根据锁文件猜测用哪个包管理器 npm/yarn/pnpm - detect 函数 |
1 | ts复制代码// ni/src/runner.ts |
我们学习完主流程,接着来看两个重要的函数:detect
函数、parseNi
函数。
根据入口我们可以知道。
1 | ts复制代码runCli(parseNi) |
6.1 根据锁文件猜测用哪个包管理器(npm/yarn/pnpm) - detect 函数
代码相对不多,我就全部放出来了。
1 | bash复制代码主要就做了三件事情 |
1 | js复制代码// ni/src/agents.ts |
1 | ts复制代码// ni/src/detect.ts |
接着我们来看 parseNi
函数。
6.2 抹平不同的包管理器的命令差异 - parseNi 函数
1 | ts复制代码// ni/src/commands.ts |
通过 getCommand
获取命令。
1 | ts复制代码// ni/src/agents.ts |
1 | ts复制代码// ni/src/commands.ts |
6.3 最终运行相应的脚本
得到相应的命令,比如是 npm i
,最终用这个工具 execa 执行最终得到的相应的脚本。
1 | ts复制代码await execa.command(command, { stdio: 'inherit', encoding: 'utf-8', cwd }) |
- 总结
我们看完源码,可以知道这个神器 ni
主要做了三件事:
1 | bash复制代码1. 根据锁文件猜测用哪个包管理器 npm/yarn/pnpm - detect 函数 |
我们日常开发中,可能容易 npm
、yarn
、pnpm
混用。有了 ni
后,可以用于日常开发使用。Vue
核心成员 Anthony Fu 发现问题,最终开发了一个工具 ni 解决问题。而这种发现问题、解决问题的能力正是我们前端开发工程师所需要的。
另外,我发现 Vue
生态很多基本都切换成了使用 pnpm。
因为文章不宜过长,所以未全面展开讲述源码中所有细节。非常建议读者朋友按照文中方法使用VSCode
调试 ni
源码。学会调试源码后,源码并没有想象中的那么难。
关于 && 交流群
最后可以持续关注我@若川。我倾力持续组织了一年每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信 ruochuan02
参与。
另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》,目前是掘金关注人数(4.2k+人)第一的专栏,写有20余篇源码文章。包含jQuery
、underscore
、lodash
、vuex
、sentry
、axios
、redux
、koa
、vue-devtools
、vuex4
、koa-compose
、vue 3.2 发布
、vue-this
、create-vue
、玩具vite
、create-vite
等20余篇源码文章。
作者:常以若川为名混迹于江湖。欢迎加我微信ruochuan02
。前端路上 | 所知甚少,唯善学。
关注公众号若川视野,每周一起学源码,学会看源码,进阶高级前端。
segmentfault
若川视野专栏,开通了若川视野专栏,欢迎关注~
掘金专栏,欢迎关注~
知乎若川视野专栏,开通了若川视野专栏,欢迎关注~
github blog,求个star
^_^~
本文转载自: 掘金