Skip to content

Commit cd391f1

Browse files
committed
improve useReducer performance
1 parent 90ea03e commit cd391f1

2 files changed

Lines changed: 115 additions & 102 deletions

File tree

packages/devtool-extenstion/extension/core/hook.js

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,33 +49,35 @@ export function installHook(target) {
4949
const dataToSend = {};
5050

5151
dataToSend.context = Object.keys(fiberNodeToDebug.context).reduce((memo, key) => {
52-
if (fiberNodeToDebug.context[key].valueChanged) {
52+
const debugObj = fiberNodeToDebug.context[key];
53+
if (debugObj.valueChanged) {
5354
memo[key] = {
54-
value: fiberNodeToDebug.context[key].value,
55-
displayName: fiberNodeToDebug.context[key].displayName,
56-
valueChanged: fiberNodeToDebug.context[key].valueChanged,
55+
value: debugObj.value,
56+
displayName: debugObj.displayName,
57+
valueChanged: debugObj.valueChanged,
5758
remove: true,
5859
};
5960
} else {
6061
memo[key] = {
61-
valueChanged: fiberNodeToDebug.context[key].valueChanged,
62+
valueChanged: debugObj.valueChanged,
6263
remove: true,
6364
};
6465
}
6566
return memo;
6667
}, {});
6768

6869
dataToSend.useReducer = Object.keys(fiberNodeToDebug.useReducer).reduce((memo, key) => {
69-
if (fiberNodeToDebug.useReducer[key].valueChanged) {
70+
const debugObj = fiberNodeToDebug.useReducer[key];
71+
if (debugObj.valueChanged) {
7072
memo[key] = {
71-
actions: fiberNodeToDebug.useReducer[key].actions,
72-
state: fiberNodeToDebug.useReducer[key].state,
73-
valueChanged: fiberNodeToDebug.useReducer[key].valueChanged,
74-
displayName: fiberNodeToDebug.useReducer[key].displayName,
73+
actions: debugObj.actions,
74+
state: debugObj.state,
75+
valueChanged: debugObj.valueChanged,
76+
displayName: debugObj.displayName,
7577
};
7678
} else {
7779
memo[key] = {
78-
valueChanged: fiberNodeToDebug.useReducer[key].valueChanged,
80+
valueChanged: debugObj.valueChanged,
7981
};
8082
}
8183
return memo;
@@ -95,10 +97,12 @@ export function installHook(target) {
9597
*
9698
* @param {object} hook
9799
*/
98-
const doWorkWithHooks = (hook) => {
100+
const doWorkWithHooks = (hook, hookType) => {
99101
if (
100-
hook.__reactContextDevtoolHookType == "useReducer" &&
101-
hook.queue.lastRenderedReducer
102+
(
103+
hookType === "useReducer" ||
104+
hook.__reactContextDevtoolHookType == "useReducer"
105+
) && hook.queue.lastRenderedReducer
102106
) {
103107
let debugId = hook.queue.__reactContextDevtoolDebugId;
104108

@@ -198,7 +202,7 @@ export function installHook(target) {
198202
return;
199203
}
200204

201-
const { memoizedState, tag } = fiberNode;
205+
const { memoizedState, tag, _debugHookTypes } = fiberNode;
202206

203207
if (
204208
debugOptions.debugReducer &&
@@ -207,15 +211,22 @@ export function installHook(target) {
207211
memoizedState &&
208212
Object.hasOwnProperty.call(memoizedState, "baseState")
209213
) {
210-
window.__REACT_CONTEXT_DEVTOOL_GLOBAL_HOOK.helpers.inspectHooksOfFiber(
211-
fiberNode,
212-
renderer
213-
);
214+
if (!_debugHookTypes || !_debugHookTypes.length) {
215+
try {
216+
window.__REACT_CONTEXT_DEVTOOL_GLOBAL_HOOK.helpers.inspectHooksOfFiber(
217+
fiberNode,
218+
renderer
219+
);
220+
} catch(err) {}
221+
}
214222

215223
let temp = memoizedState;
224+
const hookTypes = _debugHookTypes || [];
225+
let counter = 0;
216226
while (temp && temp.queue) {
217-
doWorkWithHooks(temp);
227+
doWorkWithHooks(temp, hookTypes[counter]);
218228
temp = temp.next;
229+
counter += 1;
219230
}
220231
}
221232

packages/devtool-extenstion/extension/core/reactDebugTool.js

Lines changed: 84 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
Dispatcher.useImperativeHandle(undefined, function () {
102102
return null;
103103
});
104-
Dispatcher.useDebugValue(null);
104+
// Dispatcher.useDebugValue(null);
105105
Dispatcher.useCallback(function () {});
106106
Dispatcher.useMemo(function () {
107107
return null;
@@ -156,11 +156,11 @@
156156
}
157157

158158
function useContext(context, observedBits) {
159-
hookLog.push({
160-
primitive: "Context",
161-
stackError: new Error(),
162-
value: context._currentValue,
163-
});
159+
// hookLog.push({
160+
// primitive: "Context",
161+
// stackError: new Error(),
162+
// value: context._currentValue,
163+
// });
164164
return context._currentValue;
165165
}
166166

@@ -195,11 +195,11 @@
195195
hook.__reactContextDevtoolHookType = "useReducer";
196196
}
197197

198-
hookLog.push({
199-
primitive: "Reducer",
200-
stackError: new Error(),
201-
value: state,
202-
});
198+
// hookLog.push({
199+
// primitive: "Reducer",
200+
// stackError: new Error(),
201+
// value: state,
202+
// });
203203
return [state, function (action) {}];
204204
}
205205

@@ -211,30 +211,30 @@
211211
: {
212212
current: initialValue,
213213
};
214-
hookLog.push({
215-
primitive: "Ref",
216-
stackError: new Error(),
217-
value: ref.current,
218-
});
214+
// hookLog.push({
215+
// primitive: "Ref",
216+
// stackError: new Error(),
217+
// value: ref.current,
218+
// });
219219
return ref;
220220
}
221221

222222
function useLayoutEffect(create, inputs) {
223223
nextHook();
224-
hookLog.push({
225-
primitive: "LayoutEffect",
226-
stackError: new Error(),
227-
value: create,
228-
});
224+
// hookLog.push({
225+
// primitive: "LayoutEffect",
226+
// stackError: new Error(),
227+
// value: create,
228+
// });
229229
}
230230

231231
function useEffect(create, inputs) {
232232
nextHook();
233-
hookLog.push({
234-
primitive: "Effect",
235-
stackError: new Error(),
236-
value: create,
237-
});
233+
// hookLog.push({
234+
// primitive: "Effect",
235+
// stackError: new Error(),
236+
// value: create,
237+
// });
238238
}
239239

240240
function useImperativeHandle(ref, create, inputs) {
@@ -243,45 +243,45 @@
243243
// have no way of knowing where. So let's only enable introspection of the
244244
// ref itself if it is using the object form.
245245

246-
var instance = undefined;
246+
// var instance = undefined;
247247

248-
if (ref !== null && typeof ref === "object") {
249-
instance = ref.current;
250-
}
248+
// if (ref !== null && typeof ref === "object") {
249+
// instance = ref.current;
250+
// }
251251

252-
hookLog.push({
253-
primitive: "ImperativeHandle",
254-
stackError: new Error(),
255-
value: instance,
256-
});
252+
// hookLog.push({
253+
// primitive: "ImperativeHandle",
254+
// stackError: new Error(),
255+
// value: instance,
256+
// });
257257
}
258258

259-
function useDebugValue(value, formatterFn) {
260-
hookLog.push({
261-
primitive: "DebugValue",
262-
stackError: new Error(),
263-
value: typeof formatterFn === "function" ? formatterFn(value) : value,
264-
});
265-
}
259+
// function useDebugValue(value, formatterFn) {
260+
// hookLog.push({
261+
// primitive: "DebugValue",
262+
// stackError: new Error(),
263+
// value: typeof formatterFn === "function" ? formatterFn(value) : value,
264+
// });
265+
// }
266266

267267
function useCallback(callback, inputs) {
268268
var hook = nextHook();
269-
hookLog.push({
270-
primitive: "Callback",
271-
stackError: new Error(),
272-
value: hook !== null ? hook.memoizedState[0] : callback,
273-
});
269+
// hookLog.push({
270+
// primitive: "Callback",
271+
// stackError: new Error(),
272+
// value: hook !== null ? hook.memoizedState[0] : callback,
273+
// });
274274
return callback;
275275
}
276276

277277
function useMemo(nextCreate, inputs) {
278278
var hook = nextHook();
279279
var value = hook !== null ? hook.memoizedState[0] : nextCreate();
280-
hookLog.push({
281-
primitive: "Memo",
282-
stackError: new Error(),
283-
value: value,
284-
});
280+
// hookLog.push({
281+
// primitive: "Memo",
282+
// stackError: new Error(),
283+
// value: value,
284+
// });
285285
return value;
286286
}
287287

@@ -298,25 +298,25 @@
298298
nextHook(); // Effect
299299

300300
var value = getSnapshot(source._source);
301-
hookLog.push({
302-
primitive: "MutableSource",
303-
stackError: new Error(),
304-
value: value,
305-
});
301+
// hookLog.push({
302+
// primitive: "MutableSource",
303+
// stackError: new Error(),
304+
// value: value,
305+
// });
306306
return value;
307307
}
308308

309309
function useResponder(responder, listenerProps) {
310310
// Don't put the actual event responder object in, just its displayName
311-
var value = {
312-
responder: responder.displayName || "EventResponder",
313-
props: listenerProps,
314-
};
315-
hookLog.push({
316-
primitive: "Responder",
317-
stackError: new Error(),
318-
value: value,
319-
});
311+
// var value = {
312+
// responder: responder.displayName || "EventResponder",
313+
// props: listenerProps,
314+
// };
315+
// hookLog.push({
316+
// primitive: "Responder",
317+
// stackError: new Error(),
318+
// value: value,
319+
// });
320320
return {
321321
responder: responder,
322322
props: listenerProps,
@@ -331,11 +331,11 @@
331331

332332
nextHook(); // Callback
333333

334-
hookLog.push({
335-
primitive: "Transition",
336-
stackError: new Error(),
337-
value: config,
338-
});
334+
// hookLog.push({
335+
// primitive: "Transition",
336+
// stackError: new Error(),
337+
// value: config,
338+
// });
339339
return [function (callback) {}, false];
340340
}
341341

@@ -347,11 +347,12 @@
347347

348348
nextHook(); // Effect
349349

350-
hookLog.push({
351-
primitive: "DeferredValue",
352-
stackError: new Error(),
353-
value: value,
354-
});
350+
// hookLog.push({
351+
// primitive: "DeferredValue",
352+
// stackError: new Error(),
353+
// value: value,
354+
// });
355+
355356
return value;
356357
}
357358

@@ -368,11 +369,12 @@
368369
value = undefined;
369370
}
370371

371-
hookLog.push({
372-
primitive: "OpaqueIdentifier",
373-
stackError: new Error(),
374-
value: value,
375-
});
372+
// hookLog.push({
373+
// primitive: "OpaqueIdentifier",
374+
// stackError: new Error(),
375+
// value: value,
376+
// });
377+
376378
return value;
377379
}
378380

@@ -382,7 +384,7 @@
382384
useContext: useContext,
383385
useEffect: useEffect,
384386
useImperativeHandle: useImperativeHandle,
385-
useDebugValue: useDebugValue,
387+
// useDebugValue: useDebugValue,
386388
useLayoutEffect: useLayoutEffect,
387389
useMemo: useMemo,
388390
useReducer: useReducer,

0 commit comments

Comments
 (0)