Преглед изворни кода

perf: cache string helpers

Evan You пре 6 година
родитељ
комит
04e11187b9
1 измењених фајлова са 23 додато и 9 уклоњено
  1. 23 9
      packages/shared/src/index.ts

+ 23 - 9
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<T extends (str: string) => string>(fn: T): T {
+  const cache: Record<string, string> = 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 =>