]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
perf(reactivity): optimize effect stack
authorEvan You <yyx990803@gmail.com>
Sat, 14 Dec 2019 04:06:55 +0000 (23:06 -0500)
committerEvan You <yyx990803@gmail.com>
Sat, 14 Dec 2019 04:06:55 +0000 (23:06 -0500)
packages/reactivity/src/computed.ts
packages/reactivity/src/effect.ts

index 2788f89010587bc51e9391bfdfd54d6ee5bfbdb1..1f1d8ea43d7f76649f7aa941cd7ce8be4deac24c 100644 (file)
@@ -1,4 +1,4 @@
-import { effect, ReactiveEffect, effectStack } from './effect'
+import { effect, ReactiveEffect, activeEffect } from './effect'
 import { Ref, UnwrapRef } from './ref'
 import { isFunction, NOOP } from '@vue/shared'
 
@@ -73,15 +73,14 @@ export function computed<T>(
 }
 
 function trackChildRun(childRunner: ReactiveEffect) {
-  if (effectStack.length === 0) {
+  if (activeEffect === undefined) {
     return
   }
-  const parentRunner = effectStack[effectStack.length - 1]
   for (let i = 0; i < childRunner.deps.length; i++) {
     const dep = childRunner.deps[i]
-    if (!dep.has(parentRunner)) {
-      dep.add(parentRunner)
-      parentRunner.deps.push(dep)
+    if (!dep.has(activeEffect)) {
+      dep.add(activeEffect)
+      activeEffect.deps.push(dep)
     }
   }
 }
index 6dbf99cd01a7cba37fd0c8de5243485d784bc870..46969d3c33cc238c5f98f369dc9248cf319c0ff0 100644 (file)
@@ -40,7 +40,8 @@ export interface DebuggerEventExtraInfo {
   oldTarget?: Map<any, any> | Set<any>
 }
 
-export const effectStack: ReactiveEffect[] = []
+const effectStack: ReactiveEffect[] = []
+export let activeEffect: ReactiveEffect | undefined
 
 export const ITERATE_KEY = Symbol('iterate')
 
@@ -95,9 +96,11 @@ function run(effect: ReactiveEffect, fn: Function, args: unknown[]): unknown {
     cleanup(effect)
     try {
       effectStack.push(effect)
+      activeEffect = effect
       return fn(...args)
     } finally {
       effectStack.pop()
+      activeEffect = effectStack[effectStack.length - 1]
     }
   }
 }
@@ -123,10 +126,9 @@ export function resumeTracking() {
 }
 
 export function track(target: object, type: TrackOpTypes, key: unknown) {
-  if (!shouldTrack || effectStack.length === 0) {
+  if (!shouldTrack || activeEffect === undefined) {
     return
   }
-  const effect = effectStack[effectStack.length - 1]
   let depsMap = targetMap.get(target)
   if (depsMap === void 0) {
     targetMap.set(target, (depsMap = new Map()))
@@ -135,12 +137,12 @@ export function track(target: object, type: TrackOpTypes, key: unknown) {
   if (dep === void 0) {
     depsMap.set(key, (dep = new Set()))
   }
-  if (!dep.has(effect)) {
-    dep.add(effect)
-    effect.deps.push(dep)
-    if (__DEV__ && effect.options.onTrack) {
-      effect.options.onTrack({
-        effect,
+  if (!dep.has(activeEffect)) {
+    dep.add(activeEffect)
+    activeEffect.deps.push(dep)
+    if (__DEV__ && activeEffect.options.onTrack) {
+      activeEffect.options.onTrack({
+        effect: activeEffect,
         target,
         type,
         key