Skip to content

Commit 2588f03

Browse files
authored
fix(native-plugin): run optimizer correctly (#265)
1 parent a443b0a commit 2588f03

File tree

1 file changed

+62
-22
lines changed

1 file changed

+62
-22
lines changed

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

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,13 @@ import {
3535
safeRealpathSync,
3636
tryStatSync,
3737
} from '../utils'
38-
import { optimizedDepInfoFromFile, optimizedDepInfoFromId } from '../optimizer'
38+
import {
39+
isDepOptimizationDisabled,
40+
optimizedDepInfoFromFile,
41+
optimizedDepInfoFromId,
42+
} from '../optimizer'
3943
import type { DepsOptimizer } from '../optimizer'
40-
import { type Environment, perEnvironmentPlugin } from '..'
44+
import type { Environment } from '..'
4145
import type { PackageCache, PackageData } from '../packages'
4246
import { canExternalizeFile, shouldExternalize } from '../external'
4347
import {
@@ -168,15 +172,42 @@ export interface ResolvePluginOptionsWithOverrides
168172
const perEnvironmentOrWorkerPlugin = (
169173
name: string,
170174
overrideEnvConfig: (ResolvedConfig & ResolvedEnvironmentOptions) | undefined,
171-
f: (env: {
172-
name: string
173-
config: ResolvedConfig & ResolvedEnvironmentOptions
174-
}) => Plugin,
175-
): Plugin => {
175+
f: (
176+
env: {
177+
name: string
178+
config: ResolvedConfig & ResolvedEnvironmentOptions
179+
},
180+
getEnvironment: () => Environment,
181+
) => Plugin,
182+
): Plugin[] => {
183+
const envs: Record<string, Environment> = {}
184+
const getEnvironmentPlugin: Plugin = {
185+
name: `${name}:get-environment`,
186+
buildStart() {
187+
envs[this.environment.name] = this.environment
188+
},
189+
perEnvironmentStartEndDuringDev: true,
190+
}
191+
const createGetEnvironment = (name: string) => () => envs[name]
192+
176193
if (overrideEnvConfig) {
177-
return f({ name: 'client', config: overrideEnvConfig })
194+
return [
195+
getEnvironmentPlugin,
196+
f(
197+
{ name: 'client', config: overrideEnvConfig },
198+
createGetEnvironment('client'),
199+
),
200+
]
178201
}
179-
return perEnvironmentPlugin(name, f)
202+
return [
203+
getEnvironmentPlugin,
204+
{
205+
name,
206+
applyToEnvironment(environment) {
207+
return f(environment, createGetEnvironment(environment.name))
208+
},
209+
},
210+
]
180211
}
181212

182213
export function oxcResolvePlugin(
@@ -188,20 +219,27 @@ export function oxcResolvePlugin(
188219
? [optimizerResolvePlugin(resolveOptions)]
189220
: []),
190221
importGlobSubpathImportsResolvePlugin(resolveOptions),
191-
perEnvironmentOrWorkerPlugin(
222+
...perEnvironmentOrWorkerPlugin(
192223
'vite:resolve-builtin',
193224
overrideEnvConfig,
194-
(env) => {
195-
const environment = env as Environment
225+
(partialEnv, getEnv) => {
196226
// The resolve plugin is used for createIdResolver and the depsOptimizer should be
197227
// disabled in that case, so deps optimization is opt-in when creating the plugin.
198-
const depsOptimizer =
199-
resolveOptions.optimizeDeps && environment?.mode === 'dev'
200-
? environment.depsOptimizer
201-
: undefined
228+
const depsOptimizerEnabled =
229+
resolveOptions.optimizeDeps &&
230+
!resolveOptions.isBuild &&
231+
!isDepOptimizationDisabled(partialEnv.config.optimizeDeps)
232+
const getDepsOptimizer = () => {
233+
const env = getEnv()
234+
if (env.mode !== 'dev')
235+
throw new Error('The environment mode should be dev')
236+
if (!env.depsOptimizer)
237+
throw new Error('The environment should have a depsOptimizer')
238+
return env.depsOptimizer
239+
}
202240

203241
const options: InternalResolveOptions = {
204-
...environment.config.resolve,
242+
...partialEnv.config.resolve,
205243
...resolveOptions, // plugin options + resolve options overrides
206244
}
207245
const noExternal =
@@ -229,15 +267,16 @@ export function oxcResolvePlugin(
229267
tryPrefix: options.tryPrefix,
230268
preserveSymlinks: options.preserveSymlinks,
231269
},
232-
environmentConsumer: environment.config.consumer,
233-
environmentName: environment.name,
234-
builtins: environment.config.resolve.builtins,
270+
environmentConsumer: partialEnv.config.consumer,
271+
environmentName: partialEnv.name,
272+
builtins: partialEnv.config.resolve.builtins,
235273
external: options.external,
236274
noExternal: noExternal,
237275
dedupe: options.dedupe,
238-
finalizeBareSpecifier: !depsOptimizer
276+
finalizeBareSpecifier: !depsOptimizerEnabled
239277
? undefined
240278
: (resolvedId, rawId, importer) => {
279+
const depsOptimizer = getDepsOptimizer()
241280
// if we reach here, it's a valid dep import that hasn't been optimized.
242281
const isJsType = isOptimizable(
243282
resolvedId,
@@ -283,9 +322,10 @@ export function oxcResolvePlugin(
283322
}
284323
return newId
285324
},
286-
finalizeOtherSpecifiers: !depsOptimizer
325+
finalizeOtherSpecifiers: !depsOptimizerEnabled
287326
? undefined
288327
: (resolvedId, rawId) => {
328+
const depsOptimizer = getDepsOptimizer()
289329
const newResolvedId = ensureVersionQuery(
290330
resolvedId,
291331
rawId,

0 commit comments

Comments
 (0)