Skip to content

Commit 7a2c5a0

Browse files
committed
feat: rolldown full bundle mode
1 parent 7912459 commit 7a2c5a0

File tree

7 files changed

+1046
-969
lines changed

7 files changed

+1046
-969
lines changed

packages/vite/src/node/build.ts

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ import {
8686
import type { MinimalPluginContext, Plugin, PluginContext } from './plugin'
8787
import type { RollupPluginHooks } from './typeUtils'
8888
import { buildOxcPlugin } from './plugins/oxc'
89+
import type { ViteDevServer } from './server'
8990

9091
export interface BuildEnvironmentOptions {
9192
/**
@@ -539,20 +540,21 @@ export async function resolveBuildPlugins(config: ResolvedConfig): Promise<{
539540
export async function build(
540541
inlineConfig: InlineConfig = {},
541542
): Promise<RolldownOutput | RolldownOutput[] /* | RollupWatcher */> {
542-
const builder = await createBuilder(inlineConfig, true)
543+
const builder = await createBuilder(inlineConfig, true, 'build')
543544
const environment = Object.values(builder.environments)[0]
544545
if (!environment) throw new Error('No environment found')
545546
return builder.build(environment)
546547
}
547548

548549
function resolveConfigToBuild(
550+
command: 'build' | 'serve',
549551
inlineConfig: InlineConfig = {},
550552
patchConfig?: (config: ResolvedConfig) => void,
551553
patchPlugins?: (resolvedPlugins: Plugin[]) => void,
552554
): Promise<ResolvedConfig> {
553555
return resolveConfig(
554556
inlineConfig,
555-
'build',
557+
command,
556558
'production',
557559
'production',
558560
false,
@@ -566,6 +568,7 @@ function resolveConfigToBuild(
566568
**/
567569
async function buildEnvironment(
568570
environment: BuildEnvironment,
571+
server?: ViteDevServer
569572
): Promise<RolldownOutput | RolldownOutput[] /* | RollupWatcher */> {
570573
const { root, packageCache } = environment.config
571574
const options = environment.config.build
@@ -651,6 +654,12 @@ async function buildEnvironment(
651654
...options.rollupOptions.moduleTypes,
652655
'.css': 'js',
653656
},
657+
experimental: {
658+
hmr: server ? {
659+
host: server._currentServerHost!,
660+
port: server._currentServerPort!,
661+
} : false,
662+
}
654663
}
655664

656665
/**
@@ -885,6 +894,29 @@ async function buildEnvironment(
885894
logger.info(
886895
`${colors.green(`✓ built in ${displayTime(Date.now() - startTime)}`)}`,
887896
)
897+
898+
if (server) {
899+
for(const output of res) {
900+
for (const outputFile of output.output) {
901+
server.memoryFiles[outputFile.fileName] = outputFile.type === 'chunk' ? outputFile.code : outputFile.source;
902+
}
903+
}
904+
server.watcher.on('change', async (file) => {
905+
const patch = await bundle!.generateHmrPatch([file]);
906+
if (patch) {
907+
const url = `${Date.now()}.js`;
908+
server.memoryFiles[url] = patch;
909+
// TODO(underfin): fix ws msg typing
910+
// @ts-expect-error
911+
server.ws.send({
912+
type: 'update',
913+
url
914+
})
915+
}
916+
})
917+
// server.watcher = watcher
918+
}
919+
888920
return Array.isArray(outputs) ? res : res[0]
889921
} catch (e) {
890922
enhanceRollupError(e)
@@ -1611,9 +1643,10 @@ export class BuildEnvironment extends BaseEnvironment {
16111643
export interface ViteBuilder {
16121644
environments: Record<string, BuildEnvironment>
16131645
config: ResolvedConfig
1614-
buildApp(): Promise<void>
1646+
buildApp(server?: ViteDevServer): Promise<void>
16151647
build(
16161648
environment: BuildEnvironment,
1649+
server?: ViteDevServer
16171650
): Promise<RolldownOutput | RolldownOutput[] /* | RollupWatcher */>
16181651
}
16191652

@@ -1632,12 +1665,12 @@ export interface BuilderOptions {
16321665
* @experimental
16331666
*/
16341667
sharedPlugins?: boolean
1635-
buildApp?: (builder: ViteBuilder) => Promise<void>
1668+
buildApp?: (builder: ViteBuilder, server?: ViteDevServer) => Promise<void>
16361669
}
16371670

1638-
async function defaultBuildApp(builder: ViteBuilder): Promise<void> {
1671+
async function defaultBuildApp(builder: ViteBuilder, server?: ViteDevServer): Promise<void> {
16391672
for (const environment of Object.values(builder.environments)) {
1640-
await builder.build(environment)
1673+
await builder.build(environment, server)
16411674
}
16421675
}
16431676

@@ -1666,6 +1699,7 @@ export type ResolvedBuilderOptions = Required<BuilderOptions>
16661699
export async function createBuilder(
16671700
inlineConfig: InlineConfig = {},
16681701
useLegacyBuilder: null | boolean = false,
1702+
command: 'build' | 'serve',
16691703
): Promise<ViteBuilder> {
16701704
const patchConfig = (resolved: ResolvedConfig) => {
16711705
if (!(useLegacyBuilder ?? !resolved.builder)) return
@@ -1679,7 +1713,7 @@ export async function createBuilder(
16791713
...resolved.environments[environmentName].build,
16801714
}
16811715
}
1682-
const config = await resolveConfigToBuild(inlineConfig, patchConfig)
1716+
const config = await resolveConfigToBuild(command, inlineConfig, patchConfig)
16831717
useLegacyBuilder ??= !config.builder
16841718
const configBuilder = config.builder ?? resolveBuilderOptions({})!
16851719

@@ -1688,11 +1722,11 @@ export async function createBuilder(
16881722
const builder: ViteBuilder = {
16891723
environments,
16901724
config,
1691-
async buildApp() {
1692-
return configBuilder.buildApp(builder)
1725+
async buildApp(server?: ViteDevServer) {
1726+
return configBuilder.buildApp(builder, server)
16931727
},
1694-
async build(environment: BuildEnvironment) {
1695-
return buildEnvironment(environment)
1728+
async build(environment: BuildEnvironment, server?: ViteDevServer) {
1729+
return buildEnvironment(environment, server)
16961730
},
16971731
}
16981732

@@ -1742,6 +1776,7 @@ export async function createBuilder(
17421776
}
17431777
}
17441778
environmentConfig = await resolveConfigToBuild(
1779+
command,
17451780
inlineConfig,
17461781
patchConfig,
17471782
patchPlugins,

packages/vite/src/node/cli.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ cli
175175
'--force',
176176
`[boolean] force the optimizer to ignore the cache and re-bundle`,
177177
)
178-
.action(async (root: string, options: ServerOptions & GlobalCLIOptions) => {
178+
// TODO(underfin): Consider how to merge the build option into dev command.
179+
.action(async (root: string, options: BuildEnvironmentOptions & BuilderCLIOptions & ServerOptions & GlobalCLIOptions) => {
179180
filterDuplicateOptions(options)
180181
// output structure is preserved even after bundling so require()
181182
// is ok here
@@ -197,6 +198,24 @@ cli
197198
throw new Error('HTTP server not available')
198199
}
199200

201+
const { createBuilder } = await import('./build')
202+
203+
const buildOptions: BuildEnvironmentOptions = cleanBuilderCLIOptions(options)
204+
205+
const inlineConfig: InlineConfig = {
206+
root,
207+
base: options.base,
208+
mode: options.mode,
209+
configFile: options.config,
210+
configLoader: options.configLoader,
211+
logLevel: options.logLevel,
212+
clearScreen: options.clearScreen,
213+
build: buildOptions,
214+
...(options.app ? { builder: {} } : {}),
215+
}
216+
const builder = await createBuilder(inlineConfig, null, 'serve')
217+
await builder.buildApp(server)
218+
200219
await server.listen()
201220

202221
const info = server.config.logger.info
@@ -321,7 +340,7 @@ cli
321340
build: buildOptions,
322341
...(options.app ? { builder: {} } : {}),
323342
}
324-
const builder = await createBuilder(inlineConfig, null)
343+
const builder = await createBuilder(inlineConfig, null, 'build')
325344
await builder.buildApp()
326345
} catch (e) {
327346
createLogger(options.logLevel).error(

packages/vite/src/node/plugins/index.ts

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,18 @@ import {
2020
import { watchPackageDataPlugin } from '../packages'
2121
import { jsonPlugin } from './json'
2222
import { oxcResolvePlugin, resolvePlugin } from './resolve'
23-
import { optimizedDepsPlugin } from './optimizedDeps'
24-
import { importAnalysisPlugin } from './importAnalysis'
25-
import { cssAnalysisPlugin, cssPlugin, cssPostPlugin } from './css'
23+
// import { optimizedDepsPlugin } from './optimizedDeps'
24+
// import { importAnalysisPlugin } from './importAnalysis'
25+
import {
26+
// cssAnalysisPlugin,
27+
cssPlugin, cssPostPlugin } from './css'
2628
import { assetPlugin } from './asset'
27-
import { clientInjectionsPlugin } from './clientInjections'
29+
// import { clientInjectionsPlugin } from './clientInjections'
2830
import { buildHtmlPlugin, htmlInlineProxyPlugin } from './html'
2931
import { wasmFallbackPlugin, wasmHelperPlugin } from './wasm'
3032
import { modulePreloadPolyfillPlugin } from './modulePreloadPolyfill'
3133
import { webWorkerPlugin } from './worker'
32-
import { preAliasPlugin } from './preAlias'
34+
// import { preAliasPlugin } from './preAlias'
3335
import { definePlugin } from './define'
3436
import { workerImportMetaUrlPlugin } from './workerImportMetaUrl'
3537
import { assetImportMetaUrlPlugin } from './assetImportMetaUrl'
@@ -49,7 +51,7 @@ export async function resolvePlugins(
4951
normalPlugins: Plugin[],
5052
postPlugins: Plugin[],
5153
): Promise<Plugin[]> {
52-
const isBuild = config.command === 'build'
54+
const isBuild = true
5355
const isWorker = config.isWorker
5456
const buildPlugins = isBuild
5557
? await (await import('../build')).resolveBuildPlugins(config)
@@ -58,9 +60,9 @@ export async function resolvePlugins(
5860
const enableNativePlugin = config.experimental.enableNativePlugin
5961

6062
return [
61-
!isBuild ? optimizedDepsPlugin() : null,
63+
// !isBuild ? optimizedDepsPlugin() : null,
6264
!isWorker ? watchPackageDataPlugin(config.packageCache) : null,
63-
!isBuild ? preAliasPlugin(config) : null,
65+
// !isBuild ? preAliasPlugin(config) : null,
6466
enableNativePlugin === true
6567
? nativeAliasPlugin({
6668
entries: config.resolve.alias.map((item) => {
@@ -140,7 +142,8 @@ export async function resolvePlugins(
140142
: wasmFallbackPlugin(),
141143
definePlugin(config),
142144
cssPostPlugin(config),
143-
isBuild && buildHtmlPlugin(config),
145+
// isBuild &&
146+
buildHtmlPlugin(config),
144147
workerImportMetaUrlPlugin(config),
145148
assetImportMetaUrlPlugin(config),
146149
...buildPlugins.pre,
@@ -158,14 +161,14 @@ export async function resolvePlugins(
158161

159162
...buildPlugins.post,
160163

161-
// internal server-only plugins are always applied after everything else
162-
...(isBuild
163-
? []
164-
: [
165-
clientInjectionsPlugin(config),
166-
cssAnalysisPlugin(config),
167-
importAnalysisPlugin(config),
168-
]),
164+
// // internal server-only plugins are always applied after everything else
165+
// ...(isBuild
166+
// ? []
167+
// : [
168+
// clientInjectionsPlugin(config),
169+
// cssAnalysisPlugin(config),
170+
// importAnalysisPlugin(config),
171+
// ]),
169172
].filter(Boolean) as Plugin[]
170173
}
171174

0 commit comments

Comments
 (0)