From dcee6ef08e98548eea262695249134ab7ada0302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Thu, 10 Aug 2023 21:11:42 +0900 Subject: [PATCH] perf: use `URL.canParse` (#14068) --- packages/vite/src/node/plugins/html.ts | 4 ++-- packages/vite/src/node/utils.ts | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/vite/src/node/plugins/html.ts b/packages/vite/src/node/plugins/html.ts index 4b00fd1c9c33ad..916abdf9c69f15 100644 --- a/packages/vite/src/node/plugins/html.ts +++ b/packages/vite/src/node/plugins/html.ts @@ -18,10 +18,10 @@ import { getHash, isDataUrl, isExternalUrl, - isUrl, normalizePath, processSrcSet, removeLeadingSlash, + urlCanParse, } from '../utils' import type { ResolvedConfig } from '../config' import { toOutputFilePathInHtml } from '../build' @@ -823,7 +823,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { getPublicAssetFilename(fileHash, config)!, ) - return isUrl(publicAssetPath) + return urlCanParse(publicAssetPath) ? publicAssetPath : normalizePath(publicAssetPath) }) diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 27a619947c0b0d..397369eac7286d 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -191,14 +191,17 @@ function testCaseInsensitiveFS() { return fs.existsSync(CLIENT_ENTRY.replace('client.mjs', 'cLiEnT.mjs')) } -export function isUrl(path: string): boolean { - try { - new URL(path) - return true - } catch { - return false - } -} +export const urlCanParse = + URL.canParse ?? + // URL.canParse is supported from Node.js 18.17.0+, 20.0.0+ + ((path: string, base?: string | undefined): boolean => { + try { + new URL(path, base) + return true + } catch { + return false + } + }) export const isCaseInsensitiveFS = testCaseInsensitiveFS()