]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor: small bundle size / readability optimization
authorEvan You <yyx990803@gmail.com>
Wed, 23 Jun 2021 21:20:38 +0000 (17:20 -0400)
committerEvan You <yyx990803@gmail.com>
Fri, 16 Jul 2021 18:30:49 +0000 (14:30 -0400)
packages/reactivity/src/effect.ts
packages/reactivity/src/ref.ts

index ed29a267c801bdfcded89daccbc89fab89b5c074..df74769e14b4e1b85fd401336811c16a4f315cbb 100644 (file)
@@ -1,5 +1,5 @@
 import { TrackOpTypes, TriggerOpTypes } from './operations'
-import { EMPTY_OBJ, isArray, isIntegerKey, isMap } from '@vue/shared'
+import { EMPTY_OBJ, extend, isArray, isIntegerKey, isMap } from '@vue/shared'
 
 // The main WeakMap that stores {target -> key -> dep} connections.
 // Conceptually, it's easier to think of a dependency as a Dep class
@@ -212,47 +212,47 @@ export function trigger(
     return
   }
 
-  let sets: DepSets = []
+  let deps: (Dep | undefined)[] = []
   if (type === TriggerOpTypes.CLEAR) {
     // collection being cleared
     // trigger all effects for target
-    sets = [...depsMap.values()]
+    deps = [...depsMap.values()]
   } else if (key === 'length' && isArray(target)) {
     depsMap.forEach((dep, key) => {
       if (key === 'length' || key >= (newValue as number)) {
-        sets.push(dep)
+        deps.push(dep)
       }
     })
   } else {
     // schedule runs for SET | ADD | DELETE
     if (key !== void 0) {
-      sets.push(depsMap.get(key))
+      deps.push(depsMap.get(key))
     }
 
     // also run for iteration key on ADD | DELETE | Map.SET
     switch (type) {
       case TriggerOpTypes.ADD:
         if (!isArray(target)) {
-          sets.push(depsMap.get(ITERATE_KEY))
+          deps.push(depsMap.get(ITERATE_KEY))
           if (isMap(target)) {
-            sets.push(depsMap.get(MAP_KEY_ITERATE_KEY))
+            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY))
           }
         } else if (isIntegerKey(key)) {
           // new index added to array -> length changes
-          sets.push(depsMap.get('length'))
+          deps.push(depsMap.get('length'))
         }
         break
       case TriggerOpTypes.DELETE:
         if (!isArray(target)) {
-          sets.push(depsMap.get(ITERATE_KEY))
+          deps.push(depsMap.get(ITERATE_KEY))
           if (isMap(target)) {
-            sets.push(depsMap.get(MAP_KEY_ITERATE_KEY))
+            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY))
           }
         }
         break
       case TriggerOpTypes.SET:
         if (isMap(target)) {
-          sets.push(depsMap.get(ITERATE_KEY))
+          deps.push(depsMap.get(ITERATE_KEY))
         }
         break
     }
@@ -261,51 +261,37 @@ export function trigger(
   const eventInfo = __DEV__
     ? { target, type, key, newValue, oldValue, oldTarget }
     : undefined
-  triggerMultiEffects(sets, eventInfo)
-}
-
-type DepSets = (Dep | undefined)[]
 
-export function triggerMultiEffects(
-  depSets: DepSets,
-  debuggerEventExtraInfo?: DebuggerEventExtraInfo
-) {
-  if (depSets.length === 1) {
-    if (depSets[0]) {
-      triggerEffects(depSets[0], debuggerEventExtraInfo)
+  if (deps.length === 1) {
+    if (deps[0]) {
+      triggerEffects(deps[0], eventInfo)
     }
   } else {
-    const sets = depSets.filter(s => !!s) as Dep[]
-    triggerEffects(concatSets(sets), debuggerEventExtraInfo)
+    const effects: ReactiveEffect[] = []
+    for (const dep of deps) {
+      if (dep) {
+        effects.push(...dep)
+      }
+    }
+    triggerEffects(new Set(effects), eventInfo)
   }
 }
 
-function concatSets<T>(sets: Set<T>[]): Set<T> {
-  const all = ([] as T[]).concat(...sets.map(s => [...s!]))
-  return new Set(all)
-}
-
 export function triggerEffects(
   dep: Dep,
   debuggerEventExtraInfo?: DebuggerEventExtraInfo
 ) {
-  const run = (effect: ReactiveEffect) => {
-    if (__DEV__ && effect.options.onTrigger) {
-      effect.options.onTrigger(
-        Object.assign({ effect }, debuggerEventExtraInfo)
-      )
-    }
-    if (effect.options.scheduler) {
-      effect.options.scheduler(effect)
-    } else {
-      effect()
-    }
-  }
-
-  const immutableDeps = [...dep]
-  immutableDeps.forEach(effect => {
+  // spread into array for stabilization
+  for (const effect of [...dep]) {
     if (effect !== activeEffect || effect.allowRecurse) {
-      run(effect)
+      if (__DEV__ && effect.options.onTrigger) {
+        effect.options.onTrigger(extend({ effect }, debuggerEventExtraInfo))
+      }
+      if (effect.options.scheduler) {
+        effect.options.scheduler(effect)
+      } else {
+        effect()
+      }
     }
-  })
+  }
 }
index 3d7e2388a565797da42e0b53673f93e08796c112..b88fb8be2bea9f5821aab297c64fc0562f99b492 100644 (file)
@@ -38,28 +38,34 @@ type RefBase<T> = {
 export function trackRefValue(ref: RefBase<any>) {
   if (isTracking()) {
     ref = toRaw(ref)
-    const eventInfo = __DEV__
-      ? { target: ref, type: TrackOpTypes.GET, key: 'value' }
-      : undefined
     if (!ref.dep) {
       ref.dep = new Set<ReactiveEffect>()
     }
-    trackEffects(ref.dep, eventInfo)
+    if (__DEV__) {
+      trackEffects(ref.dep, {
+        target: ref,
+        type: TrackOpTypes.GET,
+        key: 'value'
+      })
+    } else {
+      trackEffects(ref.dep)
+    }
   }
 }
 
 export function triggerRefValue(ref: RefBase<any>, newVal?: any) {
   ref = toRaw(ref)
   if (ref.dep) {
-    const eventInfo = __DEV__
-      ? {
-          target: ref,
-          type: TriggerOpTypes.SET,
-          key: 'value',
-          newValue: newVal
-        }
-      : undefined
-    triggerEffects(ref.dep, eventInfo)
+    if (__DEV__) {
+      triggerEffects(ref.dep, {
+        target: ref,
+        type: TriggerOpTypes.SET,
+        key: 'value',
+        newValue: newVal
+      })
+    } else {
+      triggerEffects(ref.dep)
+    }
   }
 }