create-vue源码解析(一)准备工作

摘要:

本系列主要从小白视角入手,探讨 create-vue 脚手架的实现细节,共分为五个部分,本文是该系列的第一篇------准备篇。

本文将主要讲解一个小白在学习源码前需要做的一些准备工作。

1. 获取源码 🐯

想要系统的学习源码,当然需要先有一份源码。

所以,我们需要先从官方仓库下载一份官方的源码下来。可以 clone 到本地,但我建议最好还是直接 fork 一份到自己的 github 账户。

毕竟,自己电脑上的资料总有丢失的风险,随时把学习资料同步到 github 是一个更好的选择。同时,也可以把自己的学习心得开源出来,帮助他人。最后,对于小小白,平时多多使用 git ,对以后的工作也是帮助不小。

1.1 源码地址

create-vue

github.com/vuejs/creat...

1.2 源码版本

3.6.4

1.3 目录结构

2. 用途

既然要分析,总要清楚工具的作用。

create-vue 是一款 vue 脚手架。是 vue 官方脚手架 vue/cli 的替代者。

脚手架是建筑行业用来协助搭建工程的工具,类推过来,create-vue 是用来协助vue开发人员快速搭建基于vue技术栈前端工程的工具。使用 create-vue 可以基于开发者的需要,一站式生成各类不同配置的vue工程。

3. 依赖分析👀

如果希望系统分析源码,建议先看看整个项目中用到了那些依赖,那些技术点,都是干啥的?

对于一些不了解的依赖,可以提前了解一下。也可以通过依赖大致分析出项目的解决思路。

以下是 create-vuepackage.json 文件。

json 复制代码
{
  "name": "create-vue",
  "version": "3.6.4",
  "description": "An easy way to start a Vue project",
  "type": "module",
  "bin": {
    "create-vue": "outfile.cjs"
  },
  "files": [
    "outfile.cjs",
    "template"
  ],
  "engines": {
    "node": ">=v16.20.0"
  },
  "scripts": {
    "prepare": "husky install",
    "format": "prettier --write .",
    "build": "zx ./scripts/build.mjs",
    "snapshot": "zx ./scripts/snapshot.mjs",
    "pretest": "run-s build snapshot",
    "test": "zx ./scripts/test.mjs",
    "prepublishOnly": "zx ./scripts/prepublish.mjs"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/vuejs/create-vue.git"
  },
  "keywords": [],
  "author": "Haoqun Jiang <haoqunjiang+npm@gmail.com>",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/vuejs/create-vue/issues"
  },
  "homepage": "https://github.com/vuejs/create-vue#readme",
  "devDependencies": {
    "@tsconfig/node18": "^2.0.1", 
    "@types/eslint": "^8.37.0",
    "@types/node": "^18.16.8",
    "@types/prompts": "^2.4.4",
    "@vue/create-eslint-config": "^0.2.1",
    "@vue/tsconfig": "^0.4.0",
    "esbuild": "^0.17.18",
    "esbuild-plugin-license": "^1.2.2",
    "husky": "^8.0.3",
    "kolorist": "^1.8.0",
    "lint-staged": "^13.2.2",
    "minimist": "^1.2.8",
    "npm-run-all": "^4.1.5",
    "prettier": "^2.8.8",
    "prompts": "^2.4.2",
    "zx": "^4.3.0"
  },
  "lint-staged": {
    "*.{js,ts,vue,json}": [
      "prettier --write"
    ]
  }
}

下面通过下表一句话简单介绍一下每个依赖的作用:

依赖名 功能
@tsconfig/node18 node.js18配套的tsconfig
@types/eslint eslint相关
@types/node node.js的类型定义
@vue/create-eslint-config 在Vue.js项目中设置ESLint的实用程序。
@vue/tsconfig 用于Vue项目的TS Configure扩展。
esbuild JavaScript 和 golang 打包工具,在打包时使用,后文会具体分析,建议预先了解,尤其是 esbuild.build 函数的相关 Api
esbuild-plugin-license 许可证生成插件,用于在打包时,生成 LICENSE 文件
husky git 钩子,代码提交规范工具
kolorist 给stdin/stdout的文本内容添加颜色,建议预先了解。
lint-staged 格式化代码
minimist 解析参数选项, 当用户从 terminal 中输入命令指令时,帮助解析各个参数的工具,建议预先了解。
npm-run-all 一个CLI工具,用于并行或顺序运行多个npm-script。
prettier 代码格式化
prompts 轻巧、美观、人性化的交互式提示。在 terminal 中做对话交互的。建议预先了解。
@types/prompts prompts 库的类型定义
zx 该库为开发者在JavaScript中编写shell脚本提供了一系例功能,使开发更方便快捷,主要在编写复杂的 script 命令是使用。只要在打包,快照,预发布阶段编写脚本时使用,建议预先了解。

