Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: avoid optimized deps during build in worker bundles #13275

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"test": "run-s test-unit test-serve test-build",
"test-serve": "vitest run -c vitest.config.e2e.ts",
"test-build": "VITE_TEST_BUILD=1 vitest run -c vitest.config.e2e.ts",
"test-build-without-plugin-commonjs": "VITE_TEST_WITHOUT_PLUGIN_COMMONJS=1 pnpm test-build",
"test-build-optimized-deps": "VITE_TEST_BUILD_OPTIMIZED_DEPS=1 pnpm test-build",
"test-unit": "vitest run",
"test-docs": "pnpm run docs-build",
"debug-serve": "VITE_DEBUG_SERVE=1 vitest run -c vitest.config.e2e.ts",
Expand Down
5 changes: 2 additions & 3 deletions packages/vite/src/node/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -427,10 +427,9 @@ export async function resolveBuildPlugins(config: ResolvedConfig): Promise<{
post: Plugin[]
}> {
const options = config.build
const { commonjsOptions } = options
// We don't use optimized dependencies while bundling workers
const usePluginCommonjs =
!Array.isArray(commonjsOptions?.include) ||
commonjsOptions?.include.length !== 0
!isDepsOptimizerEnabled(config, !!config.build.ssr) || config.isWorker
const rollupOptionsPlugins = options.rollupOptions.plugins
return {
pre: [
Expand Down
4 changes: 1 addition & 3 deletions packages/vite/src/node/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -457,13 +457,11 @@ export async function resolveConfig(
const userPlugins = [...prePlugins, ...normalPlugins, ...postPlugins]
config = await runConfigHook(config, userPlugins, configEnv)

if (process.env.VITE_TEST_WITHOUT_PLUGIN_COMMONJS) {
if (process.env.VITE_TEST_BUILD_OPTIMIZED_DEPS) {
config = mergeConfig(config, {
optimizeDeps: { disabled: false },
ssr: { optimizeDeps: { disabled: false } },
})
config.build ??= {}
config.build.commonjsOptions = { include: [] }
}

// Define logger
Expand Down
1 change: 0 additions & 1 deletion packages/vite/src/node/optimizer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ export interface DepsOptimizer {
isOptimizedDepUrl: (url: string) => boolean
getOptimizedDepId: (depInfo: OptimizedDepInfo) => string
delayDepsOptimizerUntil: (id: string, done: () => Promise<any>) => void
registerWorkersSource: (id: string) => void
resetRegisteredIds: () => void
ensureFirstRun: () => void

Expand Down
33 changes: 5 additions & 28 deletions packages/vite/src/node/optimizer/optimizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,8 @@ export function getDepsOptimizer(
config: ResolvedConfig,
ssr?: boolean,
): DepsOptimizer | undefined {
// Workers compilation shares the DepsOptimizer from the main build
const isDevSsr = ssr && config.command !== 'build'
return (isDevSsr ? devSsrDepsOptimizerMap : depsOptimizerMap).get(
config.mainConfig || config,
)
return (isDevSsr ? devSsrDepsOptimizerMap : depsOptimizerMap).get(config)
}

export async function initDepsOptimizer(
Expand Down Expand Up @@ -114,7 +111,6 @@ async function createDepsOptimizer(
isOptimizedDepUrl: createIsOptimizedDepUrl(config),
getOptimizedDepId: (depInfo: OptimizedDepInfo) =>
isBuild ? depInfo.file : `${depInfo.file}?v=${depInfo.browserHash}`,
registerWorkersSource,
delayDepsOptimizerUntil,
resetRegisteredIds,
ensureFirstRun,
Expand Down Expand Up @@ -702,9 +698,6 @@ async function createDepsOptimizer(
crawlEndFinder = setupOnCrawlEnd(onCrawlEnd)
}

function registerWorkersSource(id: string) {
crawlEndFinder?.registerWorkersSource(id)
}
function delayDepsOptimizerUntil(id: string, done: () => Promise<any>) {
if (crawlEndFinder && !depsOptimizer.isOptimizedDepFile(id)) {
crawlEndFinder.delayDepsOptimizerUntil(id, done)
Expand All @@ -719,15 +712,13 @@ const callCrawlEndIfIdleAfterMs = 50

interface CrawlEndFinder {
ensureFirstRun: () => void
registerWorkersSource: (id: string) => void
delayDepsOptimizerUntil: (id: string, done: () => Promise<any>) => void
cancel: () => void
}

function setupOnCrawlEnd(onCrawlEnd: () => void): CrawlEndFinder {
const registeredIds = new Set<string>()
const seenIds = new Set<string>()
const workersSources = new Set<string>()
let timeoutHandle: NodeJS.Timeout | undefined

let cancelled = false
Expand Down Expand Up @@ -758,25 +749,13 @@ function setupOnCrawlEnd(onCrawlEnd: () => void): CrawlEndFinder {
firstRunEnsured = true
}

function registerWorkersSource(id: string): void {
workersSources.add(id)

// Avoid waiting for this id, as it may be blocked by the rollup
// bundling process of the worker that also depends on the optimizer
registeredIds.delete(id)

checkIfCrawlEndAfterTimeout()
}

function delayDepsOptimizerUntil(id: string, done: () => Promise<any>): void {
if (!seenIds.has(id)) {
seenIds.add(id)
if (!workersSources.has(id)) {
registeredIds.add(id)
done()
.catch(() => {})
.finally(() => markIdAsDone(id))
}
registeredIds.add(id)
done()
.catch(() => {})
.finally(() => markIdAsDone(id))
}
}
function markIdAsDone(id: string): void {
Expand All @@ -800,7 +779,6 @@ function setupOnCrawlEnd(onCrawlEnd: () => void): CrawlEndFinder {

return {
ensureFirstRun,
registerWorkersSource,
delayDepsOptimizerUntil,
cancel,
}
Expand All @@ -826,7 +804,6 @@ async function createDevSsrDepsOptimizer(
// noop, there is no scanning during dev SSR
// the optimizer blocks the server start
run: () => {},
registerWorkersSource: (id: string) => {},
delayDepsOptimizerUntil: (id: string, done: () => Promise<any>) => {},
resetRegisteredIds: () => {},
ensureFirstRun: () => {},
Expand Down
27 changes: 18 additions & 9 deletions packages/vite/src/node/plugins/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,25 @@ export async function resolvePlugins(
? await (await import('../build')).resolveBuildPlugins(config)
: { pre: [], post: [] }
const { modulePreload } = config.build

let depsOptimizerPlugin
if (isBuild) {
if (
isDepsOptimizerEnabled(config, !!config.build.ssr) &&
!config.isWorker
) {
depsOptimizerPlugin = optimizedDepsBuildPlugin(config)
}
} else {
// dev
if (
isDepsOptimizerEnabled(config, false) ||
isDepsOptimizerEnabled(config, true)
) {
depsOptimizerPlugin = optimizedDepsPlugin(config)
}
}
return [
...(isDepsOptimizerEnabled(config, false) ||
isDepsOptimizerEnabled(config, true)
? [
isBuild
? optimizedDepsBuildPlugin(config)
: optimizedDepsPlugin(config),
]
: []),
...(depsOptimizerPlugin ? [depsOptimizerPlugin] : []),
isWatch ? ensureWatchPlugin() : null,
isBuild ? metadataPlugin() : null,
watchPackageDataPlugin(config.packageCache),
Expand Down
3 changes: 0 additions & 3 deletions packages/vite/src/node/plugins/worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {
onRollupWarning,
toOutputFilePathInJS,
} from '../build'
import { getDepsOptimizer } from '../optimizer'
import { fileToUrl } from './asset'

interface WorkerCache {
Expand Down Expand Up @@ -247,7 +246,6 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
},

async transform(raw, id, options) {
const ssr = options?.ssr === true
const query = parseRequest(id)
if (query && query[WORKER_FILE_ID] != null) {
// if import worker by worker constructor will have query.type
Expand Down Expand Up @@ -294,7 +292,6 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
const workerOptions = workerType === 'classic' ? '' : ',{type: "module"}'

if (isBuild) {
getDepsOptimizer(config, ssr)?.registerWorkersSource(id)
if (query.inline != null) {
const chunk = await bundleWorkerEntry(config, id, query)
const encodedJs = `const encodedJs = "${Buffer.from(
Expand Down
3 changes: 0 additions & 3 deletions packages/vite/src/node/plugins/workerImportMetaUrl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import {
slash,
transformStableResult,
} from '../utils'
import { getDepsOptimizer } from '../optimizer'
import type { ResolveFn } from '..'
import type { WorkerType } from './worker'
import { WORKER_FILE_ID, workerFileToUrl } from './worker'
Expand Down Expand Up @@ -115,7 +114,6 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
name: 'vite:worker-import-meta-url',

async transform(code, id, options) {
const ssr = options?.ssr === true
if (
!options?.ssr &&
(code.includes('new Worker') || code.includes('new SharedWorker')) &&
Expand Down Expand Up @@ -171,7 +169,6 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {

let builtUrl: string
if (isBuild) {
getDepsOptimizer(config, ssr)?.registerWorkersSource(id)
builtUrl = await workerFileToUrl(config, file, query)
} else {
builtUrl = await fileToUrl(cleanUrl(file), config, this)
Expand Down