mirror of
https://github.com/alex8088/electron-vite.git
synced 2025-08-10 21:19:47 +08:00
Merge 1fbf66dd2b8e3db01d635d3ed11fe5c1a939c8dc into 1eeb15ea770eb7595d1bee3013211f41d2b4104b
This commit is contained in:
commit
551c0cd93d
26
src/build.ts
26
src/build.ts
@ -1,5 +1,5 @@
|
|||||||
import { build as viteBuild } from 'vite'
|
import { build as viteBuild } from 'vite'
|
||||||
import { type InlineConfig, resolveConfig } from './config'
|
import { type InlineConfig, resolveConfig, type InlineUserConfig } from './config'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bundles the electron app for production.
|
* Bundles the electron app for production.
|
||||||
@ -10,24 +10,26 @@ export async function build(inlineConfig: InlineConfig = {}): Promise<void> {
|
|||||||
if (config.config) {
|
if (config.config) {
|
||||||
const mainViteConfig = config.config?.main
|
const mainViteConfig = config.config?.main
|
||||||
if (mainViteConfig) {
|
if (mainViteConfig) {
|
||||||
if (mainViteConfig.build?.watch) {
|
await _build(mainViteConfig)
|
||||||
mainViteConfig.build.watch = null
|
|
||||||
}
|
|
||||||
await viteBuild(mainViteConfig)
|
|
||||||
}
|
}
|
||||||
const preloadViteConfig = config.config?.preload
|
const preloadViteConfig = config.config?.preload
|
||||||
if (preloadViteConfig) {
|
if (preloadViteConfig) {
|
||||||
if (preloadViteConfig.build?.watch) {
|
if (Array.isArray(preloadViteConfig)) {
|
||||||
preloadViteConfig.build.watch = null
|
await Promise.all(preloadViteConfig.map(_build))
|
||||||
|
} else {
|
||||||
|
await _build(preloadViteConfig)
|
||||||
}
|
}
|
||||||
await viteBuild(preloadViteConfig)
|
|
||||||
}
|
}
|
||||||
const rendererViteConfig = config.config?.renderer
|
const rendererViteConfig = config.config?.renderer
|
||||||
if (rendererViteConfig) {
|
if (rendererViteConfig) {
|
||||||
if (rendererViteConfig.build?.watch) {
|
_build(rendererViteConfig)
|
||||||
rendererViteConfig.build.watch = null
|
|
||||||
}
|
|
||||||
await viteBuild(rendererViteConfig)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function _build(config: InlineUserConfig): Promise<void> {
|
||||||
|
if (config.build?.watch) {
|
||||||
|
config.build.watch = null
|
||||||
|
}
|
||||||
|
await viteBuild(config)
|
||||||
|
}
|
||||||
|
@ -25,25 +25,27 @@ import { isObject, isFilePathESM } from './utils'
|
|||||||
|
|
||||||
export { defineConfig as defineViteConfig } from 'vite'
|
export { defineConfig as defineViteConfig } from 'vite'
|
||||||
|
|
||||||
|
export type InlineUserConfig = ViteConfig & { configFile?: string | false }
|
||||||
|
|
||||||
export interface UserConfig {
|
export interface UserConfig {
|
||||||
/**
|
/**
|
||||||
* Vite config options for electron main process
|
* Vite config options for electron main process
|
||||||
*
|
*
|
||||||
* https://vitejs.dev/config/
|
* https://vitejs.dev/config/
|
||||||
*/
|
*/
|
||||||
main?: ViteConfig & { configFile?: string | false }
|
main?: InlineUserConfig
|
||||||
/**
|
/**
|
||||||
* Vite config options for electron renderer process
|
* Vite config options for electron renderer process
|
||||||
*
|
*
|
||||||
* https://vitejs.dev/config/
|
* https://vitejs.dev/config/
|
||||||
*/
|
*/
|
||||||
renderer?: ViteConfig & { configFile?: string | false }
|
renderer?: InlineUserConfig
|
||||||
/**
|
/**
|
||||||
* Vite config options for electron preload files
|
* Vite config options for electron preload files
|
||||||
*
|
*
|
||||||
* https://vitejs.dev/config/
|
* https://vitejs.dev/config/
|
||||||
*/
|
*/
|
||||||
preload?: ViteConfig & { configFile?: string | false }
|
preload?: InlineUserConfig | InlineUserConfig[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ElectronViteConfig {
|
export interface ElectronViteConfig {
|
||||||
@ -64,7 +66,7 @@ export interface ElectronViteConfig {
|
|||||||
*
|
*
|
||||||
* https://vitejs.dev/config/
|
* https://vitejs.dev/config/
|
||||||
*/
|
*/
|
||||||
preload?: ViteConfigExport
|
preload?: ViteConfigExport | ViteConfigExport[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export type InlineConfig = Omit<ViteConfig, 'base'> & {
|
export type InlineConfig = Omit<ViteConfig, 'base'> & {
|
||||||
@ -160,22 +162,48 @@ export async function resolveConfig(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (loadResult.config.preload) {
|
if (loadResult.config.preload) {
|
||||||
const preloadViteConfig: ViteConfig = mergeConfig(loadResult.config.preload, deepClone(config))
|
if (Array.isArray(loadResult.config.preload)) {
|
||||||
|
const shouldNotEmptyOutDir = loadResult.config.preload.length > 1 ? true : undefined
|
||||||
preloadViteConfig.mode = inlineConfig.mode || preloadViteConfig.mode || defaultMode
|
loadResult.config.preload = loadResult.config.preload.map(config =>
|
||||||
|
normalizePreloadViteConfig(config, shouldNotEmptyOutDir)
|
||||||
if (outDir) {
|
)
|
||||||
resetOutDir(preloadViteConfig, outDir, 'preload')
|
} else {
|
||||||
|
loadResult.config.preload = normalizePreloadViteConfig(loadResult.config.preload)
|
||||||
}
|
}
|
||||||
mergePlugins(preloadViteConfig, [
|
|
||||||
...electronPreloadVitePlugin({ root }),
|
|
||||||
assetPlugin(),
|
|
||||||
importMetaPlugin(),
|
|
||||||
esmShimPlugin()
|
|
||||||
])
|
|
||||||
|
|
||||||
loadResult.config.preload = preloadViteConfig
|
function normalizePreloadViteConfig(
|
||||||
loadResult.config.preload.configFile = false
|
preloadConfig: InlineUserConfig,
|
||||||
|
shouldNotEmptyOutDir?: boolean
|
||||||
|
): InlineUserConfig {
|
||||||
|
const preloadViteConfig: InlineUserConfig = mergeConfig(preloadConfig, deepClone(config))
|
||||||
|
|
||||||
|
preloadViteConfig.mode = inlineConfig.mode || preloadViteConfig.mode || defaultMode
|
||||||
|
preloadViteConfig.configFile = false
|
||||||
|
|
||||||
|
if (shouldNotEmptyOutDir) {
|
||||||
|
preloadViteConfig.build ||= {}
|
||||||
|
|
||||||
|
if (preloadViteConfig.build.emptyOutDir === true) {
|
||||||
|
throw new Error(
|
||||||
|
"The electron vite preload config `build.emptyOutDir` should be set to `false` when multiple preload scripts are used to prevent overwriting each other's output files."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
preloadViteConfig.build.emptyOutDir = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outDir) {
|
||||||
|
resetOutDir(preloadViteConfig, outDir, 'preload')
|
||||||
|
}
|
||||||
|
mergePlugins(preloadViteConfig, [
|
||||||
|
...electronPreloadVitePlugin({ root }),
|
||||||
|
assetPlugin(),
|
||||||
|
importMetaPlugin(),
|
||||||
|
esmShimPlugin()
|
||||||
|
])
|
||||||
|
|
||||||
|
return preloadViteConfig
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loadResult.config.renderer) {
|
if (loadResult.config.renderer) {
|
||||||
@ -299,8 +327,8 @@ export async function loadConfigFromFile(
|
|||||||
if (config.preload) {
|
if (config.preload) {
|
||||||
const preloadViteConfig = config.preload
|
const preloadViteConfig = config.preload
|
||||||
preloadConfig = await (typeof preloadViteConfig === 'function' ? preloadViteConfig(configEnv) : preloadViteConfig)
|
preloadConfig = await (typeof preloadViteConfig === 'function' ? preloadViteConfig(configEnv) : preloadViteConfig)
|
||||||
if (!isObject(preloadConfig)) {
|
if (!isObject(preloadConfig) && (!Array.isArray(preloadConfig) || !preloadConfig.every(isObject))) {
|
||||||
throw new Error(`preload config must export or return an object`)
|
throw new Error(`preload config must export or return an object or an array of objects`)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
configRequired.push('preload')
|
configRequired.push('preload')
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import type { ChildProcess } from 'node:child_process'
|
import type { ChildProcess } from 'node:child_process'
|
||||||
import {
|
import {
|
||||||
type UserConfig as ViteConfig,
|
|
||||||
type ViteDevServer,
|
type ViteDevServer,
|
||||||
createServer as viteCreateServer,
|
createServer as viteCreateServer,
|
||||||
build as viteBuild,
|
build as viteBuild,
|
||||||
@ -8,7 +7,7 @@ import {
|
|||||||
mergeConfig
|
mergeConfig
|
||||||
} from 'vite'
|
} from 'vite'
|
||||||
import colors from 'picocolors'
|
import colors from 'picocolors'
|
||||||
import { type InlineConfig, resolveConfig } from './config'
|
import { type InlineConfig, resolveConfig, type InlineUserConfig } from './config'
|
||||||
import { resolveHostname } from './utils'
|
import { resolveHostname } from './utils'
|
||||||
import { startElectron } from './electron'
|
import { startElectron } from './electron'
|
||||||
|
|
||||||
@ -53,7 +52,14 @@ export async function createServer(
|
|||||||
if (preloadViteConfig && !options.rendererOnly) {
|
if (preloadViteConfig && !options.rendererOnly) {
|
||||||
logger.info(colors.gray(`\n-----\n`))
|
logger.info(colors.gray(`\n-----\n`))
|
||||||
|
|
||||||
|
let resolvedCount = 0
|
||||||
const watchHook = (): void => {
|
const watchHook = (): void => {
|
||||||
|
resolvedCount++
|
||||||
|
if (Array.isArray(preloadViteConfig) && resolvedCount < preloadViteConfig.length) {
|
||||||
|
// Only resolve when all preload scripts are built
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
logger.info(colors.green(`\nrebuild the electron preload files successfully`))
|
logger.info(colors.green(`\nrebuild the electron preload files successfully`))
|
||||||
|
|
||||||
if (server) {
|
if (server) {
|
||||||
@ -63,7 +69,11 @@ export async function createServer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await doBuild(preloadViteConfig, watchHook, errorHook)
|
if (Array.isArray(preloadViteConfig)) {
|
||||||
|
await Promise.all(preloadViteConfig.map(config => doBuild(config, watchHook, errorHook)))
|
||||||
|
} else {
|
||||||
|
await doBuild(preloadViteConfig, watchHook, errorHook)
|
||||||
|
}
|
||||||
|
|
||||||
logger.info(colors.green(`\nbuild the electron preload files successfully`))
|
logger.info(colors.green(`\nbuild the electron preload files successfully`))
|
||||||
}
|
}
|
||||||
@ -110,9 +120,7 @@ export async function createServer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type UserConfig = ViteConfig & { configFile?: string | false }
|
async function doBuild(config: InlineUserConfig, watchHook: () => void, errorHook: (e: Error) => void): Promise<void> {
|
||||||
|
|
||||||
async function doBuild(config: UserConfig, watchHook: () => void, errorHook: (e: Error) => void): Promise<void> {
|
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
if (config.build?.watch) {
|
if (config.build?.watch) {
|
||||||
let firstBundle = true
|
let firstBundle = true
|
||||||
|
Loading…
x
Reference in New Issue
Block a user