可以看到,这16个依赖,真正和cli功能紧密相关的应该是以下几个:

  • esbuild
  • kolorist
  • minimist
  • prompts
  • zx

所以,学习 create-vue 的之前,可以先阅读以下几个库的基本使用方法,以便在阅读源码过程中,遇到有知识点盲区的,可以定向学习。

4. 项目目录结构及功能模块简介 🪜

以下是 create-vue 源码的工程目录结构:

txt 复制代码
F:\Study\Vue\Code\VueSourceCode\create-vue
├── CONTRIBUTING.md
├── index.ts // 主文件
├── LICENSE
├── media
├── package.json
├── playground
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── README.md
├── renovate.json
├── scripts
|  ├── build.mjs // esbuild 打包脚本
|  ├── prepublish.mjs // 预发布脚本
|  ├── snapshot.mjs // 生成快照脚本
|  └── test.mjs
├── template // 各类模板
|  ├── base
|  ├── code
|  ├── config
|  ├── entry
|  ├── eslint
|  └── tsconfig
├── tsconfig.json
└── utils
   ├── banners.ts // 终端中彩色提示文字输出
   ├── deepMerge.ts // 工具函数,对文件内容进行深度合并,用于 cli 执行过程中对各template 的依赖进行合并
   ├── directoryTraverse.ts // 文件夹递归操作
   ├── generateReadme.ts // 生成工程的 readme 文件
   ├── getCommand.ts // 
   ├── renderEslint.ts // 生成 eslint 配置文件
   ├── renderTemplate.ts // 生成通用模块模板
   └── sortDependencies.ts // 对 package.json 中的依赖进行分类,dependency devDependency 等

可以看到,除开一些配置文件和空文件夹后,真正用到的文件就以下几个部分:

  • husky

这个是一款git hook 工具,支持在开发人员进行 git 操作时,根据不同需求,触发一些自定义动作,通常用于团队工作中对代码提交流程进行约束和规范。

  • scripts

这个目录下主要是项目打包,快照,预发布,单元测试这几块内容的 script 脚本. 在本系列第四个部分将详解这部分内容。

  • template

这个里面是这个库的核心部分了------模板。我们 cli 在执行时,就是会从这个文件夹中读取各种配置的代码实现,最后把这些代码组合成一个完整的项目,然后给用户快速生成一个项目模板。

这个模板只要你事先预制好即可。

  • utils

项目中用到的一些工具方法,可在用到的时候再具体去分析。

  • index.ts

项目的入口文件,也是核心文件,包含了cli 执行的所有逻辑,是create-vue脚手架的核心实现。

以上就是项目中一些具体模块的大致功能了,最最核心的还是 index.ts 文件。

原文地址 + 详细注释版源码地址

create-vue-code-analysis

😊 如果觉得还可以的话,可以给个🌟吗,嘿嘿嘿!

相关推荐
好名字082117 分钟前
前端取Content-Disposition中的filename字段与解码(vue)
前端·javascript·vue.js·前端框架
隐形喷火龙29 分钟前
element ui--下拉根据拼音首字母过滤
前端·vue.js·ui
m0_7482411242 分钟前
Selenium之Web元素定位
前端·selenium·测试工具
风无雨1 小时前
react杂乱笔记(一)
前端·笔记·react.js
鑫~阳1 小时前
快速建站(网站如何在自己的电脑里跑起来) 详细步骤 一
前端·内容管理系统cms
egekm_sefg1 小时前
webrtc学习----前端推流拉流,局域网socket版,一对多
前端·学习·webrtc
m0_748234341 小时前
前端工作中问题点拆分
前端
艾斯特_1 小时前
JavaScript甘特图 dhtmlx-gantt
前端·javascript·甘特图
北海天空1 小时前
reactHooks到底钩到了什么?
前端·react.js
飞翔的渴望1 小时前
react18与react17有哪些区别
前端·javascript·react.js