菜单

包架构

相关源文件

本文档解释了 Vue.js 核心仓库的 monorepo 结构和包架构。它涵盖了包的组织方式、依赖关系、构建配置和分发格式。有关构建系统实现的详细信息,请参阅 构建系统

Monorepo 结构

Vue.js 核心仓库被组织为一个 monorepo,包含多个具有特定职责的包。这种架构可以更好地分离关注点,支持现代打包工具的 tree-shaking,并为不同的使用场景提供灵活性。

包层级结构

来源

软件包职责

Vue.js monorepo 中的每个包都有特定的重点和职责

描述主要职责
vue主入口包导出所有公共 API;提供编译器集成
@vue/runtime-domDOM 相关运行时DOM 元素操作、事件处理、指令
@vue/runtime-core平台无关运行时虚拟 DOM、组件系统、生命周期钩子
@vue/reactivity响应式系统响应式对象、ref、computed、watchers
@vue/compiler-domDOM 相关编译器DOM 相关解析和代码生成
@vue/compiler-core核心编译器模板解析、AST 生成、转换
@vue/compiler-sfcSFC 编译器.vue 文件解析和处理
@vue/compiler-ssrSSR 编译器服务器端渲染优化
@vue/server-rendererSSR 运行时服务器渲染、hydration
@vue/shared通用工具共享辅助函数和常量

来源

构建格式和分发

Vue.js 包构建为多种格式,以支持不同的环境和使用场景。

构建格式概述

来源

构建格式详情

格式文件模式目的使用场景
ESM 打包器*.esm-bundler.js适用于现代打包工具Webpack、Rollup、Vite 项目
ESM 浏览器*.esm-browser.js直接浏览器使用<script type="module">
CommonJS*.cjs.jsNode.js 和旧打包器服务器端,Jest 测试
全局/IIFE*.global.js直接浏览器使用不使用打包器的 `<script>`
仅运行时*.runtime.*不带编译器的更小构建预编译模板
生产*.prod.js压缩和优化生产部署

每个包在其 `package.json` 的 `buildOptions.formats` 属性下定义了它支持的格式。

来源

包入口点和导出

Vue.js 包精心定义了其导出,以支持各种模块系统和环境。

入口点结构

来源

条件导出

Vue.js 使用 Node.js 条件导出为每种环境提供正确的文件

此配置确保

  1. ESM 导入接收 ESM 构建
  2. CommonJS 引入接收 CJS 构建
  3. Node.js 接收 Node 优化构建
  4. TypeScript 接收正确的类型声明
  5. 生产环境接收优化后的生产构建

来源

编译常量和特性标志

Vue.js 使用编译时常量和特性标志来有条件地包含功能和优化构建。

编译常量系统

来源

特性标志实现

在打包器构建中,特性标志将被替换为运行时变量

这允许最终用户通过构建配置来控制这些功能,而预构建的包默认包含所有功能。

来源

开发和生产构建

Vue.js 为开发和生产环境提供了特定的优化。

开发模式功能

在开发模式下(__DEV__ === true

  1. 包含详细的警告消息
  2. 运行时验证器检查常见错误
  3. 保留组件命名信息
  4. 初始化浏览器开发者工具的自定义格式化程序

开发模式独有代码示例

来源

生产版本

生产构建(*.prod.js

  1. 移除所有开发模式独有的代码
  2. 使用 SWC 最小化和压缩代码
  3. 应用纯注解优化以消除死代码

这使得生产部署的包体积显著减小。

来源

结论

Vue.js 的包架构经过精心设计,可在不同环境中提供最佳的开发人员和用户体验。具有清晰包职责的 monorepo 结构实现了可维护的代码组织,而复杂的构建系统则为各种使用场景创建了优化的包。

此架构的主要优势包括

  1. Tree-shakability - 未使用的代码可以被打包器消除
  2. 大小优化 - 预编译模板的仅运行时构建
  3. 环境定位 - 针对浏览器、Node.js 等的特定构建
  4. 开发体验 - 开发中的有用警告和调试
  5. 性能 - 针对最终用户的优化生产构建