📋 目錄
Jest 是 JavaScript 測試框架的事實標準,十年來幾乎壟斷了前端測試的話語權。但 Vitest 正在改變這個局面。Vitest 3 的效能數據(2-10x 比 Jest 快)、Browser Mode 的穩定化、以及與 Vite 生態的無縫整合,正在讓它成為 2026 年新專案的首選測試框架。
為什麼要關心測試框架的選擇
測試框架是那種「一開始就要選好,之後很難換」的工具。一旦你的測試套件寫了幾千行,遷移框架的成本就變得非常高了。
所以在選擇測試框架時,你需要看的不是「現在流行什麼」,而是「這個框架的發展方向在哪裡」。
Vitest 的方向很明確:讓 JavaScript 測試變得更快、更現代、更整合。Jest 的方向則是「繼續穩定維持」。這個方向差異,在 2026 年開始變得明顯。
Vitest 的效能數據
基準測試
| 框架 | 500 測試時間 | 差異 |
|---|---|---|
| Vitest | 8 秒 | 基準 |
| Jest | 45 秒 | 5.6x 慢 |
在大型測試套件上,Vitest 的速度優勢更加明顯:
| 場景 | Vitest | Jest |
|---|---|---|
| 冷啟動 | 1-2s | 10-15s |
| Watch mode(只跑相關測試) | <1s | 3-5s |
| CI mode | 快 | 慢 |
為什麼 Vitest 比較快
Vitest 重新使用了 Vite 的 transform 和 pre-bundling 管道:
# Jest:每次都需要重新解析所有模組
# 測試 → Jest runtime → CommonJS transform → 執行
# Vitest:使用 Vite 的 transform
# 測試 → Vite transform(已快取)→ 執行
Vitest 的底層其實是 Vite,所以它自動繼承了 Vite 的所有效能優化:
- 預先 bundling:node_modules 的依賴只轉換一次,之後使用快取
- Native ESM:原生支援 ESM,不需要 CommonJS 的轉換
- 平行處理:使用 Worker threads 平行執行測試
Vitest 3 的新功能
Browser Mode 穩定化
Vitest 3 最大的亮點:Browser Mode 穩定了。
// vitest.config.ts
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
test: {
// 瀏覽器測試模式
browser: {
provider: 'playwright', // 使用 Playwright 作為瀏覽器 provider
browser: 'chromium', // 測試哪個瀏覽器
},
},
});
// 測試範例
import { render, screen } from '@testing-library/react';
test('按鈕點擊後顯示文字', async () => {
render(<MyButton />);
// 在真實的 Chromium 裡執行
await userEvent.click(screen.getByRole('button'));
expect(screen.getByText('Clicked!')).toBeInTheDocument();
});
過去用 Vitest 測試 React 組件,是用 jsdom 模擬 DOM。現在可以直接在真實的瀏覽器裡跑這些測試,而且不需要切換到 Cypress 或 Playwright。
Workspace 支援
Vitest 3 內建了對 monorepo 的原生支援:
// vitest.workspace.ts
import { defineWorkspace } from 'vitest/config';
export default defineWorkspace([
{
// 第一個 package
extends: './packages/app/vitest.config.ts',
test: {
name: 'web-app',
include: ['packages/app/**/*.test.ts'],
},
},
{
// 第二個 package
extends: './packages/components/vitest.config.ts',
test: {
name: 'ui-components',
include: ['packages/components/**/*.test.ts'],
},
},
]);
這個功能對於大型 monorepo 專案特別有用——再也不需要 Jest 的 projects 配置或額外的測試引導工具。
Visual Regression Testing
Vitest 3 內建了視覺回歸測試:
import { check } from 'vitest/screenshot';
test('按鈕樣式沒有變化', async () => {
const { el } = render(<Button>Click me</Button>);
// 截圖並與基準截圖比較
await check(el, 'button-default-state');
});
與 Jest 的詳細比較
| 維度 | Vitest | Jest |
|---|---|---|
| 速度 | 2-10x 快 | 基準 |
| ESM 支援 | 原生 ESM | 需要額外設定 |
| TypeScript | 零配置 | 需要額外設定 |
| Browser Testing | ✅ 內建(Playwright) | ❌ 需搭配其他工具 |
| Visual Regression | ✅ 內建 | ❌ |
| Watch Mode | 智慧 watch(只跑相關測試) | 基礎 watch |
| 生態 | 年輕,快速成長 | 龐大穩定 |
| Vite 整合 | 原生整合 | 需要額外設定 |
Jest 的優勢
// Jest 的 snapshot 測試更成熟
test('renders correctly', () => {
const tree = renderer.create(<MyComponent />).toJSON();
expect(tree).toMatchSnapshot();
});
Jest 的 snapshot 功能經過多年打磨,錯誤訊息更加詳細。
Vitest 的優勢
// Vitest 的 Vite 整合讓設定極簡
// vitest.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
// 這就是全部需要的設定
globals: true,
environment: 'jsdom',
},
});
// 測試幾乎一樣,但設定少很多
test('adds two numbers', () => {
expect(1 + 1).toBe(2);
});
從 Jest 遷移到 Vitest
步驟 1:安裝 Vitest
npm install -D vitest @vitejs/plugin-react @testing-library/react @testing-library/user-event
步驟 2:更新 Vite 配置
// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
test: {
globals: true,
environment: 'jsdom',
setupFiles: './src/setupTests.ts',
},
});
步驟 3:更新測試檔案
// Jest
import { describe, it, expect } from '@jest/globals';
// Vitest(幾乎完全相同)
import { describe, it, expect } from 'vitest';
Vitest 的 API 設計與 Jest 高度相容,遷移成本很低。
步驟 4:執行 Migration
# 使用 Vitest 的 Jest migration helper
npx vitest migrate --config vitest.config.ts
# 然後驗證
npx vitest run
常見問題
// ❌ Jest 的 timer mocks 在 Vitest 裡不一樣
vi.useFakeTimers(); // Vitest 用 vi
jest.useFakeTimers(); // Jest 用 jest
// ✅ 解決方案
import { vi } from 'vitest';
vi.useFakeTimers();
結語:2026 年新專案選哪個
如果你的團隊在 2026 年開始一個新專案,特別是使用 Vite 的專案:
Vitest 是更合理的選擇。它的效能領先、生態系正在快速成長、Browser Mode 解決了過去「測試在 jsdom 跑但用戶瀏覽器不一樣」的問題。
如果你的團隊已經有穩定的 Jest 測試套件:
不需要急著遷移。Jest 仍然穩定,只是落後了一個世代。可以先在新模組或新專案使用 Vitest,逐步擴大使用範圍。
Vitest 的崛起,是 Vite 生態系從「開發工具」擴展到「完整工具鏈」的一部分。當 Vite 成為前端開發的主流,Bun/ESBuild 的效能基準被廣泛接受,Vitest 的效能優勢就變得越來越難以忽視。
延伸閱讀
- Vite 8 Rust 統一建置 — 建置工具最新動態
- ESLint Flat Config 遷移 — 程式碼品質工具
本文是「2026 前端測試工具」系列文章之一。