fix!: compatible with rollupOptions and rolldownOptions

This commit is contained in:
alex8088 2026-04-12 16:18:24 +08:00
parent 2765eea74d
commit 5333d5216a
6 changed files with 61 additions and 37 deletions

View File

@ -195,14 +195,20 @@ export async function resolveConfig(
const { main, preload, renderer } = loadResult.config const { main, preload, renderer } = loadResult.config
if (main) { if (main) {
main.build ??= {}
setupRollupOptionCompat(main.build)
userConfig.main = await new MainConfigFactory(main, config, { outDir, root }).build() userConfig.main = await new MainConfigFactory(main, config, { outDir, root }).build()
} }
if (preload) { if (preload) {
preload.build ??= {}
setupRollupOptionCompat(preload.build)
userConfig.preload = await new PreloadConfigFactory(preload, config, { outDir, root }).build() userConfig.preload = await new PreloadConfigFactory(preload, config, { outDir, root }).build()
} }
if (renderer) { if (renderer) {
renderer.build ??= {}
setupRollupOptionCompat(renderer.build)
userConfig.renderer = await new RendererConfigFactory(renderer, config, { outDir, root }).build() userConfig.renderer = await new RendererConfigFactory(renderer, config, { outDir, root }).build()
} }
@ -220,6 +226,14 @@ export async function resolveConfig(
return resolved return resolved
} }
function setupRollupOptionCompat<T extends Pick<ViteBuildOptions, 'rollupOptions' | 'rolldownOptions'>>(
buildConfig: T
): asserts buildConfig is T & {
rolldownOptions: Exclude<T['rolldownOptions'], undefined>
} {
buildConfig.rolldownOptions ??= buildConfig.rollupOptions
}
export abstract class ConfigFactory<T extends MainViteConfig | PreloadViteConfig | RendererViteConfig> { export abstract class ConfigFactory<T extends MainViteConfig | PreloadViteConfig | RendererViteConfig> {
constructor( constructor(
protected readonly baseConfig: T, protected readonly baseConfig: T,

View File

@ -205,7 +205,7 @@ export function bytecodePlugin(options: BytecodeOptions = {}): Plugin | null {
return return
} }
const build = config.build const build = config.build
const resolvedOutputs = resolveBuildOutputs(build.rollupOptions.output, build.lib) const resolvedOutputs = resolveBuildOutputs(build.rolldownOptions.output, build.lib)
if (resolvedOutputs) { if (resolvedOutputs) {
const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs] const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs]
const output = outputs[0] const output = outputs[0]
@ -213,7 +213,7 @@ export function bytecodePlugin(options: BytecodeOptions = {}): Plugin | null {
config.logger.warn( config.logger.warn(
colors.yellow( colors.yellow(
'bytecodePlugin does not support ES module, please remove "type": "module" ' + 'bytecodePlugin does not support ES module, please remove "type": "module" ' +
'in package.json or set the "build.rollupOptions.output.format" option to "cjs".' 'in package.json or set build.rollupOptions.output.format (or build.rolldownOptions.output.format) to "cjs".'
) )
) )
} }

View File

@ -73,7 +73,7 @@ export function electronMainConfigPresetPlugin(options?: ElectronPluginOptions):
outDir: path.resolve(root, 'out', 'main'), outDir: path.resolve(root, 'out', 'main'),
target: nodeTarget, target: nodeTarget,
assetsDir: 'chunks', assetsDir: 'chunks',
rollupOptions: { rolldownOptions: {
external: ['electron', /^electron\/.+/, ...builtinModules.flatMap(m => [m, `node:${m}`])], external: ['electron', /^electron\/.+/, ...builtinModules.flatMap(m => [m, `node:${m}`])],
output: {} output: {}
}, },
@ -83,10 +83,10 @@ export function electronMainConfigPresetPlugin(options?: ElectronPluginOptions):
} }
const build = config.build || {} const build = config.build || {}
const rollupOptions = build.rollupOptions || {} const rolldownOptions = build.rolldownOptions || {}
if (!rollupOptions.input) { if (!rolldownOptions.input) {
const libOptions = build.lib const libOptions = build.lib
const outputOptions = rollupOptions.output const outputOptions = rolldownOptions.output
defaultConfig.build['lib'] = { defaultConfig.build['lib'] = {
entry: findLibEntry(root, 'main'), entry: findLibEntry(root, 'main'),
formats: formats:
@ -95,10 +95,10 @@ export function electronMainConfigPresetPlugin(options?: ElectronPluginOptions):
: [outputOptions && !Array.isArray(outputOptions) && outputOptions.format ? outputOptions.format : format] : [outputOptions && !Array.isArray(outputOptions) && outputOptions.format ? outputOptions.format : format]
} }
} else { } else {
defaultConfig.build.rollupOptions.output['format'] = format defaultConfig.build.rolldownOptions.output['format'] = format
} }
defaultConfig.build.rollupOptions.output['assetFileNames'] = path.posix.join( defaultConfig.build.rolldownOptions.output['assetFileNames'] = path.posix.join(
build.assetsDir || defaultConfig.build.assetsDir, build.assetsDir || defaultConfig.build.assetsDir,
'[name]-[hash].[ext]' '[name]-[hash].[ext]'
) )
@ -121,8 +121,9 @@ export function electronMainConfigPresetPlugin(options?: ElectronPluginOptions):
// enable ssr build // enable ssr build
config.build.ssr = true config.build.ssr = true
config.build.ssrEmitAssets = true config.build.ssrEmitAssets = true
config.build.rolldownOptions = config.build.rollupOptions
config.ssr = { ...config.ssr, ...{ noExternal: true } } config.ssr = { ...config.ssr, ...{ noExternal: true } }
config.build.rollupOptions = config.build.rolldownOptions
} }
} }
} }
@ -144,16 +145,17 @@ export function electronMainConfigValidatorPlugin(): Plugin {
} }
const libOptions = build.lib const libOptions = build.lib
const rollupOptions = build.rollupOptions const rolldownOptions = build.rolldownOptions
if (!(libOptions && libOptions.entry) && !rollupOptions?.input) { if (!(libOptions && libOptions.entry) && !rolldownOptions?.input) {
throw new Error( throw new Error(
'An entry point is required in the electron vite main config, ' + 'An entry point is required in the electron vite main config, ' +
'which can be specified using "build.lib.entry" or "build.rollupOptions.input".' 'which can be specified using build.lib.entry, build.rollupOptions.input, ' +
'or build.rolldownOptions.input.'
) )
} }
const resolvedOutputs = resolveBuildOutputs(rollupOptions.output, libOptions) const resolvedOutputs = resolveBuildOutputs(rolldownOptions.output, libOptions)
if (resolvedOutputs) { if (resolvedOutputs) {
const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs] const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs]
@ -204,7 +206,7 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption
outDir: path.resolve(root, 'out', 'preload'), outDir: path.resolve(root, 'out', 'preload'),
target: nodeTarget, target: nodeTarget,
assetsDir: 'chunks', assetsDir: 'chunks',
rollupOptions: { rolldownOptions: {
external: ['electron', /^electron\/.+/, ...builtinModules.flatMap(m => [m, `node:${m}`])], external: ['electron', /^electron\/.+/, ...builtinModules.flatMap(m => [m, `node:${m}`])],
output: {} output: {}
}, },
@ -214,10 +216,10 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption
} }
const build = config.build || {} const build = config.build || {}
const rollupOptions = build.rollupOptions || {} const rolldownOptions = build.rolldownOptions || {}
if (!rollupOptions.input) { if (!rolldownOptions.input) {
const libOptions = build.lib const libOptions = build.lib
const outputOptions = rollupOptions.output const outputOptions = rolldownOptions.output
defaultConfig.build['lib'] = { defaultConfig.build['lib'] = {
entry: findLibEntry(root, 'preload'), entry: findLibEntry(root, 'preload'),
formats: formats:
@ -226,10 +228,10 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption
: [outputOptions && !Array.isArray(outputOptions) && outputOptions.format ? outputOptions.format : format] : [outputOptions && !Array.isArray(outputOptions) && outputOptions.format ? outputOptions.format : format]
} }
} else { } else {
defaultConfig.build.rollupOptions.output['format'] = format defaultConfig.build.rolldownOptions.output['format'] = format
} }
defaultConfig.build.rollupOptions.output['assetFileNames'] = path.posix.join( defaultConfig.build.rolldownOptions.output['assetFileNames'] = path.posix.join(
build.assetsDir || defaultConfig.build.assetsDir, build.assetsDir || defaultConfig.build.assetsDir,
'[name]-[hash].[ext]' '[name]-[hash].[ext]'
) )
@ -237,22 +239,22 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption
const buildConfig = mergeConfig(defaultConfig.build, build) const buildConfig = mergeConfig(defaultConfig.build, build)
config.build = buildConfig config.build = buildConfig
const resolvedOutputs = resolveBuildOutputs(config.build.rollupOptions!.output, config.build.lib || false) const resolvedOutputs = resolveBuildOutputs(config.build.rolldownOptions!.output, config.build.lib || false)
if (resolvedOutputs) { if (resolvedOutputs) {
const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs] const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs]
if (outputs.find(({ format }) => format === 'es')) { if (outputs.find(({ format }) => format === 'es')) {
if (Array.isArray(config.build.rollupOptions!.output)) { if (Array.isArray(config.build.rolldownOptions!.output)) {
config.build.rollupOptions!.output.forEach(output => { config.build.rolldownOptions!.output.forEach(output => {
if (output.format === 'es') { if (output.format === 'es') {
output['entryFileNames'] = '[name].mjs' output['entryFileNames'] = '[name].mjs'
output['chunkFileNames'] = '[name]-[hash].mjs' output['chunkFileNames'] = '[name]-[hash].mjs'
} }
}) })
} else { } else {
config.build.rollupOptions!.output!['entryFileNames'] = '[name].mjs' config.build.rolldownOptions!.output!['entryFileNames'] = '[name].mjs'
config.build.rollupOptions!.output!['chunkFileNames'] = '[name]-[hash].mjs' config.build.rolldownOptions!.output!['chunkFileNames'] = '[name]-[hash].mjs'
} }
} }
} }
@ -270,9 +272,10 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption
// enable ssr build // enable ssr build
config.build.ssr = true config.build.ssr = true
config.build.ssrEmitAssets = true config.build.ssrEmitAssets = true
config.build.rolldownOptions = config.build.rollupOptions
config.ssr = mergeConfig(defaultConfig.ssr, config.ssr || {}) config.ssr = mergeConfig(defaultConfig.ssr, config.ssr || {})
config.ssr.noExternal = true config.ssr.noExternal = true
config.build.rollupOptions = config.build.rolldownOptions
} }
} }
} }
@ -294,16 +297,17 @@ export function electronPreloadConfigValidatorPlugin(): Plugin {
} }
const libOptions = build.lib const libOptions = build.lib
const rollupOptions = build.rollupOptions const rolldownOptions = build.rolldownOptions
if (!(libOptions && libOptions.entry) && !rollupOptions?.input) { if (!(libOptions && libOptions.entry) && !rolldownOptions?.input) {
throw new Error( throw new Error(
'An entry point is required in the electron vite preload config, ' + 'An entry point is required in the electron vite preload config, ' +
'which can be specified using "build.lib.entry" or "build.rollupOptions.input".' 'which can be specified using build.lib.entry, build.rollupOptions.input, ' +
' or build.rolldownOptions.input.'
) )
} }
const resolvedOutputs = resolveBuildOutputs(rollupOptions.output, libOptions) const resolvedOutputs = resolveBuildOutputs(rolldownOptions.output, libOptions)
if (resolvedOutputs) { if (resolvedOutputs) {
const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs] const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs]
@ -359,7 +363,7 @@ export function electronRendererConfigPresetPlugin(options?: ElectronPluginOptio
outDir: path.resolve(root, 'out', 'renderer'), outDir: path.resolve(root, 'out', 'renderer'),
target: chromeTarget, target: chromeTarget,
modulePreload: { polyfill: false }, modulePreload: { polyfill: false },
rollupOptions: { rolldownOptions: {
input: findInput(root) input: findInput(root)
}, },
reportCompressedSize: false, reportCompressedSize: false,
@ -378,6 +382,8 @@ export function electronRendererConfigPresetPlugin(options?: ElectronPluginOptio
config.envDir = config.envDir || path.resolve(root) config.envDir = config.envDir || path.resolve(root)
config.envPrefix = config.envPrefix || ['RENDERER_VITE_', 'VITE_'] config.envPrefix = config.envPrefix || ['RENDERER_VITE_', 'VITE_']
config.build.rollupOptions = config.build.rolldownOptions
} }
} }
} }
@ -403,10 +409,12 @@ export function electronRendererConfigValidatorPlugin(): Plugin {
} }
} }
const rollupOptions = build.rollupOptions const rolldownOptions = build.rolldownOptions
if (!rollupOptions.input) { if (!rolldownOptions.input) {
config.logger.warn(colors.yellow(`index.html file is not found in ${colors.dim('/src/renderer')} directory.`)) config.logger.warn(colors.yellow(`index.html file is not found in ${colors.dim('/src/renderer')} directory.`))
throw new Error('build.rollupOptions.input option is required in the electron vite renderer config.') throw new Error(
'build.rollupOptions.input or build.rolldownOptions.input option is required in the electron vite renderer config.'
)
} }
} }
} }

