Electron アプリで renderer と main プロセスの vitest 設定を分ける
に公開背景
Electron アプリを開発していて、main プロセスと renderer で Test Environment を分けたかった。
開発環境は vite に使っていて、レンダラーは react & typescript、テストファイルは専用のフォルダを使わずにコロケーションしています。
解決方法
vitestの workspace 機能を使います。vitest.workspace.ts
をルートフォルダに作成することで設定を分離できます。electron.vite.config.ts
側にエイリアスの設定などがあると思うので、 mergeConfig を使って設定をマージしています。
import { mergeConfig } from 'vite'
import { defineWorkspace } from 'vitest/config'
import { main, renderer } from './electron.vite.config'
export default defineWorkspace([
mergeConfig(renderer, {
test: {
include: ['src/renderer/**/*.test.{ts,tsx}'],
name: 'renderer', // ユニークなプロジェクトの名前をつける
environment: 'jsdom', // テスト環境として jsdom を指定
setupFiles: ['vitest.setup.web.ts']
}
}),
mergeConfig(main, {
test: {
include: ['src/main/**/*.test.ts'],
name: 'main-test',
environment: 'node'
}
})
])
electron.vite.config.ts
側はデフォルトだと defineConfig の中に直接設定が書いてありますが、main や renderer の型が UserConfigExport になってしまい、mergeConfig と型が合わないので以下のような形に書き換えています。
import react from '@vitejs/plugin-react'
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
import { resolve } from 'path'
import { UserConfig } from 'vite'
export const main: UserConfig = {
plugins: [externalizeDepsPlugin()]
}
export const preload: UserConfig = {
plugins: [externalizeDepsPlugin()]
}
export const renderer: UserConfig = {
resolve: {
alias: {
'@renderer': resolve('src/renderer/src'),
'@': resolve(__dirname, './src/renderer/src')
}
},
plugins: [react()]
}
export default defineConfig({
main,
preload,
renderer
})
補足
vite の設定を関数形式で行っている場合はおそらく次の issue コメントを参考にしていただく必要がありそうです。
https://github.com/vitest-dev/vitest/issues/4687#issuecomment-1843181549
Looks like your
vite.config
returns a function (so config is defined in the form ofdefineConfig(() => {})
). Documentation has an example on how to handle it (https://vitest.dev/config/#configuration):
import { defineConfig, mergeConfig } from 'vitest/config' import viteConfig from './vite.config' export default defineConfig(configEnv => mergeConfig( viteConfig(configEnv), defineConfig({ test: { exclude: ['packages/template/*'], }, }) ))