From 23bdec6969b9666b800e0ebeb9e9b3a6ed05ef98 Mon Sep 17 00:00:00 2001 From: "Mr.Hope" Date: Mon, 8 May 2023 22:19:42 +0800 Subject: [PATCH] perf(shared): reduce regexp match usage (#1315) --- packages/shared/src/utils/ensureEndingSlash.ts | 2 +- packages/shared/src/utils/ensureLeadingSlash.ts | 2 +- packages/shared/src/utils/removeEndingSlash.ts | 3 ++- packages/shared/src/utils/removeLeadingSlash.ts | 2 +- packages/shared/src/utils/resolveRoutePathFromUrl.ts | 12 ++++++++---- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/shared/src/utils/ensureEndingSlash.ts b/packages/shared/src/utils/ensureEndingSlash.ts index f058fbf12e..678f3eeefc 100644 --- a/packages/shared/src/utils/ensureEndingSlash.ts +++ b/packages/shared/src/utils/ensureEndingSlash.ts @@ -2,4 +2,4 @@ * Ensure a url string to have ending slash / */ export const ensureEndingSlash = (str: string): string => - /(\.html|\/)$/.test(str) ? str : str + '/' + str[str.length - 1] === '/' || str.endsWith('.html') ? str : `${str}/` diff --git a/packages/shared/src/utils/ensureLeadingSlash.ts b/packages/shared/src/utils/ensureLeadingSlash.ts index b2446b63c3..1d574a86b4 100644 --- a/packages/shared/src/utils/ensureLeadingSlash.ts +++ b/packages/shared/src/utils/ensureLeadingSlash.ts @@ -2,4 +2,4 @@ * Ensure a url string to have leading slash / */ export const ensureLeadingSlash = (str: string): string => - str.replace(/^\/?/, '/') + str[0] === '/' ? str : `/${str}` diff --git a/packages/shared/src/utils/removeEndingSlash.ts b/packages/shared/src/utils/removeEndingSlash.ts index a8ab2a8c05..38c12f8fe4 100644 --- a/packages/shared/src/utils/removeEndingSlash.ts +++ b/packages/shared/src/utils/removeEndingSlash.ts @@ -1,4 +1,5 @@ /** * Remove ending slash / from a string */ -export const removeEndingSlash = (str: string): string => str.replace(/\/$/, '') +export const removeEndingSlash = (str: string): string => + str[str.length - 1] === '/' ? str.slice(0, -1) : str diff --git a/packages/shared/src/utils/removeLeadingSlash.ts b/packages/shared/src/utils/removeLeadingSlash.ts index 1fb2a9a949..227c1dff5f 100644 --- a/packages/shared/src/utils/removeLeadingSlash.ts +++ b/packages/shared/src/utils/removeLeadingSlash.ts @@ -2,4 +2,4 @@ * Remove leading slash / from a string */ export const removeLeadingSlash = (str: string): string => - str.replace(/^\//, '') + str[0] === '/' ? str.slice(1) : str diff --git a/packages/shared/src/utils/resolveRoutePathFromUrl.ts b/packages/shared/src/utils/resolveRoutePathFromUrl.ts index 3781f0828c..da25efd99c 100644 --- a/packages/shared/src/utils/resolveRoutePathFromUrl.ts +++ b/packages/shared/src/utils/resolveRoutePathFromUrl.ts @@ -1,6 +1,10 @@ -export const resolveRoutePathFromUrl = (url: string, base = '/'): string => - url +export const resolveRoutePathFromUrl = (url: string, base = '/'): string => { + const pathname = url // remove url origin .replace(/^(https?:)?\/\/[^/]*/, '') - // remove site base - .replace(new RegExp(`^${base}`), '/') + + // remove site base + return pathname.startsWith(base) + ? `/${pathname.slice(base.length)}` + : pathname +}