项目结构与文件组织
VTJ 采用了复杂而精细的 Monorepo 架构,旨在支持多种平台和应用类型,同时保持清晰的关注点分离。该项目利用 pnpm 实现高效的包管理,利用 Lerna 进行版本控制和发布,并利用 Nx 进行构建编排和智能依赖管理。
Monorepo 架构概览
该仓库组织为一个基于工作区的 Monorepo,包含三个主要层级:核心包、平台实现和应用示例。这种架构使得各个组件能够独立开发和发布,同时维护共享的依赖和构建流程。
根目录配置文件
根目录包含协调整个 Monorepo 的核心配置文件。pnpm-workspace.yaml 定义了工作区结构,包括所有包、平台、应用和工具目录。Lerna 使用语义化发布规范和约定式提交管理每个包的独立版本控制。Nx 提供具有依赖感知任务调度的构建编排,确保根据包之间的相互依赖关系以正确的顺序构建包。
构建依赖链 :Nx 的目标默认值配置了构建输出和依赖跟踪。构建任务依赖于上游构建(^build),确保当你构建 designer 包时,它的所有依赖项(core、renderer、utils 等)都会先被构建。这可以防止因缺少传递依赖而导致的构建失败。
该 Monorepo 通过 Lerna 使用独立版本控制,这意味着每个包可以单独进行版本控制。这允许细粒度的发布管理,仅发布已更改的包,而无需强制整个生态系统进行更新。
Packages 目录
packages/ 目录包含 13 个可复用的库,它们构成了 VTJ 低代码引擎的核心。这些包单独发布到 npm,既可以独立使用,也可以作为一个完整的系统使用。
核心基础层
| Package | Version | Purpose | Dependencies |
|---|---|---|---|
| @vtj/base | 0.12.4 | 最底层的工具函数(加密、日期、加密、事件总线) | None |
| @vtj/utils | 0.16.1 | 辅助函数(HTTP 请求、cookies、JSONP、脚本加载) | @vtj/base |
| @vtj/core | 0.16.1 | 低代码引擎核心(DSL 模型、生命周期、状态管理) | @vtj/base |
引擎和运行时层
| Package | Purpose | Key Dependencies |
|---|---|---|
| @vtj/renderer | 用于在浏览器中执行 DSL 的运行时渲染器 | @vtj/core, @vtj/utils, vue, vue-router |
| @vtj/designer | 可视化设计器界面(拖拽、属性编辑器、预览) | @vtj/core, @vtj/renderer, @vtj/icons, @vtj/ui, @vtj/uni, @vtj/utils |
| @vtj/coder | 用于将 DSL 转换为 Vue 源代码的代码生成器 | @vtj/base |
| @vtj/parser | Vue 源代码到 DSL 转换器(SFC 解析、AST 转换) | @vtj/base |
物料和 UI 层
| Package | Purpose | Supported Libraries |
|---|---|---|
| @vtj/materials | 完整的物料库,包含 Element Plus、Ant Design Vue、Vant、Uni-App 和图表组件 | element-plus, ant-design-vue, vant, @dcloudio/uni-ui, echarts |
| @vtj/ui | VTJ 专用的 UI 组件 | @vtj/utils |
| @vtj/icons | 图标库 | None |
| @vtj/charts | 图表组件封装 | echarts |
| @vtj/uni | Uni-App 专用组件和工具 | @dcloudio/uni-app |
服务端和工具层
| Package | Purpose |
|---|---|
| @vtj/local | 本地存储和数据管理 |
| @vtj/node | 用于服务端操作的 Node.js 工具 |
| @vtj/cli | 开发工具和构建自动化 |
Platforms 目录
platforms/ 目录包含特定平台的实现,将核心包集成到可用于不同部署目标的应用程序中。
平台实现
| Platform | Description | Build Output |
|---|---|---|
| @vtj/pro | 包含设计器和运行时的全功能 Web 平台 | 多环境构建(dev/sit/uat/prod) |
| @vtj/pro-uni | 用于跨平台移动端的 pro 平台 Uni-App 版本 | H5 和原生构建 |
| @vtj/h5 | 针对 H5 移动端优化的平台 | 移动端优化构建 |
| @vtj/uni-app | 基础 Uni-App 集成层 | 特定平台构建 |
| @vtj/web | Web 集成基础 | Web 构建 |
平台架构:pro 平台作为主要的集成点,将所有核心包组合成一个完整的低代码开发环境。它包括针对不同部署阶段(本地、dev、sit、uat、live)的环境配置,并通过单独的构建命令支持 web 和 uni-app 构建。
平台使用 workspace protocol (
workspace:~)来管理依赖,这在开发期间直接在 Monorepo 内部链接包。这使得跨包边界的即时热重载成为可能,而无需 npm link 或重复安装。
Apps 目录
apps/ 目录提供了展示不同使用模式和集成方法的应用程序示例。这些应用程序既作为演示,也作为新项目的起始模板。
应用模板
| Application | Type | Use Case |
|---|---|---|
| app | Web 应用程序 | 标准 Web 应用程序模板 |
| h5 | H5 移动应用 | 针对移动端优化的 H5 应用程序 |
| uniapp | Uni-App 应用程序 | 跨平台移动应用(H5/小程序) |
| plugin | 区块插件 | 自定义区块/插件的开发项目 |
| material | 物料开发 | 自定义物料的开发环境 |
| extension | 设计器扩展 | 设计器扩展的开发项目 |
| library | 组件库 | 独立的组件库项目 |
每个应用都遵循一致的结构,包含 TypeScript 配置、Vite 构建设置和特定环境的配置。这些应用展示了如何以不同级别的定制将 VTJ 集成到不同的项目类型中。
Create-VTJ CLI 工具
create-vtj/ 目录包含项目脚手架 CLI,用于从模板生成新项目。该工具提供了创建基于 VTJ 的新应用程序的交互式体验,只需极少的配置。
CLI 架构
CLI 采用模块化结构构建:
- index.ts:解析 CLI 参数并编排项目创建的入口点
- options.ts:模板定义和用户交互逻辑
- generator.ts:项目生成引擎
- utils.ts:用于文件操作和验证的辅助函数
可用模板
CLI 支持 7 种项目模板,每种都针对特定的开发场景量身定制:
模板存储在
create-vtj/templates/目录中,并带有前缀下划线(如_gitignore),以防止在复制期间发生冲突。CLI 解析相对于包位置的模板路径,确保在发布到 npm 时能正常工作。
开发环境
dev/ 目录提供了一个全面的开发演练场,展示了 VTJ 的所有功能。该环境包括核心功能、设计器扩展、UI 组件和集成模式的示例。
Dev 结构
| Directory | Purpose |
|---|---|
| views/ | 按功能组织的示例页面(设计器、渲染器、核心、物料等) |
| components/ | 共享 UI 组件(菜单、侧边栏) |
| api/ | 用于数据模拟的 Mock API 层 |
| extension/ | 扩展示例 |
| mock/ | 开发用的 Mock 数据 |
| router/ | Vue Router 配置 |
开发环境支持 web 和 uni-app 构建,并具有特定环境的配置。它包含涵盖 VTJ 使用所有方面的综合示例,从基本渲染到高级设计器定制。
文档结构
docs/ 目录包含 VitePress 文档站点,其中包含全面的指南、API 参考和示例。文档分为多个部分,服务于不同的受众。
文档组织
| Section | Target Audience | Content |
|---|---|---|
| guide/ | 入门指南 | 安装、设置、基本用法 |
| wiki/ | 深入探讨 | 架构、内部原理、高级主题 |
| ui/ | 组件参考 | UI 组件文档 |
| utils/ | 工具参考 | 辅助函数文档 |
| examples/ | 代码示例 | 可运行的代码示例 |
| news/ | 发布说明 | 版本历史和公告 |
文档包括通过 Typedoc 生成的 API 文档、集成示例以及展示关键概念和功能的可视化资源。
构建和开发工作流
该项目使用复杂的构建系统,为不同场景提供多个命令。根目录 package.json 为所有包的常见操作提供了快捷方式。
包构建命令
每个包都包含遵循此模式的标准化构建命令:
json
{
"build": "vue-tsc && vite build",
"test": "vitest run",
"vitest": "vitest",
"coverage": "vitest run --coverage"
}
构建过程生成 CommonJS 和 ES Module 输出以及 TypeScript 类型定义,确保与不同模块系统的兼容性。
根级别编排
根 package.json 为构建和测试多个包提供了便捷的快捷方式:
- 单个包构建 :
npm run core:build、npm run designer:build等。 - 批量操作 :
npm run build(构建所有包)、npm run test(测试所有包) - 特定平台 :
npm run pro:dev、npm run pro-uni:dev - 特定应用 :
npm run app:dev、npm run h5:build
所有包都使用 tsconfig.json 和 tsconfig.node.json 进行统一的 TypeScript 配置。根 tsconfig.json 提供基础设置,每个包都继承这些设置,确保在整个 Monorepo 中进行一致的类型检查。
包依赖关系图
理解依赖关系对于有效的开发和故障排除至关重要。
(此处原本有一个SVG图,但内容为空,故略过)
文件命名和组织约定
项目在所有包中遵循一致的组织约定:
- 源代码 :带有 TypeScript 文件的
src/目录 - 测试 :带有 Vitest 测试文件的
tests/目录 - 配置 :包根目录下的
tsconfig.json、vite.config.ts、vitest.config.ts - 构建输出 :
dist/目录(生成) - 类型定义 :
types/目录(生成) - 文档 :包根目录下的
README.md、CHANGELOG.md
每个包都通过
src/index.ts导出一个主入口点,该入口点重新导出所有公共 API。这允许使用者从包根目录导入(import { X } from '@vtj/core'),而无需了解内部文件结构。
参考资料
开源项目仓库:gitee.com/newgateway/...