From ffe4dd1c350659016e0bea4e2235e1bbb437e9e3 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 27 Apr 2024 15:30:08 +0900 Subject: [PATCH 1/3] test(v6): reproduce custom environment preload injection --- .../vite/src/node/__tests__/build.spec.ts | 20 +++++++++++++++++++ .../__tests__/fixtures/dynamic-import/dep.mjs | 1 + .../fixtures/dynamic-import/entry.mjs | 4 ++++ 3 files changed, 25 insertions(+) create mode 100644 packages/vite/src/node/__tests__/fixtures/dynamic-import/dep.mjs create mode 100644 packages/vite/src/node/__tests__/fixtures/dynamic-import/entry.mjs diff --git a/packages/vite/src/node/__tests__/build.spec.ts b/packages/vite/src/node/__tests__/build.spec.ts index 72082550bcebef..4ea0ad1131b5d9 100644 --- a/packages/vite/src/node/__tests__/build.spec.ts +++ b/packages/vite/src/node/__tests__/build.spec.ts @@ -637,6 +637,26 @@ describe('resolveBuildOutputs', () => { ], }) }) + + test('custom environment ssr', async () => { + const builder = await createBuilder({ + root: resolve(__dirname, 'fixtures/dynamic-import'), + environments: { + custom: { + build: { + ssr: true, + rollupOptions: { + input: { + index: '/entry', + }, + }, + }, + }, + }, + }) + const result = await builder.build(builder.environments.custom) + expect((result as RollupOutput).output[0].code).not.toContain('preload') + }) }) /** diff --git a/packages/vite/src/node/__tests__/fixtures/dynamic-import/dep.mjs b/packages/vite/src/node/__tests__/fixtures/dynamic-import/dep.mjs new file mode 100644 index 00000000000000..76805196e3d27d --- /dev/null +++ b/packages/vite/src/node/__tests__/fixtures/dynamic-import/dep.mjs @@ -0,0 +1 @@ +export const hello = 'hello' diff --git a/packages/vite/src/node/__tests__/fixtures/dynamic-import/entry.mjs b/packages/vite/src/node/__tests__/fixtures/dynamic-import/entry.mjs new file mode 100644 index 00000000000000..997d636183c8a9 --- /dev/null +++ b/packages/vite/src/node/__tests__/fixtures/dynamic-import/entry.mjs @@ -0,0 +1,4 @@ +export async function main() { + const mod = await import('./dep.mjs') + console.log(mod) +} From 37190afc150fea4ec4586db2cef69d1f084fa224 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 27 Apr 2024 15:55:13 +0900 Subject: [PATCH 2/3] test: ssr builtin --- .../vite/src/node/__tests__/build.spec.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/__tests__/build.spec.ts b/packages/vite/src/node/__tests__/build.spec.ts index 4ea0ad1131b5d9..c7cdf38055e9bd 100644 --- a/packages/vite/src/node/__tests__/build.spec.ts +++ b/packages/vite/src/node/__tests__/build.spec.ts @@ -638,7 +638,27 @@ describe('resolveBuildOutputs', () => { }) }) - test('custom environment ssr', async () => { + test('ssr builtin', async () => { + const builder = await createBuilder({ + root: resolve(__dirname, 'fixtures/dynamic-import'), + environments: { + ssr: { + build: { + ssr: true, + rollupOptions: { + input: { + index: '/entry', + }, + }, + }, + }, + }, + }) + const result = await builder.build(builder.environments.ssr) + expect((result as RollupOutput).output[0].code).not.toContain('preload') + }) + + test('ssr custom', async () => { const builder = await createBuilder({ root: resolve(__dirname, 'fixtures/dynamic-import'), environments: { From 9097e0d9cfca335f5dbd78e5b00d2580b5695e6c Mon Sep 17 00:00:00 2001 From: patak-dev Date: Sun, 28 Apr 2024 07:32:30 +0200 Subject: [PATCH 3/3] fix: patch config before internal plugins creation --- packages/vite/src/node/build.ts | 41 +++++++++++++++++++------------- packages/vite/src/node/config.ts | 14 +++++++++-- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 32d13a1b490a26..eb64d936ddd12e 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -8,13 +8,11 @@ import type { LoggingFunction, ModuleFormat, OutputOptions, - Plugin, RollupBuild, RollupError, RollupLog, RollupOptions, RollupOutput, - PluginContext as RollupPluginContext, RollupWatcher, WatcherOptions, } from 'rollup' @@ -68,6 +66,7 @@ import { mergeConfig } from './publicUtils' import { webWorkerPostPlugin } from './plugins/worker' import { getHookHandler } from './plugins' import { Environment } from './environment' +import type { Plugin, PluginContext } from './plugin' export interface BuildEnvironmentOptions { /** @@ -535,6 +534,7 @@ export async function build( function resolveConfigToBuild( inlineConfig: InlineConfig = {}, patchConfig?: (config: ResolvedConfig) => void, + patchPlugins?: (plugins: Plugin[]) => void, ) { return resolveConfig( inlineConfig, @@ -543,6 +543,7 @@ function resolveConfigToBuild( 'production', false, patchConfig, + patchPlugins, ) } @@ -1125,7 +1126,6 @@ function wrapEnvironmentLoad( return fn.call( injectEnvironmentInContext(this, environment), id, - // @ts-expect-error: Receiving options param to be future-proof if Rollup adds it injectSsrFlag(args[0], environment), ) } @@ -1152,7 +1152,6 @@ function wrapEnvironmentTransform( injectEnvironmentInContext(this, environment), code, importer, - // @ts-expect-error: Receiving options param to be future-proof if Rollup adds it injectSsrFlag(args[0], environment), ) } @@ -1167,8 +1166,8 @@ function wrapEnvironmentTransform( } } -function injectEnvironmentInContext( - context: RollupPluginContext, +function injectEnvironmentInContext( + context: Context, environment?: BuildEnvironment, ) { return new Proxy(context, { @@ -1479,8 +1478,18 @@ export async function createBuilder( let environmentConfig = config if (!config.builder.sharedConfigBuild) { const patchConfig = (resolved: ResolvedConfig) => { + // Until the ecosystem updates to use `environment.options.build` instead of `config.build`, + // we need to make override `config.build` for the current environment. + // We can deprecate `config.build` in ResolvedConfig and push everyone to upgrade, and later + // remove the default values that shouldn't be used at all once the config is resolved + ;(resolved.build as ResolvedBuildOptions) = { + ...resolved.environments[name].build, + lib: false, + } + } + const patchPlugins = (resolvedPlugins: Plugin[]) => { // Force opt-in shared plugins - const environmentPlugins = [...resolved.plugins] + const environmentPlugins = [...resolvedPlugins] let validMixedPlugins = true for (let i = 0; i < environmentPlugins.length; i++) { const environmentPlugin = environmentPlugins[i] @@ -1497,18 +1506,16 @@ export async function createBuilder( } } if (validMixedPlugins) { - ;(resolved.plugins as Plugin[]) = environmentPlugins - } - // Until the ecosystem updates to use `environment.options.build` instead of `config.build`, - // we need to make override `config.build` for the current environment. - // We can deprecate `config.build` in ResolvedConfig and push everyone to upgrade, and later - // remove the default values that shouldn't be used at all once the config is resolved - ;(resolved.build as ResolvedBuildOptions) = { - ...resolved.environments[name].build, - lib: false, + for (let i = 0; i < environmentPlugins.length; i++) { + resolvedPlugins[i] = environmentPlugins[i] + } } } - environmentConfig = await resolveConfigToBuild(inlineConfig, patchConfig) + environmentConfig = await resolveConfigToBuild( + inlineConfig, + patchConfig, + patchPlugins, + ) } const environment = await createEnvironment(name, environmentConfig) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index aa3ff8eec4d1da..f3a05f0862faa8 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -759,6 +759,7 @@ export async function resolveConfig( defaultNodeEnv = 'development', isPreview = false, patchConfig: ((config: ResolvedConfig) => void) | undefined = undefined, + patchPlugins: ((plugins: Plugin[]) => void) | undefined = undefined, ): Promise { let config = inlineConfig let configFileDependencies: string[] = [] @@ -1284,7 +1285,15 @@ export async function resolveConfig( ...config, ...resolved, } - ;(resolved.plugins as Plugin[]) = await resolvePlugins( + + // Backward compatibility hook, modify the resolved config before it is used + // to create inernal plugins. For example, `config.build.ssr`. Once we rework + // internal plugins to use environment.options, we can remove the dual + // patchConfig/patchPlugins and have a single patchConfig before configResolved + // gets called + patchConfig?.(resolved) + + const resolvedPlugins = await resolvePlugins( resolved, prePlugins, normalPlugins, @@ -1292,7 +1301,8 @@ export async function resolveConfig( ) // Backward compatibility hook used in builder - patchConfig?.(resolved) + patchPlugins?.(resolvedPlugins) + ;(resolved.plugins as Plugin[]) = resolvedPlugins Object.assign(resolved, createPluginHookUtils(resolved.plugins))