Vue3源码架构简析及Monorepo流程构建

源码地址:github.com/vuejs/core

Vue3架构分析

Vue3采用Monorepo方式管理代码,其核心为packages文件夹

packages内存放着功能独立的各种依赖

Vue3项目结构

  • reactivity: 响应式系统
  • runtime-core: 与平台无关的运行时核心 (可以创建针对特定平台的运行时 - 自定义渲染器)
  • runtime-dom : 针对浏览器的运行时。包括DOM API,属性,事件处理等
  • runtime-test: 用于测试
  • server-renderer: 用于服务器端渲染
  • compiler-core: 与平台无关的编译器核心
  • compiler-dom: 针对浏览器的编译模块
  • compiler-ssr: 针对服务端渲染的编译模块
  • compiler-sfc: 针对单文件解析
  • size-check: 用来测试代码体积
  • template-explorer:用于调试编译器输出的开发工具
  • shared: 多个包之间共享的内容
  • vue: 完整版本,包括运行时和编译器

Monorepo介绍

Monorepo 是管理项目代码的一个方式,指在一个项目仓库(repo)中管理多个模块/包(package)

  • 一个仓库可维护多个模块,不用到处找仓库
  • 方便版本管理和依赖管理,模块之间的引用,调用都非常方便

缺点:仓库体积会变大。

构建Monorepo项目环境

Monorepo(单一代码库)模式越来越受到欢迎,尤其是在大型项目中。使用 Monorepo,可以在一个仓库中管理多个项目或包,从而简化依赖管理和代码共享。结合 Vue 3,这种模式可以极大地提高开发效率和代码复用性。

为什么选择 Monorepo

  • 依赖管理:在一个仓库中管理所有依赖,避免版本冲突和重复安装。
  • 代码共享:轻松共享和复用代码,减少重复开发。
  • 一致性:统一的代码风格、配置和工具链,确保项目的一致性。
  • 协作:简化团队协作,所有代码变更集中在一个地方。

目录构建及workspace配置

仿照Vue3,建立依赖管理packages文件夹、先进行reactivity和shared两个模块的开发,然后初始化仓库。

js 复制代码
// workspaces在npm7以上才可以使用,因此,我们使用yarn来构建项目
yarn init -y
js 复制代码
vue3-study
│  package.json        
├─packages             # 多个repo
│  └─reactivity
│      │  package.json
│      └─src
│          index.ts
│  └─shared
│      │  package.json
│      └─src
│          index.ts                 

在根目录中的package.json中进行workspaces改造

js 复制代码
{
   "name": "vue3",
   "version": "1.0.0",
   "main": "index.js",
   "license": "MIT",
  +"private":true,
  +"workspaces":[
     "packages/*"
   ],
}

然后,更改子包的名称。

js 复制代码
// reactivity/package.json
{
  "name": "@vue/reactivity",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

// shared/package.json
{
  "name": "@vue/shared",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

现在,当我们安装依赖时,shared和reactivity就会以快捷方式的形式被放在node_modules里供我们全局引入使用。(我们子包名是@vue开头,所以都会被放在这个文件夹下)

复制代码
yarn install

依赖安装

我们使用typescript开发项目、rollup进行打包,因此,需要在根目录下的package.json安装相关依赖

js 复制代码
yarn add  typescript rollup rollup-plugin-typescript2 @rollup/plugin-node-resolve @rollup/plugin-json execa -D -W

workspace模式下,安装依赖,需要额外添加-W参数

相关依赖说明:

依赖 ****
typescript 支持typescript
rollup 打包工具
rollup-plugin-typescript2 使项目支持使用TS来进行开发,插件执行时会默认读取tsconfig.json配置。
@rollup/plugin-node-resolve 解析node第三方模块
@rollup/plugin-json 可以将.json文件转为es6模块供rollup处理。
execa execa是可以调用shell和本地外部程序的javascript封装

创建tsconfig.json配置文件

js 复制代码
npx tsc --init  // 注意在根目录下执行命令

workspace配置

js 复制代码
npm init -y && npx tsc --init
js 复制代码
{
  "private":true,
  "workspaces":[
    "packages/*"
  ]
}

目录结构配置

js 复制代码
C:.
│  package.json        # 配置运行命令 
│  rollup.config.js    # rollup配置文件
│  tsconfig.json       # ts配置文件 更改为esnext
│  yarn.lock
│  
├─packages             # N个repo
│  └─reactivity
│      │  package.json
│      └─src
│          index.ts
│              
└─scripts              # 打包命令
        build.js

配置模块名称及打包选项

js 复制代码
{
  "name": "@vue/reactivity",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "module": "dist/reactivity.esm-bundler.js",
  "author": "",
  "license": "ISC",
  "buildOptions":{
    "name":"VueReactivity",
    "formats":[
      "esm-bundler",
      "cjs",
      "global"
    ]
  }
}
相关推荐
paopaokaka_luck25 分钟前
基于SpringBoot+Vue的酒类仓储管理系统
数据库·vue.js·spring boot·后端·小程序
雲墨款哥1 小时前
Vue3.0 项目初始化及 Element Plus 配置实战
前端·vue.js
前端小饭桌1 小时前
关于 Vue 3 的 ref,这些细节你了解了多少?
前端·vue.js
光影少年2 小时前
vue3.0性能提升主要通过那几方面体现的?
前端·vue.js
江城开朗的豌豆2 小时前
路由守卫:你的Vue路由‘保安’,全局把关还是局部盯梢?
前端·javascript·vue.js
Jinxiansen02112 小时前
Vue 3 响应式核心源码详解(基于 @vue/reactivity)
前端·javascript·vue.js
清幽竹客9 小时前
vue-30(理解 Nuxt.js 目录结构)
前端·javascript·vue.js
知性的小mahua9 小时前
echarts+vue实现中国地图板块渲染+省市区跳转渲染
vue.js
weiweiweb8889 小时前
cesium加载Draco几何压缩数据
前端·javascript·vue.js
满楼、9 天前
el-cascader 设置可以手动输入也可以下拉选择
javascript·vue.js·elementui