- 前言
大家好,我是若川。为了能帮助到更多对源码感兴趣、想学会看源码、提升自己前端技术能力的同学。我倾力组织了每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信
ruochuan02
参与。
之前写的《学习源码整体架构系列》 包含jQuery
、underscore
、lodash
、vuex
、sentry
、axios
、redux
、koa
、vue-devtools
、vuex4
十篇源码文章。
写相对很难的源码,耗费了自己的时间和精力,也没收获多少阅读点赞,其实是一件挺受打击的事情。从阅读量和读者受益方面来看,不能促进作者持续输出文章。
所以转变思路,写一些相对通俗易懂的文章。其实源码也不是想象的那么难,至少有很多看得懂。
最近尤雨溪发布了3.2版本。小版本已经是3.2.4
了。本文来学习下尤大是怎么发布vuejs
的,学习源码为自己所用。
本文涉及到的 vue-next/scripts/release.js
文件,整个文件代码行数虽然只有 200
余行,但非常值得我们学习。
歌德曾说:读一本好书,就是在和高尚的人谈话。 同理可得:读源码,也算是和作者的一种学习交流的方式。
阅读本文,你将学到:
1 | bash复制代码1. 熟悉 vuejs 发布流程 |
环境准备之前,我们先预览下vuejs
的发布流程。
- 环境准备
打开 vue-next,
开源项目一般都能在 README.md
或者 .github/contributing.md 找到贡献指南。
而贡献指南写了很多关于参与项目开发的信息。比如怎么跑起来,项目目录结构是怎样的。怎么投入开发,需要哪些知识储备等。
你需要确保 Node.js 版本是 10+
, 而且 yarn
的版本是 1.x
Yarn 1.x。
你安装的 Node.js
版本很可能是低于 10
。最简单的办法就是去官网重新安装。也可以使用 nvm
等管理Node.js
版本。
1 | bash复制代码node -v |
2.1 严格校验使用 yarn 安装依赖
接着我们来看下 vue-next/package.json
文件。
1 | json复制代码// vue-next/package.json |
如果你尝试使用 npm
安装依赖,应该是会报错的。为啥会报错呢。
因为 package.json
有个前置 preinstall
node ./scripts/checkYarn.js
判断强制要求是使用yarn
安装。
scripts/checkYarn.js
文件如下,也就是在process.env
环境变量中找执行路径npm_execpath
,如果不是yarn
就输出警告,且进程结束。
1 | js复制代码// scripts/checkYarn.js |
如果你想忽略这个前置的钩子判断,可以使用yarn --ignore-scripts
命令。也有后置的钩子post
。更多详细的可以查看 npm 文档
2.2 调试 vue-next/scripts/release.js 文件
接着我们来学习如何调试 vue-next/scripts/release.js
文件。
这里声明下我的 VSCode
版本 是 1.59.0
应该 1.50.0
起就可以按以下步骤调试了。
1 | bash复制代码code -v |
找到 vue-next/package.json
文件打开,然后在 scripts
上方,会有debug
(调试)按钮,点击后,选择 release
。即可进入调试模式。
这时终端会如下图所示,有 Debugger attached.
输出。这时放张图。
学会调试后,先大致走一遍流程,在关键地方多打上几个断点多走几遍,就能猜测到源码意图了。
3 文件开头的一些依赖引入和函数声明
我们可以跟着断点来,先看文件开头的一些依赖引入和函数声明
3.1 第一部分
1 | js复制代码// vue-next/scripts/release.js |
通过依赖,我们可以在 node_modules
找到对应安装的依赖。也可以找到其README
和github
仓库。
3.1.1 minimist 命令行参数解析
简单说,这个库,就是解析命令行参数的。看例子,我们比较容易看懂传参和解析结果。
1 | bash复制代码$ node example/parse.js -a beep -b boop |
1 | js复制代码const args = require('minimist')(process.argv.slice(2)) |
其中process.argv
的第一和第二个元素是Node
可执行文件和被执行JavaScript文件的完全限定的文件系统路径,无论你是否这样输入他们。
3.1.2 chalk 终端多色彩输出
简单说,这个是用于终端显示多色彩输出。
3.1.3 semver 语义化版本
语义化版本的nodejs实现,用于版本校验比较等。关于语义化版本可以看这个语义化版本 2.0.0 文档
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:
主版本号:当你做了不兼容的 API 修改,
次版本号:当你做了向下兼容的功能性新增,
修订号:当你做了向下兼容的问题修正。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
3.1.4 enquirer 交互式询问 CLI
简单说就是交互式询问用户输入。
3.1.5 execa 执行命令
简单说就是执行命令的,类似我们自己在终端输入命令,比如 echo 若川
。
1 | js复制代码// 例子 |
看完了第一部分,接着我们来看第二部分。
3.2 第二部分
1 | js复制代码// vue-next/scripts/release.js |
第二部分相对简单,继续看第三部分。
3.3 第三部分
1 | js复制代码// vue-next/scripts/release.js |
这一块可能不是很好理解。inc
是生成一个版本。更多可以查看semver文档
1 | js复制代码semver.inc('3.2.4', 'prerelease', 'beta') |
3.4 第四部分
第四部分声明了一些执行脚本函数等
1 | js复制代码// vue-next/scripts/release.js |
3.4.1 bin 函数
获取 node_modules/.bin/
目录下的命令,整个文件就用了一次。
1 | js复制代码bin('jest') |
相当于在命令终端,项目根目录 运行 ./node_modules/.bin/jest
命令。
3.4.2 run、dryRun、runIfNotDry
1 | js复制代码const run = (bin, args, opts = {}) => |
run
真实在终端跑命令,比如 yarn build --release
dryRun
则是不跑,只是 console.log();
打印 ‘yarn build –release’
runIfNotDry
如果不是空跑就执行命令。isDryRun 参数是通过控制台输入的。yarn run release --dry
这样就是true
。runIfNotDry
就是只是打印,不执行命令。这样设计的好处在于,可以有时不想直接提交,要先看看执行命令的结果。不得不说,尤大就是会玩。
在 main
函数末尾,也可以看到类似的提示。可以用git diff
先看看文件修改。
1 | js复制代码if (isDryRun) { |
看完了文件开头的一些依赖引入和函数声明等,我们接着来看main
主入口函数。
4 main 主流程
第4节,主要都是main
函数拆解分析。
4.1 流程梳理 main 函数
1 | js复制代码const chalk = require('chalk') |
上面的main
函数省略了很多具体函数实现。接下来我们拆解 main
函数。
4.2 确认要发布的版本
第一段代码虽然比较长,但是还好理解。
主要就是确认要发布的版本。
调试时,我们看下这段的两张截图,就好理解啦。
1 | js复制代码// 根据上文 mini 这句代码意思是 yarn run release 3.2.4 |
4.3 执行测试用例
1 | js复制代码// run tests before release |
4.4 更新所有包的版本号和内部 vue 相关依赖版本号
这一部分,就是更新根目录下package.json
的版本号和所有 packages
的版本号。
1 | js复制代码// update all package versions and inter-dependencies |
1 | js复制代码function updateVersions(version) { |
4.4.1 updatePackage 更新包的版本号
1 | js复制代码function updatePackage(pkgRoot, version) { |
主要就是三种修改。
1 | bash复制代码1. 自己本身 package.json 的版本号 |
一图胜千言。我们执行yarn release --dry
后 git diff
查看的 git
修改,部分截图如下。
4.4.2 updateDeps 更新内部 vue 相关依赖的版本号
1 | js复制代码function updateDeps(pkg, depType, version) { |
一图胜千言。我们在终端执行yarn release --dry
。会看到这样是输出。
也就是这句代码输出的。
1 | js复制代码console.log( |
4.5 打包编译所有包
1 | js复制代码// build all packages with types |
4.6 生成 changelog
1 | js复制代码// generate changelog |
yarn changelog
对应的脚本是conventional-changelog -p angular -i CHANGELOG.md -s
。
4.7 提交代码
经过更新版本号后,有文件改动,于是git diff
。
是否有文件改动,如果有提交。
git add -A
git commit -m 'release: v${targetVersion}'
1 | js复制代码const { stdout } = await run('git', ['diff'], { stdio: 'pipe' }) |
4.8 发布包
1 | js复制代码// publish packages |
这段函数比较长,可以不用细看,简单说就是 yarn publish
发布包。
我们 yarn release --dry
后,这块函数在终端输出的如下:
值得一提的是,如果是 vue
默认有个 tag
为 next
。当 Vue 3.x
是默认时删除。
1 | js复制代码} else if (pkgName === 'vue') { |
也就是为什么我们现在安装 vue3
还是 npm i vue@next
命令。
1 | js复制代码async function publishPackage(pkgName, version, runIfNotDry) { |
4.9 推送到 github
1 | js复制代码// push to GitHub |
1 | js复制代码// yarn run release --dry |
我们 yarn release --dry
后,这块函数在终端输出的如下:
到这里我们就拆解分析完 main
函数了。
整个流程很清晰。
1 | bash复制代码1. 确认要发布的版本 |
用一张图总结则是:
看完vue-next/scripts/release.js
,感兴趣还可以看vue-next/scripts
文件夹下其他代码,相对行数不多,但收益较大。
- 总结
通过本文学习,我们学会了这些。
1 | bash复制代码1. 熟悉 vuejs 发布流程 |
同时建议自己动手用 VSCode
多调试,在终端多执行几次,多理解消化。
vuejs
发布的文件很多代码我们可以直接复制粘贴修改,优化我们自己发布的流程。比如写小程序,相对可能发布频繁,完全可以使用这套代码,配合miniprogram-ci,再加上一些自定义,加以优化。
关于小程序 ci
上传,再分享两篇文章。
小打卡小程序自动化构建及发布的工程化实践 虽然文章里不是最新的 miniprogram-ci
,但这篇场景写得比较全面。
当然版本发布也可以用开源的 release-it。
同时,我们可以:
引入 git flow,管理git
分支。估计很多人不知道windows
git bash
已经默认支持 git flow
命令。
引入 husky 和 lint-staged 提交commit
时用ESLint
等校验代码提交是否能够通过检测。
引入 单元测试 jest,测试关键的工具函数等。
引入 git-cz 交互式git commit
。
等等规范自己项目的流程。如果一个候选人,通过看vuejs
发布的源码,积极主动优化自己项目。我觉得面试官会认为这个候选人比较加分。
看开源项目源码的好处在于:一方面可以拓展视野,另外一方面可以为自己所用,收益相对较高。
关于
最后可以持续关注我@若川。我倾力持续组织了一年每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信 ruochuan02
参与。
另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》,目前是掘金关注人数(4.8k+人)第一的专栏,写有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余篇源码文章。
作者:常以若川为名混迹于江湖。前端路上 | PPT爱好者 | 所知甚少,唯善学。
公众号若川视野,致力于帮助5年内前端成长
segmentfault
若川视野专栏,开通了若川视野专栏,欢迎关注~
掘金专栏,欢迎关注~
知乎若川视野专栏,开通了若川视野专栏,欢迎关注~
github blog,求个star
^_^~
本文转载自: 掘金