refactor: small bundle size / readability optimization
This commit is contained in:
		
							parent
							
								
									64310405ac
								
							
						
					
					
						commit
						b2554aefba
					
				@ -1,5 +1,5 @@
 | 
				
			|||||||
import { TrackOpTypes, TriggerOpTypes } from './operations'
 | 
					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.
 | 
					// The main WeakMap that stores {target -> key -> dep} connections.
 | 
				
			||||||
// Conceptually, it's easier to think of a dependency as a Dep class
 | 
					// Conceptually, it's easier to think of a dependency as a Dep class
 | 
				
			||||||
@ -212,47 +212,47 @@ export function trigger(
 | 
				
			|||||||
    return
 | 
					    return
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let sets: DepSets = []
 | 
					  let deps: (Dep | undefined)[] = []
 | 
				
			||||||
  if (type === TriggerOpTypes.CLEAR) {
 | 
					  if (type === TriggerOpTypes.CLEAR) {
 | 
				
			||||||
    // collection being cleared
 | 
					    // collection being cleared
 | 
				
			||||||
    // trigger all effects for target
 | 
					    // trigger all effects for target
 | 
				
			||||||
    sets = [...depsMap.values()]
 | 
					    deps = [...depsMap.values()]
 | 
				
			||||||
  } else if (key === 'length' && isArray(target)) {
 | 
					  } else if (key === 'length' && isArray(target)) {
 | 
				
			||||||
    depsMap.forEach((dep, key) => {
 | 
					    depsMap.forEach((dep, key) => {
 | 
				
			||||||
      if (key === 'length' || key >= (newValue as number)) {
 | 
					      if (key === 'length' || key >= (newValue as number)) {
 | 
				
			||||||
        sets.push(dep)
 | 
					        deps.push(dep)
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    // schedule runs for SET | ADD | DELETE
 | 
					    // schedule runs for SET | ADD | DELETE
 | 
				
			||||||
    if (key !== void 0) {
 | 
					    if (key !== void 0) {
 | 
				
			||||||
      sets.push(depsMap.get(key))
 | 
					      deps.push(depsMap.get(key))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // also run for iteration key on ADD | DELETE | Map.SET
 | 
					    // also run for iteration key on ADD | DELETE | Map.SET
 | 
				
			||||||
    switch (type) {
 | 
					    switch (type) {
 | 
				
			||||||
      case TriggerOpTypes.ADD:
 | 
					      case TriggerOpTypes.ADD:
 | 
				
			||||||
        if (!isArray(target)) {
 | 
					        if (!isArray(target)) {
 | 
				
			||||||
          sets.push(depsMap.get(ITERATE_KEY))
 | 
					          deps.push(depsMap.get(ITERATE_KEY))
 | 
				
			||||||
          if (isMap(target)) {
 | 
					          if (isMap(target)) {
 | 
				
			||||||
            sets.push(depsMap.get(MAP_KEY_ITERATE_KEY))
 | 
					            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY))
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        } else if (isIntegerKey(key)) {
 | 
					        } else if (isIntegerKey(key)) {
 | 
				
			||||||
          // new index added to array -> length changes
 | 
					          // new index added to array -> length changes
 | 
				
			||||||
          sets.push(depsMap.get('length'))
 | 
					          deps.push(depsMap.get('length'))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break
 | 
					        break
 | 
				
			||||||
      case TriggerOpTypes.DELETE:
 | 
					      case TriggerOpTypes.DELETE:
 | 
				
			||||||
        if (!isArray(target)) {
 | 
					        if (!isArray(target)) {
 | 
				
			||||||
          sets.push(depsMap.get(ITERATE_KEY))
 | 
					          deps.push(depsMap.get(ITERATE_KEY))
 | 
				
			||||||
          if (isMap(target)) {
 | 
					          if (isMap(target)) {
 | 
				
			||||||
            sets.push(depsMap.get(MAP_KEY_ITERATE_KEY))
 | 
					            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY))
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break
 | 
					        break
 | 
				
			||||||
      case TriggerOpTypes.SET:
 | 
					      case TriggerOpTypes.SET:
 | 
				
			||||||
        if (isMap(target)) {
 | 
					        if (isMap(target)) {
 | 
				
			||||||
          sets.push(depsMap.get(ITERATE_KEY))
 | 
					          deps.push(depsMap.get(ITERATE_KEY))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break
 | 
					        break
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -261,51 +261,37 @@ export function trigger(
 | 
				
			|||||||
  const eventInfo = __DEV__
 | 
					  const eventInfo = __DEV__
 | 
				
			||||||
    ? { target, type, key, newValue, oldValue, oldTarget }
 | 
					    ? { target, type, key, newValue, oldValue, oldTarget }
 | 
				
			||||||
    : undefined
 | 
					    : undefined
 | 
				
			||||||
  triggerMultiEffects(sets, eventInfo)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
type DepSets = (Dep | undefined)[]
 | 
					  if (deps.length === 1) {
 | 
				
			||||||
 | 
					    if (deps[0]) {
 | 
				
			||||||
export function triggerMultiEffects(
 | 
					      triggerEffects(deps[0], eventInfo)
 | 
				
			||||||
  depSets: DepSets,
 | 
					 | 
				
			||||||
  debuggerEventExtraInfo?: DebuggerEventExtraInfo
 | 
					 | 
				
			||||||
) {
 | 
					 | 
				
			||||||
  if (depSets.length === 1) {
 | 
					 | 
				
			||||||
    if (depSets[0]) {
 | 
					 | 
				
			||||||
      triggerEffects(depSets[0], debuggerEventExtraInfo)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    const sets = depSets.filter(s => !!s) as Dep[]
 | 
					    const effects: ReactiveEffect[] = []
 | 
				
			||||||
    triggerEffects(concatSets(sets), debuggerEventExtraInfo)
 | 
					    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(
 | 
					export function triggerEffects(
 | 
				
			||||||
  dep: Dep,
 | 
					  dep: Dep,
 | 
				
			||||||
  debuggerEventExtraInfo?: DebuggerEventExtraInfo
 | 
					  debuggerEventExtraInfo?: DebuggerEventExtraInfo
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
  const run = (effect: ReactiveEffect) => {
 | 
					  // spread into array for stabilization
 | 
				
			||||||
    if (__DEV__ && effect.options.onTrigger) {
 | 
					  for (const effect of [...dep]) {
 | 
				
			||||||
      effect.options.onTrigger(
 | 
					    if (effect !== activeEffect || effect.allowRecurse) {
 | 
				
			||||||
        Object.assign({ effect }, debuggerEventExtraInfo)
 | 
					      if (__DEV__ && effect.options.onTrigger) {
 | 
				
			||||||
      )
 | 
					        effect.options.onTrigger(extend({ effect }, debuggerEventExtraInfo))
 | 
				
			||||||
    }
 | 
					      }
 | 
				
			||||||
    if (effect.options.scheduler) {
 | 
					      if (effect.options.scheduler) {
 | 
				
			||||||
      effect.options.scheduler(effect)
 | 
					        effect.options.scheduler(effect)
 | 
				
			||||||
    } else {
 | 
					      } else {
 | 
				
			||||||
      effect()
 | 
					        effect()
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  const immutableDeps = [...dep]
 | 
					 | 
				
			||||||
  immutableDeps.forEach(effect => {
 | 
					 | 
				
			||||||
    if (effect !== activeEffect || effect.allowRecurse) {
 | 
					 | 
				
			||||||
      run(effect)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -38,28 +38,34 @@ type RefBase<T> = {
 | 
				
			|||||||
export function trackRefValue(ref: RefBase<any>) {
 | 
					export function trackRefValue(ref: RefBase<any>) {
 | 
				
			||||||
  if (isTracking()) {
 | 
					  if (isTracking()) {
 | 
				
			||||||
    ref = toRaw(ref)
 | 
					    ref = toRaw(ref)
 | 
				
			||||||
    const eventInfo = __DEV__
 | 
					 | 
				
			||||||
      ? { target: ref, type: TrackOpTypes.GET, key: 'value' }
 | 
					 | 
				
			||||||
      : undefined
 | 
					 | 
				
			||||||
    if (!ref.dep) {
 | 
					    if (!ref.dep) {
 | 
				
			||||||
      ref.dep = new Set<ReactiveEffect>()
 | 
					      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) {
 | 
					export function triggerRefValue(ref: RefBase<any>, newVal?: any) {
 | 
				
			||||||
  ref = toRaw(ref)
 | 
					  ref = toRaw(ref)
 | 
				
			||||||
  if (ref.dep) {
 | 
					  if (ref.dep) {
 | 
				
			||||||
    const eventInfo = __DEV__
 | 
					    if (__DEV__) {
 | 
				
			||||||
      ? {
 | 
					      triggerEffects(ref.dep, {
 | 
				
			||||||
          target: ref,
 | 
					        target: ref,
 | 
				
			||||||
          type: TriggerOpTypes.SET,
 | 
					        type: TriggerOpTypes.SET,
 | 
				
			||||||
          key: 'value',
 | 
					        key: 'value',
 | 
				
			||||||
          newValue: newVal
 | 
					        newValue: newVal
 | 
				
			||||||
        }
 | 
					      })
 | 
				
			||||||
      : undefined
 | 
					    } else {
 | 
				
			||||||
    triggerEffects(ref.dep, eventInfo)
 | 
					      triggerEffects(ref.dep)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user