diff --git a/packages/vite/src/node/__tests__/plugins/fixtures/worker-url/entry.js b/packages/vite/src/node/__tests__/plugins/fixtures/worker-url/entry.js new file mode 100644 index 00000000000000..be5e130714116b --- /dev/null +++ b/packages/vite/src/node/__tests__/plugins/fixtures/worker-url/entry.js @@ -0,0 +1,2 @@ +import workerUrl from './worker?worker&url' +console.log(workerUrl) diff --git a/packages/vite/src/node/__tests__/plugins/fixtures/worker-url/worker.js b/packages/vite/src/node/__tests__/plugins/fixtures/worker-url/worker.js new file mode 100644 index 00000000000000..28771be77b65d6 --- /dev/null +++ b/packages/vite/src/node/__tests__/plugins/fixtures/worker-url/worker.js @@ -0,0 +1,3 @@ +/* global self */ +const msg = 'hello from worker' +self.postMessage(msg) diff --git a/packages/vite/src/node/__tests__/plugins/worker.spec.ts b/packages/vite/src/node/__tests__/plugins/worker.spec.ts new file mode 100644 index 00000000000000..7fc52aa7f6c608 --- /dev/null +++ b/packages/vite/src/node/__tests__/plugins/worker.spec.ts @@ -0,0 +1,47 @@ +import { resolve } from 'node:path' +import { expect, test } from 'vitest' +import type { OutputChunk, RolldownOutput } from 'rolldown' +import { build } from '../../build' + +const fixturesDir = resolve(import.meta.dirname, 'fixtures') + +test('?worker&url should produce the same hash in client and SSR builds', async () => { + const root = resolve(fixturesDir, 'worker-url') + + const clientResult = (await build({ + root, + logLevel: 'silent', + build: { + write: false, + rolldownOptions: { + input: resolve(root, 'entry.js'), + }, + }, + })) as RolldownOutput + + const ssrResult = (await build({ + root, + logLevel: 'silent', + build: { + write: false, + ssr: resolve(root, 'entry.js'), + }, + })) as RolldownOutput + + // Extract the worker URL from both builds. + // The entry chunk will contain the worker asset URL as a string. + const clientEntry = clientResult.output.find( + (o): o is OutputChunk => o.type === 'chunk' && o.isEntry, + )! + const ssrEntry = ssrResult.output.find( + (o): o is OutputChunk => o.type === 'chunk' && o.isEntry, + )! + + const workerUrlPattern = /assets\/worker-[\w-]+\.js/g + const clientWorkerUrls = clientEntry.code.match(workerUrlPattern) ?? [] + const ssrWorkerUrls = ssrEntry.code.match(workerUrlPattern) ?? [] + + expect(clientWorkerUrls.length).toBeGreaterThan(0) + expect(ssrWorkerUrls.length).toBeGreaterThan(0) + expect(ssrWorkerUrls).toEqual(clientWorkerUrls) +}) diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts index 579cc1ad4f96d1..84aa8cb71cc136 100644 --- a/packages/vite/src/node/plugins/worker.ts +++ b/packages/vite/src/node/plugins/worker.ts @@ -228,14 +228,14 @@ async function bundleWorkerEntry( '[name]-[hash].[ext]', ), minify: - config.build.minify === 'oxc' + workerEnvironment.config.build.minify === 'oxc' ? true - : config.build.minify === false + : workerEnvironment.config.build.minify === false ? 'dce-only' : undefined, ...workerConfig, format, - sourcemap: config.build.sourcemap, + sourcemap: workerEnvironment.config.build.sourcemap, }) watchedFiles = (await bundle.watchFiles).map((f) => normalizePath(f)) } catch (e) {