vue3源码目录

128 阅读3分钟

VSCode目录文件

image.png

packages 结构说明

packages:源码主目录,里面存放的是Vue的核心源码

compiler-* 编译器相关
reactivity-* 响应式相关
runtime-* 运行时相关
说明: 
compile 可以理解为程序编译时,源代码在被编译成为目标文件的时间,或者源代码文件在被转换成为最终可执行的文件时间,即将.vue文件编译成浏览器能识别的.html文件的一些工作
runtime 可以理解为程序运行时,即是程序被编译之后,打开程序并运行它知道程序关闭的时间
reactivity 响应式模块的源码,由于Vue 3整体源码采用的Monorepo规范,所以其下面每个子模块都可以独立编译和打包,从而独立对外提供服务,在使用时采用require(‘@vue/reactivity’)引入,进入reactivity目录下可以看到有对应的package.json文件。



├── compiler-core:编译核心源码
├── compiler-dom:与dom部分编译相关联的源码
├── compiler-sfc:单文件编译部分的源码
├── compiler-ssr:服务端渲染,编译相关的源码
├── reactivityVue核心代理Proxy相关的代码,响应式部分
├── runtime-core:运行时相关的核心源码,包含生命周期、vnodewatch等等api
├── runtime-dom:运行时与dom相关的核心源码,包含createApp等的源码
├── runtime-testvue内部测试所使用的代码
├── server-renderer:服务端渲染代码
├── sfc-playgroundVue3 单文件组件 playground
├── sharedVue工具库,通用方法
├── size-checkvue内部最简单的一个vue应用,用来测试tree-shaking后的代码体积大小
├── template-explorerVue内部使用的编译文件浏览工具
├── vueVue的主入口文件
└── vue-compat 可配置的vue2的兼容行为

模块关系图

                     +---------------------+    +----------------------+
                      |                     |    |                      |
        +------------>|  @vue/compiler-dom  +--->|  @vue/compiler-core  |
        |             |                     |    |                      |
   +----+----+        +---------------------+    +----------------------+
   |         |
   |   vue   |
   |         |
   +----+----+        +---------------------+    +----------------------+    +-------------------+
        |             |                     |    |                      |    |                   |
        +------------>|  @vue/runtime-dom   +--->|  @vue/runtime-core   +--->|  @vue/reactivity  |
                      |                     |    |                      |    |                   |
                      +---------------------+    +----------------------+    +-------------------+

配置文件内容说明

package.json

{
  "private": true,
  "version": "3.2.45",
  "packageManager": "pnpm@7.1.0",
  "scripts": {
    "dev": "node scripts/dev.js",
    "build": "node scripts/build.js",
    ...
  },
  "types": "test-dts/index.d.ts",
  // `simple-git-hooks` 一个用于小型开源项目的简单的预提交钩子,简单的预先提交该工具可让您将package.json中的任何命令设置为预提交挂钩
  "simple-git-hooks": {
    "pre-commit": "pnpm lint-staged",
    "commit-msg": "node scripts/verifyCommit.mjs"
  },
  // `lint-staged`是一个只对将要通过git提交的文件(staged),执行自定义脚本的工具 对将要提交的内容进行lint校验
  "lint-staged": {
    "*.{js,json}": [
      "prettier --write"
    ],
    "*.ts?(x)": [
      "eslint",
      "prettier --parser=typescript --write"
    ]
  },
  "engines": {
    "node": ">=16.11.0"
  },
  "devDependencies": {
  }
}

rollup.config.js

scripts/build.js文件中都有这么一个函数

await execa(
    'rollup',
    [
      '-c',
      '--environment',
      [
        `COMMIT:${commit}`,
        `NODE_ENV:${env}`,
        `TARGET:${target}`,
        formats ? `FORMATS:${formats}` : ``,
        buildTypes ? `TYPES:true` : ``,
        prodOnly ? `PROD_ONLY:true` : ``,
        sourceMap ? `SOURCE_MAP:true` : ``
      ]
        .filter(Boolean)
        .join(',')
    ],
    { stdio: 'inherit' }
  )

关键就在 '-c' 这个参数上:作用是rollup打包指定使用配置文件 rollup.config.js rollup 配置文件既可以是一个 ES 模块,也可以是一个 CommonJS 模块,这里使用的是后者。并且支持导出单个配置对象,或配置对象数组,这里导出的一个配置对象数组 packageConfigs ,这样做是为了一次打包多个模块或 package 。 rollup 配置文件参考 rollup 命令行接口-配置文件