diff --git a/packages/playground/vue/Main.vue b/packages/playground/vue/Main.vue
index d10ae401f7aa8e..87319acdf6f736 100644
--- a/packages/playground/vue/Main.vue
+++ b/packages/playground/vue/Main.vue
@@ -20,6 +20,7 @@
+
diff --git a/packages/playground/vue/workerTest.js b/packages/playground/vue/workerTest.js
new file mode 100644
index 00000000000000..fcde5e19b30677
--- /dev/null
+++ b/packages/playground/vue/workerTest.js
@@ -0,0 +1 @@
+self.postMessage('worker load!')
diff --git a/packages/playground/worker/index.html b/packages/playground/worker/index.html
index 60289ff84d6a06..fb4b3e9e85bfc8 100644
--- a/packages/playground/worker/index.html
+++ b/packages/playground/worker/index.html
@@ -1,3 +1,8 @@
+
worker template error match:
+
+ const worker = new Worker(new URL('./worker.js', import.meta.url))
+
+
Expected values:
diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts
index 6b4d38836b6c51..d898b090fcdf6c 100644
--- a/packages/vite/src/node/build.ts
+++ b/packages/vite/src/node/build.ts
@@ -19,7 +19,6 @@ import type {
} from 'rollup'
import type Rollup from 'rollup'
import { buildReporterPlugin } from './plugins/reporter'
-import { buildHtmlPlugin } from './plugins/html'
import { buildEsbuildPlugin } from './plugins/esbuild'
import { terserPlugin } from './plugins/terser'
import type { Terser } from 'types/terser'
@@ -310,7 +309,6 @@ export function resolveBuildPlugins(config: ResolvedConfig): {
return {
pre: [
watchPackageDataPlugin(config),
- buildHtmlPlugin(config),
commonjsPlugin(options.commonjsOptions),
dataURIPlugin(),
dynamicImportVars(options.dynamicImportVarsOptions),
diff --git a/packages/vite/src/node/plugins/assetImportMetaUrl.ts b/packages/vite/src/node/plugins/assetImportMetaUrl.ts
index b0c59bed808604..a3f8e441b0f933 100644
--- a/packages/vite/src/node/plugins/assetImportMetaUrl.ts
+++ b/packages/vite/src/node/plugins/assetImportMetaUrl.ts
@@ -3,7 +3,12 @@ import MagicString from 'magic-string'
import path from 'path'
import { fileToUrl } from './asset'
import type { ResolvedConfig } from '../config'
-import { multilineCommentsRE, singlelineCommentsRE } from '../utils'
+import {
+ multilineCommentsRE,
+ singlelineCommentsRE,
+ stringsRE,
+ blankReplacer
+} from '../utils'
/**
* Convert `new URL('./foo.png', import.meta.url)` to its resolved built URL
@@ -27,12 +32,18 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
const importMetaUrlRE =
/\bnew\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*,?\s*\)/g
const noCommentsCode = code
- .replace(multilineCommentsRE, (m) => ' '.repeat(m.length))
- .replace(singlelineCommentsRE, (m) => ' '.repeat(m.length))
+ .replace(multilineCommentsRE, blankReplacer)
+ .replace(singlelineCommentsRE, blankReplacer)
+ .replace(stringsRE, (m) => `'${'\0'.repeat(m.length - 2)}'`)
+
let s: MagicString | null = null
let match: RegExpExecArray | null
while ((match = importMetaUrlRE.exec(noCommentsCode))) {
- const { 0: exp, 1: rawUrl, index } = match
+ const { 0: exp, 1: emptyUrl, index } = match
+
+ const urlStart = exp.indexOf(emptyUrl) + index
+ const urlEnd = urlStart + emptyUrl.length
+ const rawUrl = code.slice(urlStart, urlEnd)
if (!s) s = new MagicString(code)
diff --git a/packages/vite/src/node/plugins/index.ts b/packages/vite/src/node/plugins/index.ts
index 825798a73c8493..d294233b92ae17 100644
--- a/packages/vite/src/node/plugins/index.ts
+++ b/packages/vite/src/node/plugins/index.ts
@@ -9,7 +9,7 @@ import { importAnalysisPlugin } from './importAnalysis'
import { cssPlugin, cssPostPlugin } from './css'
import { assetPlugin } from './asset'
import { clientInjectionsPlugin } from './clientInjections'
-import { htmlInlineProxyPlugin } from './html'
+import { buildHtmlPlugin, htmlInlineProxyPlugin } from './html'
import { wasmPlugin } from './wasm'
import { modulePreloadPolyfillPlugin } from './modulePreloadPolyfill'
import { webWorkerPlugin } from './worker'
@@ -61,12 +61,13 @@ export async function resolvePlugins(
),
wasmPlugin(config),
webWorkerPlugin(config),
- workerImportMetaUrlPlugin(config),
assetPlugin(config),
...normalPlugins,
definePlugin(config),
cssPostPlugin(config),
config.build.ssr ? ssrRequireHookPlugin(config) : null,
+ isBuild && buildHtmlPlugin(config),
+ workerImportMetaUrlPlugin(config),
...buildPlugins.pre,
...postPlugins,
...buildPlugins.post,
diff --git a/packages/vite/src/node/plugins/workerImportMetaUrl.ts b/packages/vite/src/node/plugins/workerImportMetaUrl.ts
index 233d83d066bcb7..4b5711cf3a6248 100644
--- a/packages/vite/src/node/plugins/workerImportMetaUrl.ts
+++ b/packages/vite/src/node/plugins/workerImportMetaUrl.ts
@@ -7,7 +7,8 @@ import {
cleanUrl,
injectQuery,
multilineCommentsRE,
- singlelineCommentsRE
+ singlelineCommentsRE,
+ stringsRE
} from '../utils'
import path from 'path'
import { bundleWorkerEntry } from './worker'
@@ -122,12 +123,21 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
const noCommentsCode = code
.replace(multilineCommentsRE, blankReplacer)
.replace(singlelineCommentsRE, blankReplacer)
+
+ const noStringCode = noCommentsCode.replace(
+ stringsRE,
+ (m) => `'${' '.repeat(m.length - 2)}'`
+ )
let match: RegExpExecArray | null
let s: MagicString | null = null
- while ((match = importMetaUrlRE.exec(noCommentsCode))) {
- const { 0: allExp, 2: exp, 3: rawUrl, index } = match
+ while ((match = importMetaUrlRE.exec(noStringCode))) {
+ const { 0: allExp, 2: exp, 3: emptyUrl, index } = match
const urlIndex = allExp.indexOf(exp) + index
+ const urlStart = allExp.indexOf(emptyUrl) + index
+ const urlEnd = urlStart + emptyUrl.length
+ const rawUrl = code.slice(urlStart, urlEnd)
+
if (options?.ssr) {
this.error(
`\`new URL(url, import.meta.url)\` is not supported in SSR.`,
diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts
index edb3410751868a..0e3fe49c9cb584 100644
--- a/packages/vite/src/node/utils.ts
+++ b/packages/vite/src/node/utils.ts
@@ -732,3 +732,4 @@ export function parseRequest(id: string): Record | null {
}
export const blankReplacer = (match: string) => ' '.repeat(match.length)
+export const stringsRE = /"[^"]*"|'[^']*'|`[^`]*`/g