Skip to content

Commit b2554ae

Browse files
committed
refactor: small bundle size / readability optimization
1 parent 6431040 commit b2554ae

File tree

2 files changed

+51
-59
lines changed

2 files changed

+51
-59
lines changed

packages/reactivity/src/effect.ts

+32-46
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { TrackOpTypes, TriggerOpTypes } from './operations'
2-
import { EMPTY_OBJ, isArray, isIntegerKey, isMap } from '@vue/shared'
2+
import { EMPTY_OBJ, extend, isArray, isIntegerKey, isMap } from '@vue/shared'
33

44
// The main WeakMap that stores {target -> key -> dep} connections.
55
// Conceptually, it's easier to think of a dependency as a Dep class
@@ -212,47 +212,47 @@ export function trigger(
212212
return
213213
}
214214

215-
let sets: DepSets = []
215+
let deps: (Dep | undefined)[] = []
216216
if (type === TriggerOpTypes.CLEAR) {
217217
// collection being cleared
218218
// trigger all effects for target
219-
sets = [...depsMap.values()]
219+
deps = [...depsMap.values()]
220220
} else if (key === 'length' && isArray(target)) {
221221
depsMap.forEach((dep, key) => {
222222
if (key === 'length' || key >= (newValue as number)) {
223-
sets.push(dep)
223+
deps.push(dep)
224224
}
225225
})
226226
} else {
227227
// schedule runs for SET | ADD | DELETE
228228
if (key !== void 0) {
229-
sets.push(depsMap.get(key))
229+
deps.push(depsMap.get(key))
230230
}
231231

232232
// also run for iteration key on ADD | DELETE | Map.SET
233233
switch (type) {
234234
case TriggerOpTypes.ADD:
235235
if (!isArray(target)) {
236-
sets.push(depsMap.get(ITERATE_KEY))
236+
deps.push(depsMap.get(ITERATE_KEY))
237237
if (isMap(target)) {
238-
sets.push(depsMap.get(MAP_KEY_ITERATE_KEY))
238+
deps.push(depsMap.get(MAP_KEY_ITERATE_KEY))
239239
}
240240
} else if (isIntegerKey(key)) {
241241
// new index added to array -> length changes
242-
sets.push(depsMap.get('length'))
242+
deps.push(depsMap.get('length'))
243243
}
244244
break
245245
case TriggerOpTypes.DELETE:
246246
if (!isArray(target)) {
247-
sets.push(depsMap.get(ITERATE_KEY))
247+
deps.push(depsMap.get(ITERATE_KEY))
248248
if (isMap(target)) {
249-
sets.push(depsMap.get(MAP_KEY_ITERATE_KEY))
249+
deps.push(depsMap.get(MAP_KEY_ITERATE_KEY))
250250
}
251251
}
252252
break
253253
case TriggerOpTypes.SET:
254254
if (isMap(target)) {
255-
sets.push(depsMap.get(ITERATE_KEY))
255+
deps.push(depsMap.get(ITERATE_KEY))
256256
}
257257
break
258258
}
@@ -261,51 +261,37 @@ export function trigger(
261261
const eventInfo = __DEV__
262262
? { target, type, key, newValue, oldValue, oldTarget }
263263
: undefined
264-
triggerMultiEffects(sets, eventInfo)
265-
}
266-
267-
type DepSets = (Dep | undefined)[]
268264

269-
export function triggerMultiEffects(
270-
depSets: DepSets,
271-
debuggerEventExtraInfo?: DebuggerEventExtraInfo
272-
) {
273-
if (depSets.length === 1) {
274-
if (depSets[0]) {
275-
triggerEffects(depSets[0], debuggerEventExtraInfo)
265+
if (deps.length === 1) {
266+
if (deps[0]) {
267+
triggerEffects(deps[0], eventInfo)
276268
}
277269
} else {
278-
const sets = depSets.filter(s => !!s) as Dep[]
279-
triggerEffects(concatSets(sets), debuggerEventExtraInfo)
270+
const effects: ReactiveEffect[] = []
271+
for (const dep of deps) {
272+
if (dep) {
273+
effects.push(...dep)
274+
}
275+
}
276+
triggerEffects(new Set(effects), eventInfo)
280277
}
281278
}
282279

283-
function concatSets<T>(sets: Set<T>[]): Set<T> {
284-
const all = ([] as T[]).concat(...sets.map(s => [...s!]))
285-
return new Set(all)
286-
}
287-
288280
export function triggerEffects(
289281
dep: Dep,
290282
debuggerEventExtraInfo?: DebuggerEventExtraInfo
291283
) {
292-
const run = (effect: ReactiveEffect) => {
293-
if (__DEV__ && effect.options.onTrigger) {
294-
effect.options.onTrigger(
295-
Object.assign({ effect }, debuggerEventExtraInfo)
296-
)
297-
}
298-
if (effect.options.scheduler) {
299-
effect.options.scheduler(effect)
300-
} else {
301-
effect()
302-
}
303-
}
304-
305-
const immutableDeps = [...dep]
306-
immutableDeps.forEach(effect => {
284+
// spread into array for stabilization
285+
for (const effect of [...dep]) {
307286
if (effect !== activeEffect || effect.allowRecurse) {
308-
run(effect)
287+
if (__DEV__ && effect.options.onTrigger) {
288+
effect.options.onTrigger(extend({ effect }, debuggerEventExtraInfo))
289+
}
290+
if (effect.options.scheduler) {
291+
effect.options.scheduler(effect)
292+
} else {
293+
effect()
294+
}
309295
}
310-
})
296+
}
311297
}

packages/reactivity/src/ref.ts

+19-13
Original file line numberDiff line numberDiff line change
@@ -38,28 +38,34 @@ type RefBase<T> = {
3838
export function trackRefValue(ref: RefBase<any>) {
3939
if (isTracking()) {
4040
ref = toRaw(ref)
41-
const eventInfo = __DEV__
42-
? { target: ref, type: TrackOpTypes.GET, key: 'value' }
43-
: undefined
4441
if (!ref.dep) {
4542
ref.dep = new Set<ReactiveEffect>()
4643
}
47-
trackEffects(ref.dep, eventInfo)
44+
if (__DEV__) {
45+
trackEffects(ref.dep, {
46+
target: ref,
47+
type: TrackOpTypes.GET,
48+
key: 'value'
49+
})
50+
} else {
51+
trackEffects(ref.dep)
52+
}
4853
}
4954
}
5055

5156
export function triggerRefValue(ref: RefBase<any>, newVal?: any) {
5257
ref = toRaw(ref)
5358
if (ref.dep) {
54-
const eventInfo = __DEV__
55-
? {
56-
target: ref,
57-
type: TriggerOpTypes.SET,
58-
key: 'value',
59-
newValue: newVal
60-
}
61-
: undefined
62-
triggerEffects(ref.dep, eventInfo)
59+
if (__DEV__) {
60+
triggerEffects(ref.dep, {
61+
target: ref,
62+
type: TriggerOpTypes.SET,
63+
key: 'value',
64+
newValue: newVal
65+
})
66+
} else {
67+
triggerEffects(ref.dep)
68+
}
6369
}
6470
}
6571

0 commit comments

Comments
 (0)