View File

@ -33,13 +33,15 @@ export function externalizeDepsPlugin(options: ExternalOptions = {}): Plugin | n
config(config): void { config(config): void {
const defaultConfig = { const defaultConfig = {
build: { build: {
rollupOptions: { rolldownOptions: {
external: deps.length > 0 ? [...deps, new RegExp(`^(${deps.join('|')})/.+`)] : [] external: deps.length > 0 ? [...deps, new RegExp(`^(${deps.join('|')})/.+`)] : []
} }
} }
} }
const buildConfig = mergeConfig(defaultConfig.build, config.build || {}) const buildConfig = mergeConfig(defaultConfig.build, config.build || {})
config.build = buildConfig config.build = buildConfig
config.build.rollupOptions = config.build.rolldownOptions
} }
} }
} }

View File

@ -134,7 +134,7 @@ async function bundleEntryFile(
}) as InlineConfig }) as InlineConfig
// rewrite the input instead of merging // rewrite the input instead of merging
viteConfig.build!.rollupOptions!.input = input viteConfig.build!.rolldownOptions!.input = input
const bundles = (await viteBuild(viteConfig)) as Rolldown.RolldownOutput const bundles = (await viteBuild(viteConfig)) as Rolldown.RolldownOutput

View File

@ -115,8 +115,8 @@ async function bundleEntryFile(input: string, config: InlineConfig): Promise<Rol
// rewrite the input instead of merging // rewrite the input instead of merging
const buildOptions = viteConfig.build! const buildOptions = viteConfig.build!
buildOptions.rollupOptions = { buildOptions.rolldownOptions = {
...buildOptions.rollupOptions, ...buildOptions.rolldownOptions,
input input
} }