From f485ea01a9d1d7aca3bdc61b12f768de91c8d583 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Fri, 13 May 2022 19:01:02 +0800 Subject: [PATCH 01/34] perf: calculate embedded `computed()` on-demand --- .../reactivity/__tests__/computed.spec.ts | 51 +++++++++++++++++++ packages/reactivity/src/baseHandlers.ts | 4 +- packages/reactivity/src/collectionHandlers.ts | 8 +-- packages/reactivity/src/computed.ts | 25 +++++++-- packages/reactivity/src/deferredComputed.ts | 6 +-- packages/reactivity/src/effect.ts | 24 ++++----- packages/reactivity/src/ref.ts | 11 ++-- packages/runtime-core/src/compat/global.ts | 2 +- packages/runtime-core/src/componentProps.ts | 2 +- 9 files changed, 99 insertions(+), 34 deletions(-) diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index 51157944355..9169d75207c 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -290,4 +290,55 @@ describe('reactivity/computed', () => { oldValue: 2 }) }) + + it('chained computed value on-demand trigger', () => { + const c1Spy = jest.fn() + const c2Spy = jest.fn() + + const src = ref(0) + const c1 = computed(() => { + c1Spy() + return src.value < 5 + }) + const c2 = computed(() => { + c2Spy() + return c1.value ? '< 5' : '>= 5' + }) + + expect(c1Spy).toHaveBeenCalledTimes(0) + expect(c2Spy).toHaveBeenCalledTimes(0) + + expect(src.value).toBe(0) + expect(c2.value).toBe('< 5') + expect(c1Spy).toHaveBeenCalledTimes(1) + expect(c2Spy).toHaveBeenCalledTimes(1) + + src.value++ + expect(c2.value).toBe('< 5') + expect(c1Spy).toHaveBeenCalledTimes(2) + expect(c2Spy).toHaveBeenCalledTimes(1) + + for (let i = 0; i < 10; i++) { + src.value++ + } + expect(src.value).toBe(11) + expect(c2.value).toBe('>= 5') + expect(c1Spy).toHaveBeenCalledTimes(3) + expect(c2Spy).toHaveBeenCalledTimes(2) + + src.value++ + expect(src.value).toBe(12) + expect(c2.value).toBe('>= 5') + expect(c1Spy).toHaveBeenCalledTimes(4) + expect(c2Spy).toHaveBeenCalledTimes(2) + + for (let i = 0; i < 100; i++) { + src.value++ + c2.value + } + expect(src.value).toBe(112) + expect(c2.value).toBe('>= 5') + expect(c1Spy).toHaveBeenCalledTimes(104) + expect(c2Spy).toHaveBeenCalledTimes(2) + }) }) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 45ecfa6d38a..43bd425d2a7 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -190,9 +190,9 @@ function createSetter(shallow = false) { // don't trigger if target is something up in the prototype chain of original if (target === toRaw(receiver)) { if (!hadKey) { - trigger(target, TriggerOpTypes.ADD, key, value) + trigger(target, TriggerOpTypes.ADD, undefined, key, value) } else if (hasChanged(value, oldValue)) { - trigger(target, TriggerOpTypes.SET, key, value, oldValue) + trigger(target, TriggerOpTypes.SET, undefined, key, value, oldValue) } } return result diff --git a/packages/reactivity/src/collectionHandlers.ts b/packages/reactivity/src/collectionHandlers.ts index 381bbad6c28..651cb1e289f 100644 --- a/packages/reactivity/src/collectionHandlers.ts +++ b/packages/reactivity/src/collectionHandlers.ts @@ -73,7 +73,7 @@ function add(this: SetTypes, value: unknown) { const hadKey = proto.has.call(target, value) if (!hadKey) { target.add(value) - trigger(target, TriggerOpTypes.ADD, value, value) + trigger(target, TriggerOpTypes.ADD, undefined, value, value) } return this } @@ -94,9 +94,9 @@ function set(this: MapTypes, key: unknown, value: unknown) { const oldValue = get.call(target, key) target.set(key, value) if (!hadKey) { - trigger(target, TriggerOpTypes.ADD, key, value) + trigger(target, TriggerOpTypes.ADD, undefined, key, value) } else if (hasChanged(value, oldValue)) { - trigger(target, TriggerOpTypes.SET, key, value, oldValue) + trigger(target, TriggerOpTypes.SET, undefined, key, value, oldValue) } return this } @@ -116,7 +116,7 @@ function deleteEntry(this: CollectionTypes, key: unknown) { // forward the operation before queueing reactions const result = target.delete(key) if (hadKey) { - trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue) + trigger(target, TriggerOpTypes.DELETE, undefined, key, undefined, oldValue) } return result } diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index b24484c9e62..1d177afbcff 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -33,6 +33,7 @@ export class ComputedRefImpl { public readonly [ReactiveFlags.IS_READONLY]: boolean = false public _dirty = true + public _computedsToAskDirty: ComputedRefImpl[] = [] public _cacheable: boolean constructor( @@ -41,10 +42,13 @@ export class ComputedRefImpl { isReadonly: boolean, isSSR: boolean ) { - this.effect = new ReactiveEffect(getter, () => { - if (!this._dirty) { + this.effect = new ReactiveEffect(getter, (_c) => { + if (_c) { + this._computedsToAskDirty.push(_c) + } + else if (!this._dirty) { this._dirty = true - triggerRefValue(this) + triggerRefValue(this, this) } }) this.effect.computed = this @@ -55,11 +59,24 @@ export class ComputedRefImpl { get value() { // the computed ref may get wrapped by other proxies e.g. readonly() #3376 const self = toRaw(this) + if (!self._dirty) { + for (const computedToAskDirty of self._computedsToAskDirty) { + computedToAskDirty.value + if (self._dirty) { + break + } + } + } trackRefValue(self) if (self._dirty || !self._cacheable) { + const newValue = self.effect.run()! + if (self._value !== newValue) { + triggerRefValue(this, undefined) + } + self._value = newValue self._dirty = false - self._value = self.effect.run()! } + self._computedsToAskDirty.length = 0 return self._value } diff --git a/packages/reactivity/src/deferredComputed.ts b/packages/reactivity/src/deferredComputed.ts index a23122046a4..07b4a496bf4 100644 --- a/packages/reactivity/src/deferredComputed.ts +++ b/packages/reactivity/src/deferredComputed.ts @@ -38,7 +38,7 @@ class DeferredComputedRefImpl { let compareTarget: any let hasCompareTarget = false let scheduled = false - this.effect = new ReactiveEffect(getter, (computedTrigger?: boolean) => { + this.effect = new ReactiveEffect(getter, (_c, computedTrigger?: boolean) => { if (this.dep) { if (computedTrigger) { compareTarget = this._value @@ -49,7 +49,7 @@ class DeferredComputedRefImpl { hasCompareTarget = false scheduler(() => { if (this.effect.active && this._get() !== valueToCompare) { - triggerRefValue(this) + triggerRefValue(this, undefined) } scheduled = false }) @@ -59,7 +59,7 @@ class DeferredComputedRefImpl { // deferred to be triggered in scheduler. for (const e of this.dep) { if (e.computed instanceof DeferredComputedRefImpl) { - e.scheduler!(true /* computedTrigger */) + e.scheduler!(undefined, true /* computedTrigger */) } } } diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index d4a34edfef4..4cfb9ec8dda 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -30,7 +30,7 @@ export let trackOpBit = 1 */ const maxMarkerBits = 30 -export type EffectScheduler = (...args: any[]) => any +export type EffectScheduler = (computedToAskDirty: ComputedRefImpl | undefined, ...args: any[]) => any export type DebuggerEvent = { effect: ReactiveEffect @@ -305,6 +305,7 @@ export function trackEffects( export function trigger( target: object, type: TriggerOpTypes, + computedToAskDirty: ComputedRefImpl | undefined, key?: unknown, newValue?: unknown, oldValue?: unknown, @@ -370,9 +371,9 @@ export function trigger( if (deps.length === 1) { if (deps[0]) { if (__DEV__) { - triggerEffects(deps[0], eventInfo) + triggerEffects(deps[0], computedToAskDirty, eventInfo) } else { - triggerEffects(deps[0]) + triggerEffects(deps[0], computedToAskDirty) } } } else { @@ -383,33 +384,28 @@ export function trigger( } } if (__DEV__) { - triggerEffects(createDep(effects), eventInfo) + triggerEffects(createDep(effects), computedToAskDirty, eventInfo) } else { - triggerEffects(createDep(effects)) + triggerEffects(createDep(effects), computedToAskDirty) } } } export function triggerEffects( dep: Dep | ReactiveEffect[], + computedToAskDirty: ComputedRefImpl | undefined, debuggerEventExtraInfo?: DebuggerEventExtraInfo ) { // spread into array for stabilization const effects = isArray(dep) ? dep : [...dep] for (const effect of effects) { - if (effect.computed) { - triggerEffect(effect, debuggerEventExtraInfo) - } - } - for (const effect of effects) { - if (!effect.computed) { - triggerEffect(effect, debuggerEventExtraInfo) - } + triggerEffect(effect, computedToAskDirty, debuggerEventExtraInfo) } } function triggerEffect( effect: ReactiveEffect, + computedToAskDirty: ComputedRefImpl | undefined, debuggerEventExtraInfo?: DebuggerEventExtraInfo ) { if (effect !== activeEffect || effect.allowRecurse) { @@ -417,7 +413,7 @@ function triggerEffect( effect.onTrigger(extend({ effect }, debuggerEventExtraInfo)) } if (effect.scheduler) { - effect.scheduler() + effect.scheduler(computedToAskDirty) } else { effect.run() } diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 5dd31a9f8ca..b131ce58c58 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -18,6 +18,7 @@ import { import type { ShallowReactiveMarker } from './reactive' import { CollectionTypes } from './collectionHandlers' import { createDep, Dep } from './dep' +import { ComputedRefImpl } from './computed' declare const RefSymbol: unique symbol export declare const RawSymbol: unique symbol @@ -52,19 +53,19 @@ export function trackRefValue(ref: RefBase) { } } -export function triggerRefValue(ref: RefBase, newVal?: any) { +export function triggerRefValue(ref: RefBase, computedToAskDirty: ComputedRefImpl | undefined, newVal?: any) { ref = toRaw(ref) const dep = ref.dep if (dep) { if (__DEV__) { - triggerEffects(dep, { + triggerEffects(dep, computedToAskDirty, { target: ref, type: TriggerOpTypes.SET, key: 'value', newValue: newVal }) } else { - triggerEffects(dep) + triggerEffects(dep, computedToAskDirty) } } } @@ -155,7 +156,7 @@ class RefImpl { if (hasChanged(newVal, this._rawValue)) { this._rawValue = newVal this._value = useDirectValue ? newVal : toReactive(newVal) - triggerRefValue(this, newVal) + triggerRefValue(this, undefined, newVal) } } } @@ -282,7 +283,7 @@ class CustomRefImpl { constructor(factory: CustomRefFactory) { const { get, set } = factory( () => trackRefValue(this), - () => triggerRefValue(this) + () => triggerRefValue(this, undefined) ) this._get = get this._set = set diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index 9f1a6d1cd12..1cd9e886984 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -648,7 +648,7 @@ function defineReactiveSimple(obj: any, key: string, val: any) { }, set(newVal) { val = isObject(newVal) ? reactive(newVal) : newVal - trigger(obj, TriggerOpTypes.SET, key, newVal) + trigger(obj, TriggerOpTypes.SET, undefined, key, newVal) } }) } diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index 186384d5b82..b1179647871 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -333,7 +333,7 @@ export function updateProps( // trigger updates for $attrs in case it's used in component slots if (hasAttrsChanged) { - trigger(instance, TriggerOpTypes.SET, '$attrs') + trigger(instance, TriggerOpTypes.SET, undefined, '$attrs') } if (__DEV__) { From 208e59c9d9e44765b2bd6eccbf7f6f395ae18979 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Fri, 13 May 2022 19:38:25 +0800 Subject: [PATCH 02/34] fix: computed effect dons't transfer --- packages/reactivity/src/computed.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index 1d177afbcff..e7bd253ea49 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -45,6 +45,7 @@ export class ComputedRefImpl { this.effect = new ReactiveEffect(getter, (_c) => { if (_c) { this._computedsToAskDirty.push(_c) + triggerRefValue(this, this) } else if (!this._dirty) { this._dirty = true From 4a3e554d56a0e35c709801a087aadaaf956cd380 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Fri, 13 May 2022 21:11:51 +0800 Subject: [PATCH 03/34] fix: revert effects trigger order --- packages/reactivity/src/effect.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 4cfb9ec8dda..14c2339478c 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -399,7 +399,14 @@ export function triggerEffects( // spread into array for stabilization const effects = isArray(dep) ? dep : [...dep] for (const effect of effects) { - triggerEffect(effect, computedToAskDirty, debuggerEventExtraInfo) + if (effect.computed) { + triggerEffect(effect, computedToAskDirty, debuggerEventExtraInfo) + } + } + for (const effect of effects) { + if (!effect.computed) { + triggerEffect(effect, computedToAskDirty, debuggerEventExtraInfo) + } } } From ed871c2cb95b493cbee399dce45996df1a2dc778 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Sat, 14 May 2022 04:57:41 +0800 Subject: [PATCH 04/34] refactor: remove `computedToAskDirty` arg from `trigger()` --- packages/reactivity/src/baseHandlers.ts | 4 ++-- packages/reactivity/src/collectionHandlers.ts | 8 ++++---- packages/reactivity/src/effect.ts | 9 ++++----- packages/runtime-core/src/compat/global.ts | 2 +- packages/runtime-core/src/componentProps.ts | 2 +- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 43bd425d2a7..45ecfa6d38a 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -190,9 +190,9 @@ function createSetter(shallow = false) { // don't trigger if target is something up in the prototype chain of original if (target === toRaw(receiver)) { if (!hadKey) { - trigger(target, TriggerOpTypes.ADD, undefined, key, value) + trigger(target, TriggerOpTypes.ADD, key, value) } else if (hasChanged(value, oldValue)) { - trigger(target, TriggerOpTypes.SET, undefined, key, value, oldValue) + trigger(target, TriggerOpTypes.SET, key, value, oldValue) } } return result diff --git a/packages/reactivity/src/collectionHandlers.ts b/packages/reactivity/src/collectionHandlers.ts index 651cb1e289f..381bbad6c28 100644 --- a/packages/reactivity/src/collectionHandlers.ts +++ b/packages/reactivity/src/collectionHandlers.ts @@ -73,7 +73,7 @@ function add(this: SetTypes, value: unknown) { const hadKey = proto.has.call(target, value) if (!hadKey) { target.add(value) - trigger(target, TriggerOpTypes.ADD, undefined, value, value) + trigger(target, TriggerOpTypes.ADD, value, value) } return this } @@ -94,9 +94,9 @@ function set(this: MapTypes, key: unknown, value: unknown) { const oldValue = get.call(target, key) target.set(key, value) if (!hadKey) { - trigger(target, TriggerOpTypes.ADD, undefined, key, value) + trigger(target, TriggerOpTypes.ADD, key, value) } else if (hasChanged(value, oldValue)) { - trigger(target, TriggerOpTypes.SET, undefined, key, value, oldValue) + trigger(target, TriggerOpTypes.SET, key, value, oldValue) } return this } @@ -116,7 +116,7 @@ function deleteEntry(this: CollectionTypes, key: unknown) { // forward the operation before queueing reactions const result = target.delete(key) if (hadKey) { - trigger(target, TriggerOpTypes.DELETE, undefined, key, undefined, oldValue) + trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue) } return result } diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 14c2339478c..1ef95b31cd7 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -305,7 +305,6 @@ export function trackEffects( export function trigger( target: object, type: TriggerOpTypes, - computedToAskDirty: ComputedRefImpl | undefined, key?: unknown, newValue?: unknown, oldValue?: unknown, @@ -371,9 +370,9 @@ export function trigger( if (deps.length === 1) { if (deps[0]) { if (__DEV__) { - triggerEffects(deps[0], computedToAskDirty, eventInfo) + triggerEffects(deps[0], undefined, eventInfo) } else { - triggerEffects(deps[0], computedToAskDirty) + triggerEffects(deps[0], undefined) } } } else { @@ -384,9 +383,9 @@ export function trigger( } } if (__DEV__) { - triggerEffects(createDep(effects), computedToAskDirty, eventInfo) + triggerEffects(createDep(effects), undefined, eventInfo) } else { - triggerEffects(createDep(effects), computedToAskDirty) + triggerEffects(createDep(effects), undefined) } } } diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index 1cd9e886984..9f1a6d1cd12 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -648,7 +648,7 @@ function defineReactiveSimple(obj: any, key: string, val: any) { }, set(newVal) { val = isObject(newVal) ? reactive(newVal) : newVal - trigger(obj, TriggerOpTypes.SET, undefined, key, newVal) + trigger(obj, TriggerOpTypes.SET, key, newVal) } }) } diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index b1179647871..186384d5b82 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -333,7 +333,7 @@ export function updateProps( // trigger updates for $attrs in case it's used in component slots if (hasAttrsChanged) { - trigger(instance, TriggerOpTypes.SET, undefined, '$attrs') + trigger(instance, TriggerOpTypes.SET, '$attrs') } if (__DEV__) { From fbf214ab21f25b3f407d549dd79ff3e46faf83cf Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Sat, 14 May 2022 05:09:22 +0800 Subject: [PATCH 05/34] chore: use `hasChanged()` instead of `!==` --- packages/reactivity/src/computed.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index e7bd253ea49..4888c1c7d01 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -1,6 +1,6 @@ import { DebuggerOptions, ReactiveEffect } from './effect' import { Ref, trackRefValue, triggerRefValue } from './ref' -import { isFunction, NOOP } from '@vue/shared' +import { hasChanged, isFunction, NOOP } from '@vue/shared' import { ReactiveFlags, toRaw } from './reactive' import { Dep } from './dep' @@ -71,7 +71,7 @@ export class ComputedRefImpl { trackRefValue(self) if (self._dirty || !self._cacheable) { const newValue = self.effect.run()! - if (self._value !== newValue) { + if (hasChanged(self._value, newValue)) { triggerRefValue(this, undefined) } self._value = newValue From 399f1553c889a8b7486191ee56ce961814f26b9d Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Sun, 15 May 2022 07:37:45 +0800 Subject: [PATCH 06/34] perf: reduce `triggerRefValue()` triggered --- packages/reactivity/src/computed.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index 4888c1c7d01..bc78fc2a54b 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -43,12 +43,13 @@ export class ComputedRefImpl { isSSR: boolean ) { this.effect = new ReactiveEffect(getter, (_c) => { - if (_c) { - this._computedsToAskDirty.push(_c) - triggerRefValue(this, this) - } - else if (!this._dirty) { - this._dirty = true + if (!this._dirty) { + if (_c) { + this._computedsToAskDirty.push(_c) + } + else { + this._dirty = true + } triggerRefValue(this, this) } }) From 0e0c44e74f51037253c02c7186adbffb49cc3a40 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Wed, 11 Jan 2023 13:47:36 +0800 Subject: [PATCH 07/34] perf: avoid duplicate trigger effect to deps --- packages/reactivity/src/computed.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index bc78fc2a54b..c29bf83f1d8 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -36,21 +36,25 @@ export class ComputedRefImpl { public _computedsToAskDirty: ComputedRefImpl[] = [] public _cacheable: boolean + private _triggeredAfterLastEffect = false + constructor( getter: ComputedGetter, private readonly _setter: ComputedSetter, isReadonly: boolean, isSSR: boolean ) { - this.effect = new ReactiveEffect(getter, (_c) => { + this.effect = new ReactiveEffect(getter, _c => { if (!this._dirty) { if (_c) { this._computedsToAskDirty.push(_c) - } - else { + } else { this._dirty = true } - triggerRefValue(this, this) + if (!this._triggeredAfterLastEffect) { + this._triggeredAfterLastEffect = true + triggerRefValue(this, this) + } } }) this.effect.computed = this @@ -77,6 +81,7 @@ export class ComputedRefImpl { } self._value = newValue self._dirty = false + self._triggeredAfterLastEffect = false } self._computedsToAskDirty.length = 0 return self._value From 7768d43175ca58dd7bb8eec00a3db3f13f12ef45 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 2 Feb 2023 10:27:15 +0000 Subject: [PATCH 08/34] fix: avoid track unrelated effects --- packages/reactivity/src/computed.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index c29bf83f1d8..9cae1b26e3a 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -1,4 +1,9 @@ -import { DebuggerOptions, ReactiveEffect } from './effect' +import { + DebuggerOptions, + pauseTracking, + ReactiveEffect, + resetTracking +} from './effect' import { Ref, trackRefValue, triggerRefValue } from './ref' import { hasChanged, isFunction, NOOP } from '@vue/shared' import { ReactiveFlags, toRaw } from './reactive' @@ -65,19 +70,21 @@ export class ComputedRefImpl { get value() { // the computed ref may get wrapped by other proxies e.g. readonly() #3376 const self = toRaw(this) - if (!self._dirty) { + if (!self._dirty && self._computedsToAskDirty.length) { + pauseTracking() for (const computedToAskDirty of self._computedsToAskDirty) { computedToAskDirty.value if (self._dirty) { break } } + resetTracking() } trackRefValue(self) if (self._dirty || !self._cacheable) { const newValue = self.effect.run()! if (hasChanged(self._value, newValue)) { - triggerRefValue(this, undefined) + triggerRefValue(self, undefined) } self._value = newValue self._dirty = false From a353eac19b8636a13b3ab763292acd79bf162f5f Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 2 Feb 2023 10:31:02 +0000 Subject: [PATCH 09/34] chore: make `_computedsToAskDirty` private --- packages/reactivity/src/computed.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index 9cae1b26e3a..afb7aa70d67 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -38,9 +38,9 @@ export class ComputedRefImpl { public readonly [ReactiveFlags.IS_READONLY]: boolean = false public _dirty = true - public _computedsToAskDirty: ComputedRefImpl[] = [] public _cacheable: boolean + private _computedsToAskDirty: ComputedRefImpl[] = [] private _triggeredAfterLastEffect = false constructor( From 014dcd5aa45a62927a96424d522d36255b741575 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 2 Feb 2023 10:43:11 +0000 Subject: [PATCH 10/34] fix: jest -> vitest --- packages/reactivity/__tests__/computed.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index 9169d75207c..b7ce4717cdc 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -292,8 +292,8 @@ describe('reactivity/computed', () => { }) it('chained computed value on-demand trigger', () => { - const c1Spy = jest.fn() - const c2Spy = jest.fn() + const c1Spy = vi.fn() + const c2Spy = vi.fn() const src = ref(0) const c1 = computed(() => { From eb0f8fae3891dbd841f3c59adbae51fc88a34e8f Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Wed, 5 Apr 2023 23:51:49 +0800 Subject: [PATCH 11/34] fix: urgent assessment edge case --- .../reactivity/__tests__/computed.spec.ts | 27 +++++++++++++++++++ packages/reactivity/src/computed.ts | 7 +++++ 2 files changed, 34 insertions(+) diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index b7ce4717cdc..76e2c1066b2 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -341,4 +341,31 @@ describe('reactivity/computed', () => { expect(c1Spy).toHaveBeenCalledTimes(104) expect(c2Spy).toHaveBeenCalledTimes(2) }) + + it('chained computed value urgent assessment edge case', () => { + const cSpy = vi.fn() + + const a = ref({ + v: 1 + }) + const b = computed(() => { + return a.value + }) + const c = computed(() => { + cSpy() + return b.value?.v + }) + const d = computed(() => { + if (b.value) { + return c.value + } + return 0 + }) + + d.value + a.value!.v = 2 + a.value = null + d.value + expect(cSpy).toHaveBeenCalledTimes(1) + }) }) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index afb7aa70d67..5a92b42624e 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -72,6 +72,13 @@ export class ComputedRefImpl { const self = toRaw(this) if (!self._dirty && self._computedsToAskDirty.length) { pauseTracking() + if (self._computedsToAskDirty.length >= 2) { + self._computedsToAskDirty = self._computedsToAskDirty.sort((a, b) => { + const aIndex = self.effect.deps.indexOf(a.dep!) + const bIndex = self.effect.deps.indexOf(b.dep!) + return aIndex - bIndex + }) + } for (const computedToAskDirty of self._computedsToAskDirty) { computedToAskDirty.value if (self._dirty) { From f3a007124d93b9a369692e545c5b9378e08736dd Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Thu, 6 Apr 2023 02:19:38 +0800 Subject: [PATCH 12/34] feat: more purposeful test --- .../reactivity/__tests__/computed.spec.ts | 57 +++++-------------- 1 file changed, 14 insertions(+), 43 deletions(-) diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index 76e2c1066b2..c18e4367fa1 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -292,54 +292,25 @@ describe('reactivity/computed', () => { }) it('chained computed value on-demand trigger', () => { - const c1Spy = vi.fn() - const c2Spy = vi.fn() + const minSpy = vi.fn() + const hourSpy = vi.fn() - const src = ref(0) - const c1 = computed(() => { - c1Spy() - return src.value < 5 + const sec = ref(0) + const min = computed(() => { + minSpy() + return Math.floor(sec.value / 60) }) - const c2 = computed(() => { - c2Spy() - return c1.value ? '< 5' : '>= 5' + const hour = computed(() => { + hourSpy() + return Math.floor(min.value / 60) }) - expect(c1Spy).toHaveBeenCalledTimes(0) - expect(c2Spy).toHaveBeenCalledTimes(0) - - expect(src.value).toBe(0) - expect(c2.value).toBe('< 5') - expect(c1Spy).toHaveBeenCalledTimes(1) - expect(c2Spy).toHaveBeenCalledTimes(1) - - src.value++ - expect(c2.value).toBe('< 5') - expect(c1Spy).toHaveBeenCalledTimes(2) - expect(c2Spy).toHaveBeenCalledTimes(1) - - for (let i = 0; i < 10; i++) { - src.value++ + for (sec.value = 0; sec.value < 1000; sec.value++) { + hour.value } - expect(src.value).toBe(11) - expect(c2.value).toBe('>= 5') - expect(c1Spy).toHaveBeenCalledTimes(3) - expect(c2Spy).toHaveBeenCalledTimes(2) - - src.value++ - expect(src.value).toBe(12) - expect(c2.value).toBe('>= 5') - expect(c1Spy).toHaveBeenCalledTimes(4) - expect(c2Spy).toHaveBeenCalledTimes(2) - - for (let i = 0; i < 100; i++) { - src.value++ - c2.value - } - expect(src.value).toBe(112) - expect(c2.value).toBe('>= 5') - expect(c1Spy).toHaveBeenCalledTimes(104) - expect(c2Spy).toHaveBeenCalledTimes(2) + + expect(minSpy).toHaveBeenCalledTimes(1000) + expect(hourSpy).toHaveBeenCalledTimes(17) }) it('chained computed value urgent assessment edge case', () => { From 998c400cad7dcbe44dabc2b223ab99c0557f5106 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Thu, 6 Apr 2023 16:26:39 +0800 Subject: [PATCH 13/34] chore: add test for effect() on-demand trigger --- .../reactivity/__tests__/computed.spec.ts | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index c18e4367fa1..988bead0cce 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -313,6 +313,34 @@ describe('reactivity/computed', () => { expect(hourSpy).toHaveBeenCalledTimes(17) }) + it('effect callback on-demand trigger', () => { + const minSpy = vi.fn() + const hourSpy = vi.fn() + const effectSpy = vi.fn() + + const sec = ref(0) + const min = computed(() => { + minSpy() + return Math.floor(sec.value / 60) + }) + const hour = computed(() => { + hourSpy() + return Math.floor(min.value / 60) + }) + + effect(() => { + effectSpy() + min.value + hour.value + }) + + for (sec.value = 0; sec.value < 1000; sec.value++) {} + + expect(minSpy).toHaveBeenCalledTimes(1001) + expect(hourSpy).toHaveBeenCalledTimes(17) + expect(effectSpy).toHaveBeenCalledTimes(1001) + }) + it('chained computed value urgent assessment edge case', () => { const cSpy = vi.fn() From b5527a17fa0374de2e2f39175788af30db1f594f Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Thu, 6 Apr 2023 18:15:15 +0800 Subject: [PATCH 14/34] Revert "chore: add test for effect() on-demand trigger" This reverts commit 998c400cad7dcbe44dabc2b223ab99c0557f5106. --- .../reactivity/__tests__/computed.spec.ts | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index 988bead0cce..c18e4367fa1 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -313,34 +313,6 @@ describe('reactivity/computed', () => { expect(hourSpy).toHaveBeenCalledTimes(17) }) - it('effect callback on-demand trigger', () => { - const minSpy = vi.fn() - const hourSpy = vi.fn() - const effectSpy = vi.fn() - - const sec = ref(0) - const min = computed(() => { - minSpy() - return Math.floor(sec.value / 60) - }) - const hour = computed(() => { - hourSpy() - return Math.floor(min.value / 60) - }) - - effect(() => { - effectSpy() - min.value - hour.value - }) - - for (sec.value = 0; sec.value < 1000; sec.value++) {} - - expect(minSpy).toHaveBeenCalledTimes(1001) - expect(hourSpy).toHaveBeenCalledTimes(17) - expect(effectSpy).toHaveBeenCalledTimes(1001) - }) - it('chained computed value urgent assessment edge case', () => { const cSpy = vi.fn() From 3e0c2af3c00a8d74edabe8e5d32c1deae889d205 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Thu, 6 Apr 2023 20:23:24 +0800 Subject: [PATCH 15/34] wip: on-demand effect() --- .../reactivity/__tests__/computed.spec.ts | 22 ++++++ packages/reactivity/src/effect.ts | 73 ++++++++++++++++++- 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index c18e4367fa1..2091ae1dc93 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -313,6 +313,28 @@ describe('reactivity/computed', () => { expect(hourSpy).toHaveBeenCalledTimes(17) }) + it('effect callback on-demand trigger', () => { + const effectSpy = vi.fn() + + const sec = ref(0) + const min = computed(() => { + return Math.floor(sec.value / 60) + }) + const hour = computed(() => { + return Math.floor(min.value / 60) + }) + + effect(() => { + effectSpy() + min.value + hour.value + }) + + for (sec.value = 0; sec.value < 1000; sec.value++) {} + + expect(effectSpy).toHaveBeenCalledTimes(17) + }) + it('chained computed value urgent assessment edge case', () => { const cSpy = vi.fn() diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 1ef95b31cd7..a4d675ab411 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -30,7 +30,10 @@ export let trackOpBit = 1 */ const maxMarkerBits = 30 -export type EffectScheduler = (computedToAskDirty: ComputedRefImpl | undefined, ...args: any[]) => any +export type EffectScheduler = ( + computedToAskDirty: ComputedRefImpl | undefined, + ...args: any[] +) => any export type DebuggerEvent = { effect: ReactiveEffect @@ -185,7 +188,26 @@ export function effect( fn = (fn as ReactiveEffectRunner).effect.fn } - const _effect = new ReactiveEffect(fn) + let _dirty = false + let _triggeredAfterLastEffect = false + let _computedsToAskDirty: ComputedRefImpl[] = [] + + const _effect = new ReactiveEffect(fn, _c => { + if (!_dirty) { + if (!_c) { + _dirty = true + } + if (state === EffectState.TRACKING) { + if (_c) { + _computedsToAskDirty.push(_c) + } + if (!_triggeredAfterLastEffect) { + _triggeredAfterLastEffect = true + schedulerCallbacks.push(cb) + } + } + } + }) if (options) { extend(_effect, options) if (options.scope) recordEffectScope(_effect, options.scope) @@ -196,6 +218,32 @@ export function effect( const runner = _effect.run.bind(_effect) as ReactiveEffectRunner runner.effect = _effect return runner + + function cb() { + if (!_dirty && _computedsToAskDirty.length) { + pauseTracking() + if (_computedsToAskDirty.length >= 2) { + _computedsToAskDirty = _computedsToAskDirty.sort((a, b) => { + const aIndex = _effect.deps.indexOf(a.dep!) + const bIndex = _effect.deps.indexOf(b.dep!) + return aIndex - bIndex + }) + } + for (const computedToAskDirty of _computedsToAskDirty) { + computedToAskDirty.value + if (_dirty) { + break + } + } + resetTracking() + } + if (_dirty) { + _dirty = false + _effect.run() + } + _computedsToAskDirty.length = 0 + _triggeredAfterLastEffect = false + } } /** @@ -409,11 +457,26 @@ export function triggerEffects( } } +const schedulerCallbacks: (() => void)[] = [] + +const enum EffectState { + NOT_TRACKING = 0, + TRACKING = 1, + POST_SCHEDULER = 2 +} + +let state = EffectState.NOT_TRACKING + function triggerEffect( effect: ReactiveEffect, computedToAskDirty: ComputedRefImpl | undefined, debuggerEventExtraInfo?: DebuggerEventExtraInfo ) { + let isRootEffect = false + if (state === EffectState.NOT_TRACKING) { + state = EffectState.TRACKING + isRootEffect = true + } if (effect !== activeEffect || effect.allowRecurse) { if (__DEV__ && effect.onTrigger) { effect.onTrigger(extend({ effect }, debuggerEventExtraInfo)) @@ -424,6 +487,12 @@ function triggerEffect( effect.run() } } + if (isRootEffect) { + state = EffectState.POST_SCHEDULER + schedulerCallbacks.forEach(cb => cb()) + schedulerCallbacks.length = 0 + state = EffectState.NOT_TRACKING + } } export function getDepFromReactive(object: any, key: string | number | symbol) { From 62dc5ee1d132fdbb711a1ae9736293c75593f82a Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Fri, 7 Apr 2023 19:05:10 +0800 Subject: [PATCH 16/34] fix: ref newVal arg incorrect --- packages/reactivity/src/ref.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index b131ce58c58..834071a7a5b 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -53,7 +53,11 @@ export function trackRefValue(ref: RefBase) { } } -export function triggerRefValue(ref: RefBase, computedToAskDirty: ComputedRefImpl | undefined, newVal?: any) { +export function triggerRefValue( + ref: RefBase, + computedToAskDirty: ComputedRefImpl | undefined, + newVal?: any +) { ref = toRaw(ref) const dep = ref.dep if (dep) { @@ -187,7 +191,7 @@ class RefImpl { * @see {@link https://vuejs.org/api/reactivity-advanced.html#triggerref} */ export function triggerRef(ref: Ref) { - triggerRefValue(ref, __DEV__ ? ref.value : void 0) + triggerRefValue(ref, undefined, __DEV__ ? ref.value : void 0) } export type MaybeRef = T | Ref From 889511719721b754e774b42f1bc3e43391a30f35 Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Fri, 7 Apr 2023 20:18:53 +0800 Subject: [PATCH 17/34] release: v3.3.0-alpha.9 --- CHANGELOG.md | 38 ++++++++++++++++ package.json | 2 +- packages/compiler-core/package.json | 4 +- packages/compiler-dom/package.json | 6 +-- packages/compiler-sfc/package.json | 12 ++--- packages/compiler-ssr/package.json | 6 +-- packages/dts-test/package.json | 2 +- packages/reactivity-transform/package.json | 6 +-- packages/reactivity/package.json | 4 +- packages/runtime-core/package.json | 6 +-- packages/runtime-dom/package.json | 6 +-- packages/runtime-test/package.json | 6 +-- packages/server-renderer/package.json | 8 ++-- packages/sfc-playground/package.json | 2 +- packages/shared/package.json | 2 +- packages/size-check/package.json | 2 +- packages/template-explorer/package.json | 2 +- packages/vue-compat/package.json | 4 +- packages/vue/package.json | 12 ++--- pnpm-lock.yaml | 52 +++++++++++----------- 20 files changed, 110 insertions(+), 72 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c7ba846f5c..5841b02aaa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,41 @@ +# [3.3.0-alpha.9](https://github.com/vuejs/core/compare/v3.3.0-alpha.8...v3.3.0-alpha.9) (2023-04-07) + + +### Bug Fixes + +* avoid track unrelated effects ([7768d43](https://github.com/vuejs/core/commit/7768d43175ca58dd7bb8eec00a3db3f13f12ef45)) +* **compiler-sfc:** skip empty `defineOptions` and support TypeScript type assertions ([#8028](https://github.com/vuejs/core/issues/8028)) ([9557529](https://github.com/vuejs/core/commit/955752951e1d31b90d817bd20830fe3f89018771)) +* **compiler-ssr:** disable v-once transform in ssr vdom fallback branch ([05f94cf](https://github.com/vuejs/core/commit/05f94cf7b01dd05ed7d3170916a38b175d5df292)), closes [#7644](https://github.com/vuejs/core/issues/7644) +* computed effect dons't transfer ([208e59c](https://github.com/vuejs/core/commit/208e59c9d9e44765b2bd6eccbf7f6f395ae18979)) +* jest -> vitest ([014dcd5](https://github.com/vuejs/core/commit/014dcd5aa45a62927a96424d522d36255b741575)) +* ref newVal arg incorrect ([62dc5ee](https://github.com/vuejs/core/commit/62dc5ee1d132fdbb711a1ae9736293c75593f82a)) +* revert effects trigger order ([4a3e554](https://github.com/vuejs/core/commit/4a3e554d56a0e35c709801a087aadaaf956cd380)) +* **types:** improve defineProps return type with generic arguments ([91a931a](https://github.com/vuejs/core/commit/91a931ae8707b8d43f10216e1ce8e18b12158f99)) +* **types:** more public type argument order fix ([af563bf](https://github.com/vuejs/core/commit/af563bf428200367b6f5bb7944f690c85d810202)) +* **types:** retain type parameters order for public types ([bdf557f](https://github.com/vuejs/core/commit/bdf557f6f233c039fff8007b1b16aec00c4e68aa)) +* urgent assessment edge case ([eb0f8fa](https://github.com/vuejs/core/commit/eb0f8fae3891dbd841f3c59adbae51fc88a34e8f)) + + +### Features + +* **app:** app.runWithContext() ([#7451](https://github.com/vuejs/core/issues/7451)) ([869f3fb](https://github.com/vuejs/core/commit/869f3fb93e61400be4fd925e0850c2b1564749e2)) +* more purposeful test ([f3a0071](https://github.com/vuejs/core/commit/f3a007124d93b9a369692e545c5b9378e08736dd)) + + +### Performance Improvements + +* avoid duplicate trigger effect to deps ([0e0c44e](https://github.com/vuejs/core/commit/0e0c44e74f51037253c02c7186adbffb49cc3a40)) +* calculate embedded `computed()` on-demand ([f485ea0](https://github.com/vuejs/core/commit/f485ea01a9d1d7aca3bdc61b12f768de91c8d583)) +* reduce `triggerRefValue()` triggered ([399f155](https://github.com/vuejs/core/commit/399f1553c889a8b7486191ee56ce961814f26b9d)) + + +### Reverts + +* Revert "chore: add test for effect() on-demand trigger" ([b5527a1](https://github.com/vuejs/core/commit/b5527a17fa0374de2e2f39175788af30db1f594f)) +* Revert "chore: remove unused args passed to ssrRender" ([b117b88](https://github.com/vuejs/core/commit/b117b8844881a732a021432066230ff2215049ea)) + + + # [3.3.0-alpha.8](https://github.com/vuejs/core/compare/v3.3.0-alpha.7...v3.3.0-alpha.8) (2023-04-04) diff --git a/package.json b/package.json index 2f6db271c76..7da3028e73a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "packageManager": "pnpm@7.26.0", "type": "module", "scripts": { diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index 152fc9ce6cf..a7c20e8e1b8 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", @@ -33,7 +33,7 @@ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-core#readme", "dependencies": { "@babel/parser": "^7.21.3", - "@vue/shared": "3.3.0-alpha.8", + "@vue/shared": "3.3.0-alpha.9", "estree-walker": "^2.0.2", "source-map": "^0.6.1" }, diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index 007568fec7c..a73978cec7e 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", @@ -37,7 +37,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-dom#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.8", - "@vue/compiler-core": "3.3.0-alpha.8" + "@vue/shared": "3.3.0-alpha.9", + "@vue/compiler-core": "3.3.0-alpha.9" } } diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json index ce831788a9a..8c97d3b3b9b 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-sfc", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/compiler-sfc", "main": "dist/compiler-sfc.cjs.js", "module": "dist/compiler-sfc.esm-browser.js", @@ -33,11 +33,11 @@ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-sfc#readme", "dependencies": { "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.0-alpha.8", - "@vue/compiler-dom": "3.3.0-alpha.8", - "@vue/compiler-ssr": "3.3.0-alpha.8", - "@vue/reactivity-transform": "3.3.0-alpha.8", - "@vue/shared": "3.3.0-alpha.8", + "@vue/compiler-core": "3.3.0-alpha.9", + "@vue/compiler-dom": "3.3.0-alpha.9", + "@vue/compiler-ssr": "3.3.0-alpha.9", + "@vue/reactivity-transform": "3.3.0-alpha.9", + "@vue/shared": "3.3.0-alpha.9", "estree-walker": "^2.0.2", "magic-string": "^0.30.0", "postcss": "^8.1.10", diff --git a/packages/compiler-ssr/package.json b/packages/compiler-ssr/package.json index b692b9fdd0f..b1809422b1d 100644 --- a/packages/compiler-ssr/package.json +++ b/packages/compiler-ssr/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-ssr", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/compiler-ssr", "main": "dist/compiler-ssr.cjs.js", "types": "dist/compiler-ssr.d.ts", @@ -28,7 +28,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-ssr#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.8", - "@vue/compiler-dom": "3.3.0-alpha.8" + "@vue/shared": "3.3.0-alpha.9", + "@vue/compiler-dom": "3.3.0-alpha.9" } } diff --git a/packages/dts-test/package.json b/packages/dts-test/package.json index 5d5acc0989d..833b92e5008 100644 --- a/packages/dts-test/package.json +++ b/packages/dts-test/package.json @@ -4,5 +4,5 @@ "dependencies": { "vue": "workspace:*" }, - "version": "3.3.0-alpha.8" + "version": "3.3.0-alpha.9" } diff --git a/packages/reactivity-transform/package.json b/packages/reactivity-transform/package.json index 29f37dd6a49..5045a40a818 100644 --- a/packages/reactivity-transform/package.json +++ b/packages/reactivity-transform/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity-transform", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/reactivity-transform", "main": "dist/reactivity-transform.cjs.js", "files": [ @@ -29,8 +29,8 @@ "homepage": "https://github.com/vuejs/core/tree/dev/packages/reactivity-transform#readme", "dependencies": { "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.0-alpha.8", - "@vue/shared": "3.3.0-alpha.8", + "@vue/compiler-core": "3.3.0-alpha.9", + "@vue/shared": "3.3.0-alpha.9", "estree-walker": "^2.0.2", "magic-string": "^0.30.0" }, diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json index e07312dce31..4c7988e82a6 100644 --- a/packages/reactivity/package.json +++ b/packages/reactivity/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/reactivity", "main": "index.js", "module": "dist/reactivity.esm-bundler.js", @@ -36,6 +36,6 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/reactivity#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.8" + "@vue/shared": "3.3.0-alpha.9" } } diff --git a/packages/runtime-core/package.json b/packages/runtime-core/package.json index a282b8d87b4..606fef5414a 100644 --- a/packages/runtime-core/package.json +++ b/packages/runtime-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-core", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/runtime-core", "main": "index.js", "module": "dist/runtime-core.esm-bundler.js", @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-core#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.8", - "@vue/reactivity": "3.3.0-alpha.8" + "@vue/shared": "3.3.0-alpha.9", + "@vue/reactivity": "3.3.0-alpha.9" } } diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index 29cf32c048b..25da3f9657a 100644 --- a/packages/runtime-dom/package.json +++ b/packages/runtime-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-dom", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/runtime-dom", "main": "index.js", "module": "dist/runtime-dom.esm-bundler.js", @@ -35,8 +35,8 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-dom#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.8", - "@vue/runtime-core": "3.3.0-alpha.8", + "@vue/shared": "3.3.0-alpha.9", + "@vue/runtime-core": "3.3.0-alpha.9", "csstype": "^3.1.1" } } diff --git a/packages/runtime-test/package.json b/packages/runtime-test/package.json index 4c778451a92..202161c9474 100644 --- a/packages/runtime-test/package.json +++ b/packages/runtime-test/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-test", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/runtime-test", "private": true, "main": "index.js", @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-test#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.8", - "@vue/runtime-core": "3.3.0-alpha.8" + "@vue/shared": "3.3.0-alpha.9", + "@vue/runtime-core": "3.3.0-alpha.9" } } diff --git a/packages/server-renderer/package.json b/packages/server-renderer/package.json index d6d43bf82f7..9f8a2f8eafd 100644 --- a/packages/server-renderer/package.json +++ b/packages/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "@vue/server-renderer", "main": "index.js", "module": "dist/server-renderer.esm-bundler.js", @@ -32,10 +32,10 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/server-renderer#readme", "peerDependencies": { - "vue": "3.3.0-alpha.8" + "vue": "3.3.0-alpha.9" }, "dependencies": { - "@vue/shared": "3.3.0-alpha.8", - "@vue/compiler-ssr": "3.3.0-alpha.8" + "@vue/shared": "3.3.0-alpha.9", + "@vue/compiler-ssr": "3.3.0-alpha.9" } } diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index 214e81cce27..e434dd9495b 100644 --- a/packages/sfc-playground/package.json +++ b/packages/sfc-playground/package.json @@ -1,6 +1,6 @@ { "name": "@vue/sfc-playground", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "private": true, "scripts": { "dev": "vite", diff --git a/packages/shared/package.json b/packages/shared/package.json index 727e24ee626..a7ceb93b4ae 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@vue/shared", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "internal utils shared across @vue packages", "main": "index.js", "module": "dist/shared.esm-bundler.js", diff --git a/packages/size-check/package.json b/packages/size-check/package.json index 94d49cc4e6a..34c7df41c92 100644 --- a/packages/size-check/package.json +++ b/packages/size-check/package.json @@ -1,6 +1,6 @@ { "name": "@vue/size-check", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "private": true, "scripts": { "build": "vite build" diff --git a/packages/template-explorer/package.json b/packages/template-explorer/package.json index 7b42a4c3ea6..81852352839 100644 --- a/packages/template-explorer/package.json +++ b/packages/template-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/template-explorer", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "private": true, "buildOptions": { "formats": [ diff --git a/packages/vue-compat/package.json b/packages/vue-compat/package.json index aa04139c247..5032c134cf8 100644 --- a/packages/vue-compat/package.json +++ b/packages/vue-compat/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compat", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "Vue 3 compatibility build for Vue 2", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", @@ -43,6 +43,6 @@ "source-map": "^0.6.1" }, "peerDependencies": { - "vue": "3.3.0-alpha.8" + "vue": "3.3.0-alpha.9" } } diff --git a/packages/vue/package.json b/packages/vue/package.json index cb17e34700d..5a2e32f0e5a 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "vue", - "version": "3.3.0-alpha.8", + "version": "3.3.0-alpha.9", "description": "The progressive JavaScript framework for building modern web UI.", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", @@ -81,10 +81,10 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/vue#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.8", - "@vue/compiler-dom": "3.3.0-alpha.8", - "@vue/runtime-dom": "3.3.0-alpha.8", - "@vue/compiler-sfc": "3.3.0-alpha.8", - "@vue/server-renderer": "3.3.0-alpha.8" + "@vue/shared": "3.3.0-alpha.9", + "@vue/compiler-dom": "3.3.0-alpha.9", + "@vue/runtime-dom": "3.3.0-alpha.9", + "@vue/compiler-sfc": "3.3.0-alpha.9", + "@vue/server-renderer": "3.3.0-alpha.9" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5206450c2af..489f7892681 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -102,7 +102,7 @@ importers: specifiers: '@babel/parser': ^7.21.3 '@babel/types': ^7.21.3 - '@vue/shared': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.9 estree-walker: ^2.0.2 source-map: ^0.6.1 dependencies: @@ -115,8 +115,8 @@ importers: packages/compiler-dom: specifiers: - '@vue/compiler-core': 3.3.0-alpha.8 - '@vue/shared': 3.3.0-alpha.8 + '@vue/compiler-core': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.9 dependencies: '@vue/compiler-core': link:../compiler-core '@vue/shared': link:../shared @@ -127,12 +127,12 @@ importers: '@babel/types': ^7.21.3 '@types/estree': ^0.0.48 '@types/lru-cache': ^5.1.0 - '@vue/compiler-core': 3.3.0-alpha.8 - '@vue/compiler-dom': 3.3.0-alpha.8 - '@vue/compiler-ssr': 3.3.0-alpha.8 + '@vue/compiler-core': 3.3.0-alpha.9 + '@vue/compiler-dom': 3.3.0-alpha.9 + '@vue/compiler-ssr': 3.3.0-alpha.9 '@vue/consolidate': ^0.17.3 - '@vue/reactivity-transform': 3.3.0-alpha.8 - '@vue/shared': 3.3.0-alpha.8 + '@vue/reactivity-transform': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.9 estree-walker: ^2.0.2 hash-sum: ^2.0.0 lru-cache: ^5.1.1 @@ -170,8 +170,8 @@ importers: packages/compiler-ssr: specifiers: - '@vue/compiler-dom': 3.3.0-alpha.8 - '@vue/shared': 3.3.0-alpha.8 + '@vue/compiler-dom': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.9 dependencies: '@vue/compiler-dom': link:../compiler-dom '@vue/shared': link:../shared @@ -184,7 +184,7 @@ importers: packages/reactivity: specifiers: - '@vue/shared': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.9 dependencies: '@vue/shared': link:../shared @@ -193,8 +193,8 @@ importers: '@babel/core': ^7.21.3 '@babel/parser': ^7.20.15 '@babel/types': ^7.21.3 - '@vue/compiler-core': 3.3.0-alpha.8 - '@vue/shared': 3.3.0-alpha.8 + '@vue/compiler-core': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.9 estree-walker: ^2.0.2 magic-string: ^0.30.0 dependencies: @@ -209,16 +209,16 @@ importers: packages/runtime-core: specifiers: - '@vue/reactivity': 3.3.0-alpha.8 - '@vue/shared': 3.3.0-alpha.8 + '@vue/reactivity': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.9 dependencies: '@vue/reactivity': link:../reactivity '@vue/shared': link:../shared packages/runtime-dom: specifiers: - '@vue/runtime-core': 3.3.0-alpha.8 - '@vue/shared': 3.3.0-alpha.8 + '@vue/runtime-core': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.9 csstype: ^3.1.1 dependencies: '@vue/runtime-core': link:../runtime-core @@ -227,16 +227,16 @@ importers: packages/runtime-test: specifiers: - '@vue/runtime-core': 3.3.0-alpha.8 - '@vue/shared': 3.3.0-alpha.8 + '@vue/runtime-core': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.9 dependencies: '@vue/runtime-core': link:../runtime-core '@vue/shared': link:../shared packages/server-renderer: specifiers: - '@vue/compiler-ssr': 3.3.0-alpha.8 - '@vue/shared': 3.3.0-alpha.8 + '@vue/compiler-ssr': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.9 dependencies: '@vue/compiler-ssr': link:../compiler-ssr '@vue/shared': link:../shared @@ -277,11 +277,11 @@ importers: packages/vue: specifiers: - '@vue/compiler-dom': 3.3.0-alpha.8 - '@vue/compiler-sfc': 3.3.0-alpha.8 - '@vue/runtime-dom': 3.3.0-alpha.8 - '@vue/server-renderer': 3.3.0-alpha.8 - '@vue/shared': 3.3.0-alpha.8 + '@vue/compiler-dom': 3.3.0-alpha.9 + '@vue/compiler-sfc': 3.3.0-alpha.9 + '@vue/runtime-dom': 3.3.0-alpha.9 + '@vue/server-renderer': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.9 dependencies: '@vue/compiler-dom': link:../compiler-dom '@vue/compiler-sfc': link:../compiler-sfc From 909afcce8204c6ac659e57f870d918b2ddee5ab6 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Fri, 7 Apr 2023 21:18:47 +0800 Subject: [PATCH 18/34] fix: fixed effect for tests --- packages/reactivity/src/effect.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index a4d675ab411..34dc6ff7eab 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -201,10 +201,13 @@ export function effect( if (_c) { _computedsToAskDirty.push(_c) } - if (!_triggeredAfterLastEffect) { - _triggeredAfterLastEffect = true - schedulerCallbacks.push(cb) - } + } + if ( + (_dirty || _computedsToAskDirty.length) && + !_triggeredAfterLastEffect + ) { + _triggeredAfterLastEffect = true + schedulerCallbacks.push(cb) } } }) @@ -489,8 +492,9 @@ function triggerEffect( } if (isRootEffect) { state = EffectState.POST_SCHEDULER - schedulerCallbacks.forEach(cb => cb()) - schedulerCallbacks.length = 0 + while (schedulerCallbacks.length) { + schedulerCallbacks.shift()!() + } state = EffectState.NOT_TRACKING } } From da6263cb9d41c0199b91f47f26c76f778e1ead9b Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Fri, 7 Apr 2023 21:31:00 +0800 Subject: [PATCH 19/34] refactor: implement simplify --- packages/reactivity/src/effect.ts | 32 ++++++++----------------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 34dc6ff7eab..3abcf9f88de 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -194,18 +194,12 @@ export function effect( const _effect = new ReactiveEffect(fn, _c => { if (!_dirty) { - if (!_c) { + if (_c) { + _computedsToAskDirty.push(_c) + } else { _dirty = true } - if (state === EffectState.TRACKING) { - if (_c) { - _computedsToAskDirty.push(_c) - } - } - if ( - (_dirty || _computedsToAskDirty.length) && - !_triggeredAfterLastEffect - ) { + if (!_triggeredAfterLastEffect) { _triggeredAfterLastEffect = true schedulerCallbacks.push(cb) } @@ -462,24 +456,15 @@ export function triggerEffects( const schedulerCallbacks: (() => void)[] = [] -const enum EffectState { - NOT_TRACKING = 0, - TRACKING = 1, - POST_SCHEDULER = 2 -} - -let state = EffectState.NOT_TRACKING +let tracking = false function triggerEffect( effect: ReactiveEffect, computedToAskDirty: ComputedRefImpl | undefined, debuggerEventExtraInfo?: DebuggerEventExtraInfo ) { - let isRootEffect = false - if (state === EffectState.NOT_TRACKING) { - state = EffectState.TRACKING - isRootEffect = true - } + let isRootEffect = !tracking + tracking = true if (effect !== activeEffect || effect.allowRecurse) { if (__DEV__ && effect.onTrigger) { effect.onTrigger(extend({ effect }, debuggerEventExtraInfo)) @@ -491,11 +476,10 @@ function triggerEffect( } } if (isRootEffect) { - state = EffectState.POST_SCHEDULER while (schedulerCallbacks.length) { schedulerCallbacks.shift()!() } - state = EffectState.NOT_TRACKING + tracking = false } } From d2fd264982451467a2aa4089c92ac3ebf6101034 Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Fri, 7 Apr 2023 23:01:59 +0800 Subject: [PATCH 20/34] Revert "release: v3.3.0-alpha.9" This reverts commit 889511719721b754e774b42f1bc3e43391a30f35. --- CHANGELOG.md | 38 ---------------- package.json | 2 +- packages/compiler-core/package.json | 4 +- packages/compiler-dom/package.json | 6 +-- packages/compiler-sfc/package.json | 12 ++--- packages/compiler-ssr/package.json | 6 +-- packages/dts-test/package.json | 2 +- packages/reactivity-transform/package.json | 6 +-- packages/reactivity/package.json | 4 +- packages/runtime-core/package.json | 6 +-- packages/runtime-dom/package.json | 6 +-- packages/runtime-test/package.json | 6 +-- packages/server-renderer/package.json | 8 ++-- packages/sfc-playground/package.json | 2 +- packages/shared/package.json | 2 +- packages/size-check/package.json | 2 +- packages/template-explorer/package.json | 2 +- packages/vue-compat/package.json | 4 +- packages/vue/package.json | 12 ++--- pnpm-lock.yaml | 52 +++++++++++----------- 20 files changed, 72 insertions(+), 110 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5841b02aaa8..1c7ba846f5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,41 +1,3 @@ -# [3.3.0-alpha.9](https://github.com/vuejs/core/compare/v3.3.0-alpha.8...v3.3.0-alpha.9) (2023-04-07) - - -### Bug Fixes - -* avoid track unrelated effects ([7768d43](https://github.com/vuejs/core/commit/7768d43175ca58dd7bb8eec00a3db3f13f12ef45)) -* **compiler-sfc:** skip empty `defineOptions` and support TypeScript type assertions ([#8028](https://github.com/vuejs/core/issues/8028)) ([9557529](https://github.com/vuejs/core/commit/955752951e1d31b90d817bd20830fe3f89018771)) -* **compiler-ssr:** disable v-once transform in ssr vdom fallback branch ([05f94cf](https://github.com/vuejs/core/commit/05f94cf7b01dd05ed7d3170916a38b175d5df292)), closes [#7644](https://github.com/vuejs/core/issues/7644) -* computed effect dons't transfer ([208e59c](https://github.com/vuejs/core/commit/208e59c9d9e44765b2bd6eccbf7f6f395ae18979)) -* jest -> vitest ([014dcd5](https://github.com/vuejs/core/commit/014dcd5aa45a62927a96424d522d36255b741575)) -* ref newVal arg incorrect ([62dc5ee](https://github.com/vuejs/core/commit/62dc5ee1d132fdbb711a1ae9736293c75593f82a)) -* revert effects trigger order ([4a3e554](https://github.com/vuejs/core/commit/4a3e554d56a0e35c709801a087aadaaf956cd380)) -* **types:** improve defineProps return type with generic arguments ([91a931a](https://github.com/vuejs/core/commit/91a931ae8707b8d43f10216e1ce8e18b12158f99)) -* **types:** more public type argument order fix ([af563bf](https://github.com/vuejs/core/commit/af563bf428200367b6f5bb7944f690c85d810202)) -* **types:** retain type parameters order for public types ([bdf557f](https://github.com/vuejs/core/commit/bdf557f6f233c039fff8007b1b16aec00c4e68aa)) -* urgent assessment edge case ([eb0f8fa](https://github.com/vuejs/core/commit/eb0f8fae3891dbd841f3c59adbae51fc88a34e8f)) - - -### Features - -* **app:** app.runWithContext() ([#7451](https://github.com/vuejs/core/issues/7451)) ([869f3fb](https://github.com/vuejs/core/commit/869f3fb93e61400be4fd925e0850c2b1564749e2)) -* more purposeful test ([f3a0071](https://github.com/vuejs/core/commit/f3a007124d93b9a369692e545c5b9378e08736dd)) - - -### Performance Improvements - -* avoid duplicate trigger effect to deps ([0e0c44e](https://github.com/vuejs/core/commit/0e0c44e74f51037253c02c7186adbffb49cc3a40)) -* calculate embedded `computed()` on-demand ([f485ea0](https://github.com/vuejs/core/commit/f485ea01a9d1d7aca3bdc61b12f768de91c8d583)) -* reduce `triggerRefValue()` triggered ([399f155](https://github.com/vuejs/core/commit/399f1553c889a8b7486191ee56ce961814f26b9d)) - - -### Reverts - -* Revert "chore: add test for effect() on-demand trigger" ([b5527a1](https://github.com/vuejs/core/commit/b5527a17fa0374de2e2f39175788af30db1f594f)) -* Revert "chore: remove unused args passed to ssrRender" ([b117b88](https://github.com/vuejs/core/commit/b117b8844881a732a021432066230ff2215049ea)) - - - # [3.3.0-alpha.8](https://github.com/vuejs/core/compare/v3.3.0-alpha.7...v3.3.0-alpha.8) (2023-04-04) diff --git a/package.json b/package.json index 7da3028e73a..2f6db271c76 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "packageManager": "pnpm@7.26.0", "type": "module", "scripts": { diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index a7c20e8e1b8..152fc9ce6cf 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", @@ -33,7 +33,7 @@ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-core#readme", "dependencies": { "@babel/parser": "^7.21.3", - "@vue/shared": "3.3.0-alpha.9", + "@vue/shared": "3.3.0-alpha.8", "estree-walker": "^2.0.2", "source-map": "^0.6.1" }, diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index a73978cec7e..007568fec7c 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", @@ -37,7 +37,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-dom#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.9", - "@vue/compiler-core": "3.3.0-alpha.9" + "@vue/shared": "3.3.0-alpha.8", + "@vue/compiler-core": "3.3.0-alpha.8" } } diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json index 8c97d3b3b9b..ce831788a9a 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-sfc", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/compiler-sfc", "main": "dist/compiler-sfc.cjs.js", "module": "dist/compiler-sfc.esm-browser.js", @@ -33,11 +33,11 @@ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-sfc#readme", "dependencies": { "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.0-alpha.9", - "@vue/compiler-dom": "3.3.0-alpha.9", - "@vue/compiler-ssr": "3.3.0-alpha.9", - "@vue/reactivity-transform": "3.3.0-alpha.9", - "@vue/shared": "3.3.0-alpha.9", + "@vue/compiler-core": "3.3.0-alpha.8", + "@vue/compiler-dom": "3.3.0-alpha.8", + "@vue/compiler-ssr": "3.3.0-alpha.8", + "@vue/reactivity-transform": "3.3.0-alpha.8", + "@vue/shared": "3.3.0-alpha.8", "estree-walker": "^2.0.2", "magic-string": "^0.30.0", "postcss": "^8.1.10", diff --git a/packages/compiler-ssr/package.json b/packages/compiler-ssr/package.json index b1809422b1d..b692b9fdd0f 100644 --- a/packages/compiler-ssr/package.json +++ b/packages/compiler-ssr/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-ssr", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/compiler-ssr", "main": "dist/compiler-ssr.cjs.js", "types": "dist/compiler-ssr.d.ts", @@ -28,7 +28,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-ssr#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.9", - "@vue/compiler-dom": "3.3.0-alpha.9" + "@vue/shared": "3.3.0-alpha.8", + "@vue/compiler-dom": "3.3.0-alpha.8" } } diff --git a/packages/dts-test/package.json b/packages/dts-test/package.json index 833b92e5008..5d5acc0989d 100644 --- a/packages/dts-test/package.json +++ b/packages/dts-test/package.json @@ -4,5 +4,5 @@ "dependencies": { "vue": "workspace:*" }, - "version": "3.3.0-alpha.9" + "version": "3.3.0-alpha.8" } diff --git a/packages/reactivity-transform/package.json b/packages/reactivity-transform/package.json index 5045a40a818..29f37dd6a49 100644 --- a/packages/reactivity-transform/package.json +++ b/packages/reactivity-transform/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity-transform", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/reactivity-transform", "main": "dist/reactivity-transform.cjs.js", "files": [ @@ -29,8 +29,8 @@ "homepage": "https://github.com/vuejs/core/tree/dev/packages/reactivity-transform#readme", "dependencies": { "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.0-alpha.9", - "@vue/shared": "3.3.0-alpha.9", + "@vue/compiler-core": "3.3.0-alpha.8", + "@vue/shared": "3.3.0-alpha.8", "estree-walker": "^2.0.2", "magic-string": "^0.30.0" }, diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json index 4c7988e82a6..e07312dce31 100644 --- a/packages/reactivity/package.json +++ b/packages/reactivity/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/reactivity", "main": "index.js", "module": "dist/reactivity.esm-bundler.js", @@ -36,6 +36,6 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/reactivity#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.9" + "@vue/shared": "3.3.0-alpha.8" } } diff --git a/packages/runtime-core/package.json b/packages/runtime-core/package.json index 606fef5414a..a282b8d87b4 100644 --- a/packages/runtime-core/package.json +++ b/packages/runtime-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-core", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/runtime-core", "main": "index.js", "module": "dist/runtime-core.esm-bundler.js", @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-core#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.9", - "@vue/reactivity": "3.3.0-alpha.9" + "@vue/shared": "3.3.0-alpha.8", + "@vue/reactivity": "3.3.0-alpha.8" } } diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index 25da3f9657a..29cf32c048b 100644 --- a/packages/runtime-dom/package.json +++ b/packages/runtime-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-dom", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/runtime-dom", "main": "index.js", "module": "dist/runtime-dom.esm-bundler.js", @@ -35,8 +35,8 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-dom#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.9", - "@vue/runtime-core": "3.3.0-alpha.9", + "@vue/shared": "3.3.0-alpha.8", + "@vue/runtime-core": "3.3.0-alpha.8", "csstype": "^3.1.1" } } diff --git a/packages/runtime-test/package.json b/packages/runtime-test/package.json index 202161c9474..4c778451a92 100644 --- a/packages/runtime-test/package.json +++ b/packages/runtime-test/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-test", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/runtime-test", "private": true, "main": "index.js", @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-test#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.9", - "@vue/runtime-core": "3.3.0-alpha.9" + "@vue/shared": "3.3.0-alpha.8", + "@vue/runtime-core": "3.3.0-alpha.8" } } diff --git a/packages/server-renderer/package.json b/packages/server-renderer/package.json index 9f8a2f8eafd..d6d43bf82f7 100644 --- a/packages/server-renderer/package.json +++ b/packages/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "@vue/server-renderer", "main": "index.js", "module": "dist/server-renderer.esm-bundler.js", @@ -32,10 +32,10 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/server-renderer#readme", "peerDependencies": { - "vue": "3.3.0-alpha.9" + "vue": "3.3.0-alpha.8" }, "dependencies": { - "@vue/shared": "3.3.0-alpha.9", - "@vue/compiler-ssr": "3.3.0-alpha.9" + "@vue/shared": "3.3.0-alpha.8", + "@vue/compiler-ssr": "3.3.0-alpha.8" } } diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index e434dd9495b..214e81cce27 100644 --- a/packages/sfc-playground/package.json +++ b/packages/sfc-playground/package.json @@ -1,6 +1,6 @@ { "name": "@vue/sfc-playground", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "private": true, "scripts": { "dev": "vite", diff --git a/packages/shared/package.json b/packages/shared/package.json index a7ceb93b4ae..727e24ee626 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@vue/shared", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "internal utils shared across @vue packages", "main": "index.js", "module": "dist/shared.esm-bundler.js", diff --git a/packages/size-check/package.json b/packages/size-check/package.json index 34c7df41c92..94d49cc4e6a 100644 --- a/packages/size-check/package.json +++ b/packages/size-check/package.json @@ -1,6 +1,6 @@ { "name": "@vue/size-check", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "private": true, "scripts": { "build": "vite build" diff --git a/packages/template-explorer/package.json b/packages/template-explorer/package.json index 81852352839..7b42a4c3ea6 100644 --- a/packages/template-explorer/package.json +++ b/packages/template-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/template-explorer", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "private": true, "buildOptions": { "formats": [ diff --git a/packages/vue-compat/package.json b/packages/vue-compat/package.json index 5032c134cf8..aa04139c247 100644 --- a/packages/vue-compat/package.json +++ b/packages/vue-compat/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compat", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "Vue 3 compatibility build for Vue 2", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", @@ -43,6 +43,6 @@ "source-map": "^0.6.1" }, "peerDependencies": { - "vue": "3.3.0-alpha.9" + "vue": "3.3.0-alpha.8" } } diff --git a/packages/vue/package.json b/packages/vue/package.json index 5a2e32f0e5a..cb17e34700d 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "vue", - "version": "3.3.0-alpha.9", + "version": "3.3.0-alpha.8", "description": "The progressive JavaScript framework for building modern web UI.", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", @@ -81,10 +81,10 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/vue#readme", "dependencies": { - "@vue/shared": "3.3.0-alpha.9", - "@vue/compiler-dom": "3.3.0-alpha.9", - "@vue/runtime-dom": "3.3.0-alpha.9", - "@vue/compiler-sfc": "3.3.0-alpha.9", - "@vue/server-renderer": "3.3.0-alpha.9" + "@vue/shared": "3.3.0-alpha.8", + "@vue/compiler-dom": "3.3.0-alpha.8", + "@vue/runtime-dom": "3.3.0-alpha.8", + "@vue/compiler-sfc": "3.3.0-alpha.8", + "@vue/server-renderer": "3.3.0-alpha.8" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 489f7892681..5206450c2af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -102,7 +102,7 @@ importers: specifiers: '@babel/parser': ^7.21.3 '@babel/types': ^7.21.3 - '@vue/shared': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.8 estree-walker: ^2.0.2 source-map: ^0.6.1 dependencies: @@ -115,8 +115,8 @@ importers: packages/compiler-dom: specifiers: - '@vue/compiler-core': 3.3.0-alpha.9 - '@vue/shared': 3.3.0-alpha.9 + '@vue/compiler-core': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.8 dependencies: '@vue/compiler-core': link:../compiler-core '@vue/shared': link:../shared @@ -127,12 +127,12 @@ importers: '@babel/types': ^7.21.3 '@types/estree': ^0.0.48 '@types/lru-cache': ^5.1.0 - '@vue/compiler-core': 3.3.0-alpha.9 - '@vue/compiler-dom': 3.3.0-alpha.9 - '@vue/compiler-ssr': 3.3.0-alpha.9 + '@vue/compiler-core': 3.3.0-alpha.8 + '@vue/compiler-dom': 3.3.0-alpha.8 + '@vue/compiler-ssr': 3.3.0-alpha.8 '@vue/consolidate': ^0.17.3 - '@vue/reactivity-transform': 3.3.0-alpha.9 - '@vue/shared': 3.3.0-alpha.9 + '@vue/reactivity-transform': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.8 estree-walker: ^2.0.2 hash-sum: ^2.0.0 lru-cache: ^5.1.1 @@ -170,8 +170,8 @@ importers: packages/compiler-ssr: specifiers: - '@vue/compiler-dom': 3.3.0-alpha.9 - '@vue/shared': 3.3.0-alpha.9 + '@vue/compiler-dom': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.8 dependencies: '@vue/compiler-dom': link:../compiler-dom '@vue/shared': link:../shared @@ -184,7 +184,7 @@ importers: packages/reactivity: specifiers: - '@vue/shared': 3.3.0-alpha.9 + '@vue/shared': 3.3.0-alpha.8 dependencies: '@vue/shared': link:../shared @@ -193,8 +193,8 @@ importers: '@babel/core': ^7.21.3 '@babel/parser': ^7.20.15 '@babel/types': ^7.21.3 - '@vue/compiler-core': 3.3.0-alpha.9 - '@vue/shared': 3.3.0-alpha.9 + '@vue/compiler-core': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.8 estree-walker: ^2.0.2 magic-string: ^0.30.0 dependencies: @@ -209,16 +209,16 @@ importers: packages/runtime-core: specifiers: - '@vue/reactivity': 3.3.0-alpha.9 - '@vue/shared': 3.3.0-alpha.9 + '@vue/reactivity': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.8 dependencies: '@vue/reactivity': link:../reactivity '@vue/shared': link:../shared packages/runtime-dom: specifiers: - '@vue/runtime-core': 3.3.0-alpha.9 - '@vue/shared': 3.3.0-alpha.9 + '@vue/runtime-core': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.8 csstype: ^3.1.1 dependencies: '@vue/runtime-core': link:../runtime-core @@ -227,16 +227,16 @@ importers: packages/runtime-test: specifiers: - '@vue/runtime-core': 3.3.0-alpha.9 - '@vue/shared': 3.3.0-alpha.9 + '@vue/runtime-core': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.8 dependencies: '@vue/runtime-core': link:../runtime-core '@vue/shared': link:../shared packages/server-renderer: specifiers: - '@vue/compiler-ssr': 3.3.0-alpha.9 - '@vue/shared': 3.3.0-alpha.9 + '@vue/compiler-ssr': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.8 dependencies: '@vue/compiler-ssr': link:../compiler-ssr '@vue/shared': link:../shared @@ -277,11 +277,11 @@ importers: packages/vue: specifiers: - '@vue/compiler-dom': 3.3.0-alpha.9 - '@vue/compiler-sfc': 3.3.0-alpha.9 - '@vue/runtime-dom': 3.3.0-alpha.9 - '@vue/server-renderer': 3.3.0-alpha.9 - '@vue/shared': 3.3.0-alpha.9 + '@vue/compiler-dom': 3.3.0-alpha.8 + '@vue/compiler-sfc': 3.3.0-alpha.8 + '@vue/runtime-dom': 3.3.0-alpha.8 + '@vue/server-renderer': 3.3.0-alpha.8 + '@vue/shared': 3.3.0-alpha.8 dependencies: '@vue/compiler-dom': link:../compiler-dom '@vue/compiler-sfc': link:../compiler-sfc From 6c9f058270b9be46a272a233b2ceafa25f6bc76e Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 06:12:59 +0800 Subject: [PATCH 21/34] chore: naming --- packages/reactivity/src/computed.ts | 25 ++++++++++++------------- packages/reactivity/src/effect.ts | 15 +++++++++------ packages/reactivity/src/ref.ts | 6 +++--- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index 5a92b42624e..f9750541f3c 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -38,11 +38,10 @@ export class ComputedRefImpl { public readonly [ReactiveFlags.IS_READONLY]: boolean = false public _dirty = true + public _scheduled = false + public _deferredComputed: ComputedRefImpl[] = [] public _cacheable: boolean - private _computedsToAskDirty: ComputedRefImpl[] = [] - private _triggeredAfterLastEffect = false - constructor( getter: ComputedGetter, private readonly _setter: ComputedSetter, @@ -52,12 +51,12 @@ export class ComputedRefImpl { this.effect = new ReactiveEffect(getter, _c => { if (!this._dirty) { if (_c) { - this._computedsToAskDirty.push(_c) + this._deferredComputed.push(_c) } else { this._dirty = true } - if (!this._triggeredAfterLastEffect) { - this._triggeredAfterLastEffect = true + if (!this._scheduled) { + this._scheduled = true triggerRefValue(this, this) } } @@ -70,17 +69,17 @@ export class ComputedRefImpl { get value() { // the computed ref may get wrapped by other proxies e.g. readonly() #3376 const self = toRaw(this) - if (!self._dirty && self._computedsToAskDirty.length) { + if (!self._dirty && self._deferredComputed.length) { pauseTracking() - if (self._computedsToAskDirty.length >= 2) { - self._computedsToAskDirty = self._computedsToAskDirty.sort((a, b) => { + if (self._deferredComputed.length >= 2) { + self._deferredComputed = self._deferredComputed.sort((a, b) => { const aIndex = self.effect.deps.indexOf(a.dep!) const bIndex = self.effect.deps.indexOf(b.dep!) return aIndex - bIndex }) } - for (const computedToAskDirty of self._computedsToAskDirty) { - computedToAskDirty.value + for (const deferredComputed of self._deferredComputed) { + deferredComputed.value if (self._dirty) { break } @@ -95,9 +94,9 @@ export class ComputedRefImpl { } self._value = newValue self._dirty = false - self._triggeredAfterLastEffect = false + self._scheduled = false } - self._computedsToAskDirty.length = 0 + self._deferredComputed.length = 0 return self._value } diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 1ef95b31cd7..e3c500a5e24 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -30,7 +30,10 @@ export let trackOpBit = 1 */ const maxMarkerBits = 30 -export type EffectScheduler = (computedToAskDirty: ComputedRefImpl | undefined, ...args: any[]) => any +export type EffectScheduler = ( + deferredComputed: ComputedRefImpl | undefined, + ...args: any[] +) => any export type DebuggerEvent = { effect: ReactiveEffect @@ -392,26 +395,26 @@ export function trigger( export function triggerEffects( dep: Dep | ReactiveEffect[], - computedToAskDirty: ComputedRefImpl | undefined, + deferredComputed: ComputedRefImpl | undefined, debuggerEventExtraInfo?: DebuggerEventExtraInfo ) { // spread into array for stabilization const effects = isArray(dep) ? dep : [...dep] for (const effect of effects) { if (effect.computed) { - triggerEffect(effect, computedToAskDirty, debuggerEventExtraInfo) + triggerEffect(effect, deferredComputed, debuggerEventExtraInfo) } } for (const effect of effects) { if (!effect.computed) { - triggerEffect(effect, computedToAskDirty, debuggerEventExtraInfo) + triggerEffect(effect, deferredComputed, debuggerEventExtraInfo) } } } function triggerEffect( effect: ReactiveEffect, - computedToAskDirty: ComputedRefImpl | undefined, + deferredComputed: ComputedRefImpl | undefined, debuggerEventExtraInfo?: DebuggerEventExtraInfo ) { if (effect !== activeEffect || effect.allowRecurse) { @@ -419,7 +422,7 @@ function triggerEffect( effect.onTrigger(extend({ effect }, debuggerEventExtraInfo)) } if (effect.scheduler) { - effect.scheduler(computedToAskDirty) + effect.scheduler(deferredComputed) } else { effect.run() } diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 3fc594efbf8..d01058763a8 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -55,21 +55,21 @@ export function trackRefValue(ref: RefBase) { export function triggerRefValue( ref: RefBase, - computedToAskDirty: ComputedRefImpl | undefined, + deferredComputed: ComputedRefImpl | undefined, newVal?: any ) { ref = toRaw(ref) const dep = ref.dep if (dep) { if (__DEV__) { - triggerEffects(dep, computedToAskDirty, { + triggerEffects(dep, deferredComputed, { target: ref, type: TriggerOpTypes.SET, key: 'value', newValue: newVal }) } else { - triggerEffects(dep, computedToAskDirty) + triggerEffects(dep, deferredComputed) } } } From 66bcc3e05d8c7c60afc1fbc28e913bd1de49a9bf Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 06:15:06 +0800 Subject: [PATCH 22/34] chore: with "s" --- packages/reactivity/src/computed.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index f9750541f3c..1b953e5870d 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -39,7 +39,7 @@ export class ComputedRefImpl { public _dirty = true public _scheduled = false - public _deferredComputed: ComputedRefImpl[] = [] + public _deferredComputeds: ComputedRefImpl[] = [] public _cacheable: boolean constructor( @@ -51,7 +51,7 @@ export class ComputedRefImpl { this.effect = new ReactiveEffect(getter, _c => { if (!this._dirty) { if (_c) { - this._deferredComputed.push(_c) + this._deferredComputeds.push(_c) } else { this._dirty = true } @@ -69,16 +69,16 @@ export class ComputedRefImpl { get value() { // the computed ref may get wrapped by other proxies e.g. readonly() #3376 const self = toRaw(this) - if (!self._dirty && self._deferredComputed.length) { + if (!self._dirty && self._deferredComputeds.length) { pauseTracking() - if (self._deferredComputed.length >= 2) { - self._deferredComputed = self._deferredComputed.sort((a, b) => { + if (self._deferredComputeds.length >= 2) { + self._deferredComputeds = self._deferredComputeds.sort((a, b) => { const aIndex = self.effect.deps.indexOf(a.dep!) const bIndex = self.effect.deps.indexOf(b.dep!) return aIndex - bIndex }) } - for (const deferredComputed of self._deferredComputed) { + for (const deferredComputed of self._deferredComputeds) { deferredComputed.value if (self._dirty) { break @@ -96,7 +96,7 @@ export class ComputedRefImpl { self._dirty = false self._scheduled = false } - self._deferredComputed.length = 0 + self._deferredComputeds.length = 0 return self._value } From debddde6ee056971a9e679800af05096cae795a5 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 06:17:49 +0800 Subject: [PATCH 23/34] chore: naming --- packages/reactivity/src/effect.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 363740ad48d..434d1c621ff 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -189,18 +189,18 @@ export function effect( } let _dirty = false - let _triggeredAfterLastEffect = false - let _computedsToAskDirty: ComputedRefImpl[] = [] + let _scheduled = false + let _deferredComputeds: ComputedRefImpl[] = [] const _effect = new ReactiveEffect(fn, _c => { if (!_dirty) { if (_c) { - _computedsToAskDirty.push(_c) + _deferredComputeds.push(_c) } else { _dirty = true } - if (!_triggeredAfterLastEffect) { - _triggeredAfterLastEffect = true + if (!_scheduled) { + _scheduled = true schedulerCallbacks.push(cb) } } @@ -217,16 +217,16 @@ export function effect( return runner function cb() { - if (!_dirty && _computedsToAskDirty.length) { + if (!_dirty && _deferredComputeds.length) { pauseTracking() - if (_computedsToAskDirty.length >= 2) { - _computedsToAskDirty = _computedsToAskDirty.sort((a, b) => { + if (_deferredComputeds.length >= 2) { + _deferredComputeds = _deferredComputeds.sort((a, b) => { const aIndex = _effect.deps.indexOf(a.dep!) const bIndex = _effect.deps.indexOf(b.dep!) return aIndex - bIndex }) } - for (const computedToAskDirty of _computedsToAskDirty) { + for (const computedToAskDirty of _deferredComputeds) { computedToAskDirty.value if (_dirty) { break @@ -238,8 +238,8 @@ export function effect( _dirty = false _effect.run() } - _computedsToAskDirty.length = 0 - _triggeredAfterLastEffect = false + _deferredComputeds.length = 0 + _scheduled = false } } From ba6688019c39d4e3dd70df35b8d86b19b0c4c821 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 06:41:11 +0800 Subject: [PATCH 24/34] chore: undo format --- packages/compiler-sfc/src/script/importUsageCheck.ts | 6 +----- packages/runtime-core/src/components/Teleport.ts | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/compiler-sfc/src/script/importUsageCheck.ts b/packages/compiler-sfc/src/script/importUsageCheck.ts index f3c3932d829..7019dcf2312 100644 --- a/packages/compiler-sfc/src/script/importUsageCheck.ts +++ b/packages/compiler-sfc/src/script/importUsageCheck.ts @@ -63,11 +63,7 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) { )}` } } - if ( - prop.type === NodeTypes.ATTRIBUTE && - prop.name === 'ref' && - prop.value?.content - ) { + if (prop.type === NodeTypes.ATTRIBUTE && prop.name === 'ref' && prop.value?.content) { code += `,${prop.value.content}` } } diff --git a/packages/runtime-core/src/components/Teleport.ts b/packages/runtime-core/src/components/Teleport.ts index 19ccbc5de27..4f7d16bc7d1 100644 --- a/packages/runtime-core/src/components/Teleport.ts +++ b/packages/runtime-core/src/components/Teleport.ts @@ -400,7 +400,7 @@ function hydrateTeleport( // Force-casted public typing for h and TSX props inference export const Teleport = TeleportImpl as unknown as { __isTeleport: true - new (): { + new(): { $props: VNodeProps & TeleportProps $slots: { default(): VNode[] From cb081f6878fc65d0166820b97ff11dcd8efd729f Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 06:49:01 +0800 Subject: [PATCH 25/34] chore: `_c` -> `deferredComputed` --- packages/reactivity/src/computed.ts | 6 +++--- packages/reactivity/src/deferredComputed.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index 1b953e5870d..f00f324a59f 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -48,10 +48,10 @@ export class ComputedRefImpl { isReadonly: boolean, isSSR: boolean ) { - this.effect = new ReactiveEffect(getter, _c => { + this.effect = new ReactiveEffect(getter, deferredComputed => { if (!this._dirty) { - if (_c) { - this._deferredComputeds.push(_c) + if (deferredComputed) { + this._deferredComputeds.push(deferredComputed) } else { this._dirty = true } diff --git a/packages/reactivity/src/deferredComputed.ts b/packages/reactivity/src/deferredComputed.ts index 07b4a496bf4..527da3911e5 100644 --- a/packages/reactivity/src/deferredComputed.ts +++ b/packages/reactivity/src/deferredComputed.ts @@ -38,7 +38,7 @@ class DeferredComputedRefImpl { let compareTarget: any let hasCompareTarget = false let scheduled = false - this.effect = new ReactiveEffect(getter, (_c, computedTrigger?: boolean) => { + this.effect = new ReactiveEffect(getter, (_deferredComputed, computedTrigger?: boolean) => { if (this.dep) { if (computedTrigger) { compareTarget = this._value From 76e2e6e2c512ad1af63e22a66af46022c628e964 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 06:50:53 +0800 Subject: [PATCH 26/34] chore: `_c` -> `deferredComputed` --- packages/reactivity/src/effect.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 434d1c621ff..da4f4cf0897 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -192,10 +192,10 @@ export function effect( let _scheduled = false let _deferredComputeds: ComputedRefImpl[] = [] - const _effect = new ReactiveEffect(fn, _c => { + const _effect = new ReactiveEffect(fn, deferredComputed => { if (!_dirty) { - if (_c) { - _deferredComputeds.push(_c) + if (deferredComputed) { + _deferredComputeds.push(deferredComputed) } else { _dirty = true } From de4e436423c2971c4469a3407e7de44435ab6848 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 07:12:47 +0800 Subject: [PATCH 27/34] chore: expressiveness --- packages/reactivity/src/effect.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index da4f4cf0897..f21de71df02 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -456,15 +456,15 @@ export function triggerEffects( const schedulerCallbacks: (() => void)[] = [] -let tracking = false +let triggeringEffect = false function triggerEffect( effect: ReactiveEffect, deferredComputed: ComputedRefImpl | undefined, debuggerEventExtraInfo?: DebuggerEventExtraInfo ) { - let isRootEffect = !tracking - tracking = true + const isRootTrigger = !triggeringEffect + triggeringEffect = true if (effect !== activeEffect || effect.allowRecurse) { if (__DEV__ && effect.onTrigger) { effect.onTrigger(extend({ effect }, debuggerEventExtraInfo)) @@ -475,11 +475,11 @@ function triggerEffect( effect.run() } } - if (isRootEffect) { + if (isRootTrigger) { while (schedulerCallbacks.length) { schedulerCallbacks.shift()!() } - tracking = false + triggeringEffect = false } } From 6c13a3021017f9631222b91ca79b2745eca6e4f7 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 07:22:35 +0800 Subject: [PATCH 28/34] refactor: reuse `effectTrackDepth` --- packages/reactivity/src/effect.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index f21de71df02..656a5cbeefd 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -456,15 +456,12 @@ export function triggerEffects( const schedulerCallbacks: (() => void)[] = [] -let triggeringEffect = false - function triggerEffect( effect: ReactiveEffect, deferredComputed: ComputedRefImpl | undefined, debuggerEventExtraInfo?: DebuggerEventExtraInfo ) { - const isRootTrigger = !triggeringEffect - triggeringEffect = true + const isRootTrigger = effectTrackDepth === 0 if (effect !== activeEffect || effect.allowRecurse) { if (__DEV__ && effect.onTrigger) { effect.onTrigger(extend({ effect }, debuggerEventExtraInfo)) @@ -479,7 +476,6 @@ function triggerEffect( while (schedulerCallbacks.length) { schedulerCallbacks.shift()!() } - triggeringEffect = false } } From ef2a6e3e68f16dc10fce84c40089de41272538c1 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 07:28:54 +0800 Subject: [PATCH 29/34] refactor: remove unneeded `pauseTracking()`, `resetTracking()` --- packages/reactivity/src/effect.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 656a5cbeefd..ce3b1ede9e4 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -201,7 +201,7 @@ export function effect( } if (!_scheduled) { _scheduled = true - schedulerCallbacks.push(cb) + pendingEffectRunners.push(run) } } }) @@ -216,9 +216,8 @@ export function effect( runner.effect = _effect return runner - function cb() { + function run() { if (!_dirty && _deferredComputeds.length) { - pauseTracking() if (_deferredComputeds.length >= 2) { _deferredComputeds = _deferredComputeds.sort((a, b) => { const aIndex = _effect.deps.indexOf(a.dep!) @@ -232,7 +231,6 @@ export function effect( break } } - resetTracking() } if (_dirty) { _dirty = false @@ -454,7 +452,7 @@ export function triggerEffects( } } -const schedulerCallbacks: (() => void)[] = [] +const pendingEffectRunners: (() => void)[] = [] function triggerEffect( effect: ReactiveEffect, @@ -473,8 +471,8 @@ function triggerEffect( } } if (isRootTrigger) { - while (schedulerCallbacks.length) { - schedulerCallbacks.shift()!() + while (pendingEffectRunners.length) { + pendingEffectRunners.shift()!() } } } From 7bc106991aafb25cb00d0d8a731f7c727154e379 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 07:47:19 +0800 Subject: [PATCH 30/34] chore: sort in one line --- packages/reactivity/src/computed.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index f00f324a59f..065248c80b0 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -72,11 +72,10 @@ export class ComputedRefImpl { if (!self._dirty && self._deferredComputeds.length) { pauseTracking() if (self._deferredComputeds.length >= 2) { - self._deferredComputeds = self._deferredComputeds.sort((a, b) => { - const aIndex = self.effect.deps.indexOf(a.dep!) - const bIndex = self.effect.deps.indexOf(b.dep!) - return aIndex - bIndex - }) + self._deferredComputeds = self._deferredComputeds.sort( + (a, b) => + self.effect.deps.indexOf(a.dep!) - self.effect.deps.indexOf(b.dep!) + ) } for (const deferredComputed of self._deferredComputeds) { deferredComputed.value From f0512d607f102a3a1ab3c088c5e8ad3cc13fae26 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 07:48:31 +0800 Subject: [PATCH 31/34] chore: sort in one line --- packages/reactivity/src/effect.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index ce3b1ede9e4..2659f9ab6e3 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -219,11 +219,9 @@ export function effect( function run() { if (!_dirty && _deferredComputeds.length) { if (_deferredComputeds.length >= 2) { - _deferredComputeds = _deferredComputeds.sort((a, b) => { - const aIndex = _effect.deps.indexOf(a.dep!) - const bIndex = _effect.deps.indexOf(b.dep!) - return aIndex - bIndex - }) + _deferredComputeds = _deferredComputeds.sort( + (a, b) => _effect.deps.indexOf(a.dep!) - _effect.deps.indexOf(b.dep!) + ) } for (const computedToAskDirty of _deferredComputeds) { computedToAskDirty.value From 7e2ac742caac191656fb3953d2e2ccbdadf62bf4 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 07:49:35 +0800 Subject: [PATCH 32/34] chore: naming --- packages/reactivity/src/effect.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 2659f9ab6e3..4644138efad 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -223,8 +223,8 @@ export function effect( (a, b) => _effect.deps.indexOf(a.dep!) - _effect.deps.indexOf(b.dep!) ) } - for (const computedToAskDirty of _deferredComputeds) { - computedToAskDirty.value + for (const deferredComputed of _deferredComputeds) { + deferredComputed.value if (_dirty) { break } From e98d329c9395e9991e90f0222c7fd0916f0dfa86 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 07:59:07 +0800 Subject: [PATCH 33/34] chore: import type --- packages/reactivity/src/ref.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index d01058763a8..95b1a270091 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -16,9 +16,9 @@ import { isShallow } from './reactive' import type { ShallowReactiveMarker } from './reactive' +import type { ComputedRefImpl } from './computed' import { CollectionTypes } from './collectionHandlers' import { createDep, Dep } from './dep' -import { ComputedRefImpl } from './computed' declare const RefSymbol: unique symbol export declare const RawSymbol: unique symbol From d5595cbab49c4f2096595cd136dae2be6669ca45 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 1 Aug 2023 08:33:34 +0800 Subject: [PATCH 34/34] chore: narrow `pauseTracking()` --- packages/reactivity/src/computed.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index 065248c80b0..7c53e87fd38 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -70,13 +70,13 @@ export class ComputedRefImpl { // the computed ref may get wrapped by other proxies e.g. readonly() #3376 const self = toRaw(this) if (!self._dirty && self._deferredComputeds.length) { - pauseTracking() if (self._deferredComputeds.length >= 2) { self._deferredComputeds = self._deferredComputeds.sort( (a, b) => self.effect.deps.indexOf(a.dep!) - self.effect.deps.indexOf(b.dep!) ) } + pauseTracking() for (const deferredComputed of self._deferredComputeds) { deferredComputed.value if (self._dirty) {