本文记录了将 Tona 项目从传统 Vite 工具链完整迁移到 Vite+ 的全过程,包括迁移策略、配置调整、踩坑经历与最终收益。

1. 项目背景

Tona 是一个专为博客园设计的皮肤开发框架,采用 monorepo 架构,包含:

  • 12 个 packages:核心库、UI 组件、Hooks、工具函数、CLI 工具等
  • 3 个 themes:geek、reacg、shadcn 三套博客皮肤

关于 Tona 的详细介绍,请查看这篇博文《AI × 博客园皮肤》

更详细的介绍

2. 为什么决定迁移到 Vite+

Vite+ 刚刚发布,MIT 协议,免费且开源。我十分喜欢 Vite 的 API 的设计和兼容性,对于 Tona, Vite 几乎每个版本都有经历,从 Vite 0.8 版本开始使用, 逐步过渡到 Vite 8,每次升级都轻而易举,相信这次也不例外!

Vite+ 将现代 Web 开发所需的工具整合到一个统一的工具链中:

工具 用途
Vite + Rolldown 开发服务器和应用构建
Vitest 测试框架
Oxlint + Oxfmt 代码检查和格式化
tsdown 库构建和独立可执行文件
Vite Task 任务编排

统一的工作流

vp dev      # 开发服务器
vp check    # 格式化 + lint + 类型检查
vp test     # 运行测试
vp build    # 生产构建
vp run      # 任务执行

在 JavaScript 生态中,开发者需要管理越来越多的工具:运行时(Node.js)、包管理器(pnpm/npm/yarn)、开发服务器、linter、formatter、测试运行器、打包器、任务运行器……每个工具都有自己的配置文件、版本管理和升级周期。

一个典型的前端项目需要配置多个工具:

{
  "devDependencies": {
    "vite": "^5.x",
    "vitest": "^1.x",
    "tsdown": "^0.x",
    "@biomejs/biome": "^1.x",
    "lefthook": "^1.x"
  }
}

每个工具都有独立的配置文件、版本管理、升级周期。当它们之间存在兼容性问题时,调试成本极高。

tona/
├── vite.config.ts
├── vitest.config.ts
├── tsdown.config.ts
├── biome.jsonc
├── lefthook.yml
└── .nvmrc

配置分散在多个文件中,维护成本高,且容易出现配置不一致的问题。How many config files does one need, right?

image

每个工具都需要单独安装和更新,版本冲突时有发生。特别是 tsdown 和 Vite 之间的依赖关系,经常导致 lock 文件冲突。正如 Vite+ 官方文档所指出的,这些问题在多团队组织中会被放大:依赖管理、构建基础设施和代码质量成为分散的责任,每个团队各自处理,往往没有人将其作为优先事项来负责。结果是依赖版本不同步、构建变慢、代码质量下降。

Vite+ 的底层组件使用 Rust 编写,提供了企业级的性能:

操作 性能提升
生产构建 比 webpack 快 40 倍
代码检查 比 ESLint 快 50-100 倍
代码格式化 比 Prettier 快 30 倍

更重要的是,统一工具链带来了额外的性能优势。例如,vp check 可以在单次运行中同时完成格式化、lint 和类型检查,比分开运行类型感知的 lint 规则和类型检查快 2 倍

对于 Tona 这样一个 monorepo 项目,Vite+ 的价值尤为明显:

  • 减少依赖数量:移除 5 个工具依赖,简化 package.json
  • 统一配置管理:12 个 package 的配置风格统一
  • 简化 CI/CD:无需在 CI 中安装多个工具
  • 降低维护成本:工具升级只需更新 Vite+ 版本
  • 性能提升:构建和检查速度显著提升

3. 迁移前的项目结构和技术栈

原有技术栈

类别 工具/方案
构建工具 Vite + tsdown
测试框架 Vitest
代码规范 Biome(lint + format)
Git Hooks Lefthook
包管理 pnpm + pnpm-workspace
Node 版本管理 nvm
tona/
├── packages/
│   ├── core/
│   │   ├── vite.config.ts
│   │   └── tsdown.config.ts      # 库构建配置
│   ├── hooks/
│   ├── ui/
│   ├── utils/
│   └── ...
├── themes/
│   ├── geek/
│   │   └── vite.config.ts
│   ├── shadcn/
│   │   └── vite.config.ts
│   └── reacg/
│       └── vite.config.ts
├── vite.config.ts                # 根配置
├── vitest.config.ts              # 测试配置
├── biome.jsonc                   # 代码规范
├── lefthook.yml                  # Git hooks
├── .nvmrc                        # Node 版本
└── pnpm-workspace.yaml

受影响的部分

部分 影响程度 说明
vite.config.ts 需要重写导入和配置结构
tsdown.config.ts 合并到 vite.config.ts
vitest.config.ts 合并到 vite.config.ts
biome.jsonc 迁移到 vite.config.ts
lefthook.yml 使用 Vite+ 内置 hooks
.nvmrc 使用 Vite+ 管理 Node 版本
package.json scripts 命令重写
源码导入语句 vite → vite-plus

4. 迁移整体策略

Vite+ 提供了 coding agent 专用的迁移提示词,我先让 agent 走一遍再手动处理剩余问题。

Migrate this project to Vite+. Vite+ replaces the current split tooling around runtime management, package management, dev/build/test commands, linting, formatting, and packaging. Run `vp help` to understand Vite+ capabilities and `vp help migrate` before making changes. Use `vp migrate --no-interactive` in the workspace root. Make sure the project is using Vite 8+ and Vitest 4.1+ before migrating.

After the migration:

- Confirm `vite` imports were rewritten to `vite-plus` where needed
- Confirm `vitest` imports were rewritten to `vite-plus/test` where needed
- Remove old `vite` and `vitest` dependencies only after those rewrites are confirmed
- Move remaining tool-specific config into the appropriate blocks in `vite.config.ts`

Command mapping to keep in mind:

- `vp run 

原文地址: https://www.cveoy.top/t/topic/qGaz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录