- 前言
大家好,我是若川。我倾力持续组织了一年每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信
ruochuan12
参与。另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》,目前是掘金关注人数(4.1k+人)第一的专栏,写有20余篇源码文章。
本文仓库 https://github.com/lxchuan12/install-pkg-analysis.git,求个star^_^
源码共读活动 每周一期,已进行到16期。Vue团队核心成员 Anthony Fu
开发的 install-pkg 小工具,主文件源码仅39行,非常值得我们学习。
阅读本文,你将学到:
1 | bash复制代码1. 如何学习调试源码 |
- install-pkg 是什么
Install package programmatically. Detect package managers automatically (npm
, yarn
and pnpm
).
以编程方式安装包。自动检测包管理器(npm
、yarn
和 pnpm
)。
1 | bash复制代码npm i @antfu/install-pkg |
1 | js复制代码import { installPackage } from '@antfu/install-pkg' |
我们看看npmjs.com @antfu/install-pkg 有哪些包依赖的这个包。
我们可以发现目前只有以下这两个项目使用了。
unplugin-icons
@chenyueban/lint
我们克隆项目来看源码。
3 克隆项目
1 | bash复制代码# 推荐克隆我的项目,保证与文章同步 |
看源码一般先看 package.json
,再看 script
。
1 | js复制代码{ |
关于调试可以看我的这篇文章:新手向:前端程序员必学基本技能——调试JS代码,这里就不再赘述了。
我们可以得知入口文件是 src/index.ts
src
文件夹下有三个文件
1 | diff复制代码src |
接着我们看这些文件源码。
- 源码
4.1 index.js
导出所有
1 | js复制代码// src/install.ts |
我们来看 install.ts
文件,installPackage
方法。
4.2 installPackage 安装包
1 | js复制代码// src/install.ts |
支持安装多个,也支持指定包管理器,支持额外的参数。
其中 github execa 是执行脚本
Process execution for humans
也就是说:最终执行类似以下的脚本。
1 | bash复制代码pnpm install -D --prefer-offine release-it react antd |
我们接着来看 detect.ts
文件 探测包管理器 detectPackageManager
函数如何实现的。
4.3 detectPackageManager 探测包管理器
根据当前目录锁文件,探测包管理器。
1 | js复制代码// src/detect.ts |
其中 find-up 查找路径。
1 | bash复制代码/ |
1 | js复制代码import {findUp} from 'find-up'; |
path.basename('/Users/install-pkg/pnpm-lock.yaml')
则是 pnpm-lock.yaml
。
所以在有pnpm-lock.yaml
文件的项目中,detectPackageManager
函数最终返回的是 pnpm
。
至此我们可以用一句话总结原理就是:通过锁文件自动检测使用何种包管理器(npm、yarn、pnpm),最终用 execa 执行类似如下的命令。
1 | bash复制代码pnpm install -D --prefer-offine release-it react antd |
看完源码,我们接着来解释下 package.json
中的 scripts
命令。
- package.json script 命令解析
1 | js复制代码{ |
5.1 ni 神器
我之前写过源码文章。
尤雨溪推荐神器 ni ,能替代 npm/yarn/pnpm ?简单好用!源码揭秘!
自动根据锁文件 yarn.lock / pnpm-lock.yaml / package-lock.json 检测使用 yarn / pnpm / npm 的包管理器。
1 | bash复制代码nr dev --port=3000 |
1 | bash复制代码nr |
nci - clean install
1 | bash复制代码nci |
5.2 esno 运行 ts
TypeScript / ESNext node runtime powered by esbuild
源码也不是很多。
1 | js复制代码#!/usr/bin/env node |
esbuild-register
简单说:使用 esbuild 即时传输 JSX、TypeScript 和 esnext 功能
5.3 tsup 打包 ts
打包 TypeScript
库的最简单、最快的方法。
5.4 bumpp 交互式提升版本号
交互式 CLI 可增加您的版本号等
5.5 eslint 预设
1 | js复制代码pnpm add -D eslint @antfu/eslint-config |
添加 .eslintrc
文件
1 | js复制代码// .eslintrc |
之前看其他源码发现的也很好用的 eslint 工具 xo
JavaScript/TypeScript linter (ESLint wrapper) with great defaults
JavaScript/TypeScript linter(ESLint 包装器)具有很好的默认值
看完 scripts 命令解析,我们来看看 github action 配置。
- github action workflows
对于github action 不熟悉的读者,可以看阮一峰老师 GitHub Actions 入门教程
1 | yml复制代码name: Release |
根据每次 tags 推送,执行。
1 | bash复制代码# 全局安装 pnpm 和 ni |
1 | bash复制代码# 如何存在 test 命令则执行 |
nci - clean install
1 | bash复制代码nci |
最后 npx conventional-github-releaser -p angular
conventional-github-releaser
生成 changelog
。
至此我们就学习完了 install-pkg 包。
- 总结
整体代码比较简单。原理就是通过锁文件自动检测使用何种包管理器(npm、yarn、pnpm),最终用 execa 执行类似如下的命令。
1 | bash复制代码pnpm install -D --prefer-offine release-it react antd |
我们学到了:
1 | bash复制代码1. 如何学习调试源码 |
还有各种依赖工具。
建议读者克隆 我的仓库 动手实践调试源码学习。
- 加源码共读群一起学习
最后可以持续关注我@若川。
我倾力持续组织了一年每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信 ruochuan12
参与。
另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》,目前是掘金关注人数(4.1k+人)第一的专栏,写有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余篇源码文章。
本文转载自: 掘金