工作區
Vitest 透過工作區設定檔,提供對 monorepo 的原生支援。您可以建立一個工作區來定義專案的設定。
定義工作區
工作區應在其根目錄中包含 vitest.workspace
或 vitest.projects
檔案(如果有的話,與您的設定檔位於同一個資料夾中)。Vitest 支援的檔案副檔名可以是 ts
、js
或 json
。
工作區設定檔應預設匯出一個清單,其中包含引用專案的檔案或 glob 模式(全域匹配模式)。例如,如果您有一個名為 packages
的資料夾,其中包含您的專案,您可以使用此設定檔定義一個工作區:
export default ['packages/*'];
即使 packages
中的資料夾沒有設定檔,Vitest 仍會將其視為個別專案。
WARNING
除非在此設定中明確指定,否則 Vitest 不會將根設定視為工作區專案,因此不會執行 include
中指定的測試。
您也可以使用其設定檔引用專案:
export default ['packages/*/vitest.config.{e2e,unit}.ts'];
此模式僅會包含 vitest.config
檔案,且檔名在副檔名前包含 e2e
和 unit
的專案。
WARNING
如果您使用 glob 模式引用檔名,請確保設定檔名以 vite.config
或 vitest.config
開頭。否則,Vitest 會略過這些檔案。
您也可以使用行內配置定義專案。工作區檔案支援同時使用兩種語法格式。
import { defineWorkspace } from 'vitest/config';
// defineWorkspace 提供了良好的類型提示,提升開發者體驗 (Developer Experience, DX)
export default defineWorkspace([
'packages/*',
{
// 使用 "extends" 合併兩個設定
extends: './vite.config.js',
test: {
include: ['tests/**/*.{browser}.test.{ts,js}'],
// 建議在使用行內配置時定義名稱
name: 'happy-dom',
environment: 'happy-dom',
},
},
{
test: {
include: ['tests/**/*.{node}.test.{ts,js}'],
name: 'node',
environment: 'node',
},
},
]);
WARNING
所有專案應具有唯一名稱。否則,Vitest 將拋出錯誤訊息。如果您未在行內配置中提供名稱,Vitest 將自動分配一個數字。如果在使用 glob 語法定義的專案配置中未提供名稱,Vitest 會預設使用目錄名稱。
如果您不依賴行內配置,則只需在根目錄中建立一個小型的 json 檔案:
["packages/*"]
工作區專案不支援所有的配置屬性。為了提升類型安全性,請在專案設定檔中使用 defineProject
而非 defineConfig
方法:
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" 在專案配置中不受支援,
// 因此會顯示錯誤
reporters: ['json'],
},
});
配置
任何配置選項都不會從根層級設定檔繼承。您可以建立一個共享的設定檔,並將其與專案配置合併:
import { defineProject, mergeConfig } from 'vitest/config';
import configShared from '../vitest.shared.js';
export default mergeConfig(
configShared,
defineProject({
test: {
environment: 'jsdom',
},
})
);
此外,某些配置選項在專案配置中是不允許的。最值得注意的包括:
coverage
:coverage 涵蓋整個工作區reporters
:僅支援根層級的 reportersresolveSnapshotPath
:僅採用根層級的 resolver- 所有其他不影響測試執行器的配置選項
TIP
所有專案配置中不支援的配置選項,在 "Config" 頁面中都有 * 標記。
測試覆蓋率
工作區專案的測試覆蓋率功能可正常運作。但是,如果您啟用了 all
選項,並且在某些專案中使用了非常規的副檔名,則需要在根設定檔中添加一個處理此副檔名的插件。
例如,如果某個套件使用 Vue 檔案,且有自己的設定檔,但部分檔案未在測試中導入,則測試覆蓋率分析可能會失敗,因為它依賴根配置而非專案配置。