「我正在参与掘金会员专属活动-源码共读第一期,点击参与」
这篇文章主要讲的是
create-vite
做了哪些工作?
首先,我们将Vite.js克隆到本地;
git clone https://github.com/vitejs/vite.git
cd vite
code . // vscode打开项目
我们一般通过以下几个命令来初始化Vite.js项目:
npm create vite
yarn create vite
如果需要指定项目名称和模板,则加上对应的参数:
# npm 6.x
npm create vite@latest my-vue-app --template vue
# npm 7+, extra double-dash is needed:
npm create vite@latest my-vue-app -- --template vue
# yarn
yarn create vite my-vue-app --template vue
# pnpm
pnpm create vite my-vue-app --template vue
这里我们就有疑问了?为什么之前用npm init
变成了npm create
,查看了npm官方文档之后就明白了,
create
命令是init
的别名, 这就不难理解了。以下两个命令等效。
npm init create-vite
npm create vite
这样一看,我们就很容易找到
Vite.js
的入口了,在package/create-vite/index.ts
这个文件里。
找到入口之后,我们就可以开始看看Vite.js
如何初始化项目的。
主线任务从第187行init
函数开始,接着是几个问答,
项目名称,选择一个框架,选择一个变体,问题的结果收集在第200行的
result
变量里,288行如果覆盖清空项目文件夹,否则就创建文件。
通过对result
的分析得到fullCustomCommand
变量,接着会执行command
,脚本执行完毕之后,会走到349行的write
函数开始创建项目的文件,一直到347行整个流程结束。这就是init
函数做的事情,其他声明的方法都是来辅助init
整个流程的。
明白主线任务之后,我们再来看分支,具体做了什么事情。因为是ts
写的,关于type
类型声明就不需要看了;
- 21行
argv
: 收集命令行npm create vite
参数的值; - 27行
FRAMEWORKS
: 约定了框架的属性,包括名字,颜色,显示,变体 - 177行
TEMPLATE
:框架数组,181行renameFiles
:gitignore
相关,185行的defaultTargetDir
:默认文件夹名称;
init()里的变量:
argTargetDir
和argTemplate
:命令行参数里的项目名称和模板targetDir
:argTargetDir
和defaultTargetDir
二选一;result
projectName
: 项目名称overwrite
: 目录存在相同的是否覆盖。overwriteChecker
: 取消覆盖packageName
: 确定package.json
文件的name
属性framework
: 选择框架variant
: 选择变体JavaScript
或者TypeScript
template
: 决定模板名称pkgInfo
:npm_config_user_agent
得到用户配置信息pkgManager
: 包管理工具isYarn1
: 是否是yarn
customCommand
: 通过template
得到对应的脚本templateDir
:得到模板文件夹,向文件夹写入文件
结束语
整个Vite.js
初始化的工作就是这样了