From 8db1141a5330c1c83dc6a2111cd9652f8d952f21 Mon Sep 17 00:00:00 2001 From: patak Date: Mon, 20 Mar 2023 20:45:00 +0100 Subject: [PATCH 1/4] perf: extract regex in assetImportMetaURL plugin --- packages/vite/src/node/plugins/assetImportMetaUrl.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/assetImportMetaUrl.ts b/packages/vite/src/node/plugins/assetImportMetaUrl.ts index 00aa1c466c406b..86e32f7ed40b14 100644 --- a/packages/vite/src/node/plugins/assetImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/assetImportMetaUrl.ts @@ -13,6 +13,11 @@ import { import { fileToUrl } from './asset' import { preloadHelperId } from './importAnalysisBuild' +const assetImportMetaUrlRE = + /\bnew\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*(?:,\s*)?\)/g + +const placeholderRE = /\$\{/ + /** * Convert `new URL('./foo.png', import.meta.url)` to its resolved built URL * @@ -37,11 +42,10 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin { code.includes(`import.meta.url`) ) { let s: MagicString | undefined - const assetImportMetaUrlRE = - /\bnew\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*(?:,\s*)?\)/g const cleanString = stripLiteral(code) let match: RegExpExecArray | null + assetImportMetaUrlRE.lastIndex = 0 while ((match = assetImportMetaUrlRE.exec(cleanString))) { const { 0: exp, 1: emptyUrl, index } = match @@ -52,7 +56,7 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin { if (!s) s = new MagicString(code) // potential dynamic template string - if (rawUrl[0] === '`' && /\$\{/.test(rawUrl)) { + if (rawUrl[0] === '`' && placeholderRE.test(rawUrl)) { const ast = this.parse(rawUrl) const templateLiteral = (ast as any).body[0].expression if (templateLiteral.expressions.length) { From 70be30e965e8bd96a16086ac361f07c2836c2957 Mon Sep 17 00:00:00 2001 From: patak Date: Tue, 21 Mar 2023 18:04:04 +0100 Subject: [PATCH 2/4] chore: update --- packages/vite/src/node/plugins/assetImportMetaUrl.ts | 4 +--- packages/vite/src/node/plugins/workerImportMetaUrl.ts | 8 +++++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/node/plugins/assetImportMetaUrl.ts b/packages/vite/src/node/plugins/assetImportMetaUrl.ts index 86e32f7ed40b14..9026c763cf2ff3 100644 --- a/packages/vite/src/node/plugins/assetImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/assetImportMetaUrl.ts @@ -16,8 +16,6 @@ import { preloadHelperId } from './importAnalysisBuild' const assetImportMetaUrlRE = /\bnew\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*(?:,\s*)?\)/g -const placeholderRE = /\$\{/ - /** * Convert `new URL('./foo.png', import.meta.url)` to its resolved built URL * @@ -56,7 +54,7 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin { if (!s) s = new MagicString(code) // potential dynamic template string - if (rawUrl[0] === '`' && placeholderRE.test(rawUrl)) { + if (rawUrl[0] === '`' && rawUrl.includes('${')) { const ast = this.parse(rawUrl) const templateLiteral = (ast as any).body[0].expression if (templateLiteral.expressions.length) { diff --git a/packages/vite/src/node/plugins/workerImportMetaUrl.ts b/packages/vite/src/node/plugins/workerImportMetaUrl.ts index 37ccc8a015283b..706660b7a82e32 100644 --- a/packages/vite/src/node/plugins/workerImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/workerImportMetaUrl.ts @@ -20,6 +20,9 @@ import { fileToUrl } from './asset' const ignoreFlagRE = /\/\*\s*@vite-ignore\s*\*\// +const workerImportMetaUrlRE = + /\bnew\s+(?:Worker|SharedWorker)\s*\(\s*(new\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*\))/g + interface WorkerOptions { type?: WorkerType } @@ -113,10 +116,9 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { const query = parseRequest(id) let s: MagicString | undefined const cleanString = stripLiteral(code) - const workerImportMetaUrlRE = - /\bnew\s+(?:Worker|SharedWorker)\s*\(\s*(new\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*\))/g let match: RegExpExecArray | null + workerImportMetaUrlRE.lastIndex = 0 while ((match = workerImportMetaUrlRE.exec(cleanString))) { const { 0: allExp, 1: exp, 2: emptyUrl, index } = match const urlIndex = allExp.indexOf(exp) + index @@ -126,7 +128,7 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { const rawUrl = code.slice(urlStart, urlEnd) // potential dynamic template string - if (rawUrl[0] === '`' && /\$\{/.test(rawUrl)) { + if (rawUrl[0] === '`' && rawUrl.includes('${')) { this.error( `\`new URL(url, import.meta.url)\` is not supported in dynamic template string.`, urlIndex, From 4918d7d5d07055be0a51a8f8b61e1b8db3eb013b Mon Sep 17 00:00:00 2001 From: patak Date: Tue, 21 Mar 2023 19:53:42 +0100 Subject: [PATCH 3/4] chore: update --- packages/vite/src/node/plugins/assetImportMetaUrl.ts | 7 +++---- packages/vite/src/node/plugins/workerImportMetaUrl.ts | 6 ++---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/vite/src/node/plugins/assetImportMetaUrl.ts b/packages/vite/src/node/plugins/assetImportMetaUrl.ts index 9026c763cf2ff3..c9cd4fb64ad951 100644 --- a/packages/vite/src/node/plugins/assetImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/assetImportMetaUrl.ts @@ -13,9 +13,6 @@ import { import { fileToUrl } from './asset' import { preloadHelperId } from './importAnalysisBuild' -const assetImportMetaUrlRE = - /\bnew\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*(?:,\s*)?\)/g - /** * Convert `new URL('./foo.png', import.meta.url)` to its resolved built URL * @@ -40,10 +37,12 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin { code.includes(`import.meta.url`) ) { let s: MagicString | undefined + const assetImportMetaUrlRE = + /\bnew\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*(?:,\s*)?\)/g const cleanString = stripLiteral(code) let match: RegExpExecArray | null - assetImportMetaUrlRE.lastIndex = 0 + while ((match = assetImportMetaUrlRE.exec(cleanString))) { const { 0: exp, 1: emptyUrl, index } = match diff --git a/packages/vite/src/node/plugins/workerImportMetaUrl.ts b/packages/vite/src/node/plugins/workerImportMetaUrl.ts index 706660b7a82e32..a01e8d6e066003 100644 --- a/packages/vite/src/node/plugins/workerImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/workerImportMetaUrl.ts @@ -20,9 +20,6 @@ import { fileToUrl } from './asset' const ignoreFlagRE = /\/\*\s*@vite-ignore\s*\*\// -const workerImportMetaUrlRE = - /\bnew\s+(?:Worker|SharedWorker)\s*\(\s*(new\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*\))/g - interface WorkerOptions { type?: WorkerType } @@ -116,9 +113,10 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { const query = parseRequest(id) let s: MagicString | undefined const cleanString = stripLiteral(code) + const workerImportMetaUrlRE = + /\bnew\s+(?:Worker|SharedWorker)\s*\(\s*(new\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*\))/g let match: RegExpExecArray | null - workerImportMetaUrlRE.lastIndex = 0 while ((match = workerImportMetaUrlRE.exec(cleanString))) { const { 0: allExp, 1: exp, 2: emptyUrl, index } = match const urlIndex = allExp.indexOf(exp) + index From 7e476cb8754cd7ae52648504d6dd2d5eee08e812 Mon Sep 17 00:00:00 2001 From: patak Date: Tue, 21 Mar 2023 20:03:47 +0100 Subject: [PATCH 4/4] chore: whitespace --- packages/vite/src/node/plugins/assetImportMetaUrl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/vite/src/node/plugins/assetImportMetaUrl.ts b/packages/vite/src/node/plugins/assetImportMetaUrl.ts index c9cd4fb64ad951..215605fa747181 100644 --- a/packages/vite/src/node/plugins/assetImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/assetImportMetaUrl.ts @@ -42,7 +42,6 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin { const cleanString = stripLiteral(code) let match: RegExpExecArray | null - while ((match = assetImportMetaUrlRE.exec(cleanString))) { const { 0: exp, 1: emptyUrl, index } = match