From 04e11187b9e9eaddd6199413f7c99d3558df5620 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 16 Dec 2019 13:06:43 -0500 Subject: [PATCH] perf: cache string helpers --- packages/shared/src/index.ts | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 137f38fe..de659619 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -66,19 +66,33 @@ export const isReservedProp = /*#__PURE__*/ makeMap( 'onVnodeBeforeUnmount,onVnodeUnmounted' ) -const camelizeRE = /-(\w)/g -export const camelize = (str: string): string => { - return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : '')) +function cacheStringFunction string>(fn: T): T { + const cache: Record = Object.create(null) + return ((str: string) => { + const hit = cache[str] + return hit || (cache[str] = fn(str)) + }) as any } +const camelizeRE = /-(\w)/g +export const camelize = cacheStringFunction( + (str: string): string => { + return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : '')) + } +) + const hyphenateRE = /\B([A-Z])/g -export const hyphenate = (str: string): string => { - return str.replace(hyphenateRE, '-$1').toLowerCase() -} +export const hyphenate = cacheStringFunction( + (str: string): string => { + return str.replace(hyphenateRE, '-$1').toLowerCase() + } +) -export const capitalize = (str: string): string => { - return str.charAt(0).toUpperCase() + str.slice(1) -} +export const capitalize = cacheStringFunction( + (str: string): string => { + return str.charAt(0).toUpperCase() + str.slice(1) + } +) // compare whether a value has changed, accounting for NaN. export const hasChanged = (value: any, oldValue: any): boolean =>