Skip to content

Commit 146df7c

Browse files
authored
[Fiber] Make DevTools Config use Static Injection (#30522)
We use static dependency injection. We shouldn't use this dynamic dependency injection we do for DevTools internals. There's also meta programming like spreading and stuff that isn't needed. This moves the config from `injectIntoDevTools` to the FiberConfig so it can be statically resolved. Closure Compiler has some trouble generating optimal code for this anyway so ideally we'd refactor this further but at least this is better and saves a few bytes and avoids some code paths (when minified).
1 parent f963c80 commit 146df7c

File tree

16 files changed

+141
-171
lines changed

16 files changed

+141
-171
lines changed

packages/react-art/src/ReactART.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,7 @@ class Text extends React.Component {
155155
}
156156
}
157157

158-
injectIntoDevTools({
159-
findFiberByHostInstance: () => null,
160-
bundleType: __DEV__ ? 1 : 0,
161-
version: ReactVersion,
162-
rendererPackageName: 'react-art',
163-
});
158+
injectIntoDevTools();
164159

165160
/** API */
166161

@@ -169,3 +164,5 @@ export const Group = TYPES.GROUP;
169164
export const Shape = TYPES.SHAPE;
170165
export const Path = Mode.Path;
171166
export {LinearGradient, Pattern, RadialGradient, Surface, Text, Transform};
167+
168+
export {ReactVersion as version};

packages/react-art/src/ReactFiberConfigART.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import {
1717
NoEventPriority,
1818
} from 'react-reconciler/src/ReactEventPriorities';
1919

20+
export {default as rendererVersion} from 'shared/ReactVersion';
21+
export const rendererPackageName = 'react-art';
22+
export const extraDevToolsConfig = null;
23+
2024
const pooledTransform = new Transform();
2125

2226
const NO_CONTEXT = {};
@@ -441,8 +445,8 @@ export function clearContainer(container) {
441445
// TODO Implement this
442446
}
443447

444-
export function getInstanceFromNode(node) {
445-
throw new Error('Not implemented.');
448+
export function getInstanceFromNode(node): null {
449+
return null;
446450
}
447451

448452
export function beforeActiveInstanceBlur(internalInstanceHandle: Object) {

packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ import type {
2626
PreinitModuleScriptOptions,
2727
} from 'react-dom/src/shared/ReactDOMTypes';
2828

29-
import {NotPending} from 'react-dom-bindings/src/shared/ReactDOMFormActions';
29+
import {NotPending} from '../shared/ReactDOMFormActions';
30+
3031
import {getCurrentRootHostContainer} from 'react-reconciler/src/ReactFiberHostContext';
3132

3233
import hasOwnProperty from 'shared/hasOwnProperty';
@@ -106,6 +107,10 @@ import {requestFormReset as requestFormResetOnFiber} from 'react-reconciler/src/
106107

107108
import ReactDOMSharedInternals from 'shared/ReactDOMSharedInternals';
108109

110+
export {default as rendererVersion} from 'shared/ReactVersion';
111+
export const rendererPackageName = 'react-dom';
112+
export const extraDevToolsConfig = null;
113+
109114
export type Type = string;
110115
export type Props = {
111116
autoFocus?: boolean,
@@ -616,9 +621,7 @@ const localRequestAnimationFrame =
616621
? requestAnimationFrame
617622
: scheduleTimeout;
618623

619-
export function getInstanceFromNode(node: HTMLElement): null | Object {
620-
return getClosestInstanceFromNode(node) || null;
621-
}
624+
export {getClosestInstanceFromNode as getInstanceFromNode};
622625

623626
export function preparePortalMount(portalInstance: Instance): void {
624627
listenToAllSupportedEvents(portalInstance);

packages/react-dom/src/client/ReactDOMClient.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import {
1616
import {canUseDOM} from 'shared/ExecutionEnvironment';
1717
import ReactVersion from 'shared/ReactVersion';
1818

19-
import {getClosestInstanceFromNode} from 'react-dom-bindings/src/client/ReactDOMComponentTree';
2019
import Internals from 'shared/ReactDOMSharedInternals';
2120

2221
import {ensureCorrectIsomorphicReactVersion} from '../shared/ensureCorrectIsomorphicReactVersion';
@@ -52,12 +51,7 @@ Internals.findDOMNode = findDOMNode;
5251

5352
export {ReactVersion as version, createRoot, hydrateRoot};
5453

55-
const foundDevTools = injectIntoDevTools({
56-
findFiberByHostInstance: getClosestInstanceFromNode,
57-
bundleType: __DEV__ ? 1 : 0,
58-
version: ReactVersion,
59-
rendererPackageName: 'react-dom',
60-
});
54+
const foundDevTools = injectIntoDevTools();
6155

6256
if (__DEV__) {
6357
if (!foundDevTools && canUseDOM && window.top === window.self) {

packages/react-dom/src/client/ReactDOMClientFB.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import {ensureCorrectIsomorphicReactVersion} from '../shared/ensureCorrectIsomor
2929
ensureCorrectIsomorphicReactVersion();
3030

3131
import {
32-
getClosestInstanceFromNode,
3332
getInstanceFromNode,
3433
getNodeFromInstance,
3534
getFiberCurrentPropsFromNode,
@@ -147,12 +146,7 @@ Internals.Events /* Events */ = [
147146
unstable_batchedUpdates,
148147
];
149148

150-
const foundDevTools = injectIntoDevTools({
151-
findFiberByHostInstance: getClosestInstanceFromNode,
152-
bundleType: __DEV__ ? 1 : 0,
153-
version: ReactVersion,
154-
rendererPackageName: 'react-dom',
155-
});
149+
const foundDevTools = injectIntoDevTools();
156150

157151
if (__DEV__) {
158152
if (!foundDevTools && canUseDOM && window.top === window.self) {

packages/react-native-renderer/src/ReactFabric.js

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,8 @@ import {
2828

2929
import {createPortal as createPortalImpl} from 'react-reconciler/src/ReactPortal';
3030
import {setBatchingImplementation} from './legacy-events/ReactGenericBatching';
31-
import ReactVersion from 'shared/ReactVersion';
3231

33-
import {getClosestInstanceFromNode} from './ReactFabricComponentTree';
34-
import {
35-
getInspectorDataForViewTag,
36-
getInspectorDataForViewAtPoint,
37-
getInspectorDataForInstance,
38-
} from './ReactNativeFiberInspector';
32+
import {getInspectorDataForInstance} from './ReactNativeFiberInspector';
3933
import {LegacyRoot, ConcurrentRoot} from 'react-reconciler/src/ReactRootTags';
4034
import {
4135
findHostInstance_DEPRECATED,
@@ -209,18 +203,4 @@ export {
209203
isChildPublicInstance,
210204
};
211205

212-
injectIntoDevTools({
213-
// $FlowExpectedError[incompatible-call] The type of `Instance` in `getClosestInstanceFromNode` does not match in Fabric and the legacy renderer, so it fails to typecheck here.
214-
findFiberByHostInstance: getClosestInstanceFromNode,
215-
bundleType: __DEV__ ? 1 : 0,
216-
version: ReactVersion,
217-
rendererPackageName: 'react-native-renderer',
218-
rendererConfig: {
219-
getInspectorDataForInstance,
220-
getInspectorDataForViewTag: getInspectorDataForViewTag,
221-
getInspectorDataForViewAtPoint: getInspectorDataForViewAtPoint.bind(
222-
null,
223-
findNodeHandle,
224-
),
225-
},
226-
});
206+
injectIntoDevTools();

packages/react-native-renderer/src/ReactFiberConfigFabric.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,27 @@ const {
4848
unstable_getCurrentEventPriority: fabricGetCurrentEventPriority,
4949
} = nativeFabricUIManager;
5050

51+
import {getClosestInstanceFromNode} from './ReactFabricComponentTree';
52+
53+
import {
54+
getInspectorDataForViewTag,
55+
getInspectorDataForViewAtPoint,
56+
getInspectorDataForInstance,
57+
} from './ReactNativeFiberInspector';
58+
5159
import {
5260
enableFabricCompleteRootInCommitPhase,
5361
passChildrenWhenCloningPersistedNodes,
5462
} from 'shared/ReactFeatureFlags';
5563

64+
export {default as rendererVersion} from 'shared/ReactVersion'; // TODO: Consider exporting the react-native version.
65+
export const rendererPackageName = 'react-native-renderer';
66+
export const extraDevToolsConfig = {
67+
getInspectorDataForInstance,
68+
getInspectorDataForViewTag,
69+
getInspectorDataForViewAtPoint,
70+
};
71+
5672
const {get: getViewConfigForType} = ReactNativeViewConfigRegistry;
5773

5874
// Counter for uniquely identifying views.
@@ -487,9 +503,7 @@ export function replaceContainerChildren(
487503
}
488504
}
489505

490-
export function getInstanceFromNode(node: any): empty {
491-
throw new Error('Not yet implemented.');
492-
}
506+
export {getClosestInstanceFromNode as getInstanceFromNode};
493507

494508
export function beforeActiveInstanceBlur(
495509
internalInstanceHandle: InternalInstanceHandle,

packages/react-native-renderer/src/ReactFiberConfigNative.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
precacheFiberNode,
2222
uncacheFiberNode,
2323
updateFiberProps,
24+
getClosestInstanceFromNode,
2425
} from './ReactNativeComponentTree';
2526
import ReactNativeFiberHostComponent from './ReactNativeFiberHostComponent';
2627

@@ -31,6 +32,20 @@ import {
3132
} from 'react-reconciler/src/ReactEventPriorities';
3233
import type {Fiber} from 'react-reconciler/src/ReactInternalTypes';
3334

35+
import {
36+
getInspectorDataForViewTag,
37+
getInspectorDataForViewAtPoint,
38+
getInspectorDataForInstance,
39+
} from './ReactNativeFiberInspector';
40+
41+
export {default as rendererVersion} from 'shared/ReactVersion'; // TODO: Consider exporting the react-native version.
42+
export const rendererPackageName = 'react-native-renderer';
43+
export const extraDevToolsConfig = {
44+
getInspectorDataForInstance,
45+
getInspectorDataForViewTag,
46+
getInspectorDataForViewAtPoint,
47+
};
48+
3449
const {get: getViewConfigForType} = ReactNativeViewConfigRegistry;
3550

3651
export type Type = string;
@@ -506,9 +521,7 @@ export function unhideTextInstance(
506521
throw new Error('Not yet implemented.');
507522
}
508523

509-
export function getInstanceFromNode(node: any): empty {
510-
throw new Error('Not yet implemented.');
511-
}
524+
export {getClosestInstanceFromNode as getInstanceFromNode};
512525

513526
export function beforeActiveInstanceBlur(internalInstanceHandle: Object) {
514527
// noop

packages/react-native-renderer/src/ReactNativeFiberInspector.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ import {
2323
} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface';
2424
import {enableGetInspectorDataForInstanceInProduction} from 'shared/ReactFeatureFlags';
2525
import {getClosestInstanceFromNode} from './ReactNativeComponentTree';
26-
import {getNodeFromInternalInstanceHandle} from './ReactNativePublicCompat';
26+
import {
27+
getNodeFromInternalInstanceHandle,
28+
findNodeHandle,
29+
} from './ReactNativePublicCompat';
2730
import {getStackByFiberInDevAndProd} from 'react-reconciler/src/ReactFiberComponentStack';
2831

2932
const emptyObject = {};
@@ -35,7 +38,7 @@ if (__DEV__) {
3538
function createHierarchy(fiberHierarchy) {
3639
return fiberHierarchy.map(fiber => ({
3740
name: getComponentNameFromType(fiber.type),
38-
getInspectorData: findNodeHandle => {
41+
getInspectorData: () => {
3942
return {
4043
props: getHostProps(fiber),
4144
measure: callback => {
@@ -49,19 +52,15 @@ function createHierarchy(fiberHierarchy) {
4952
if (node) {
5053
nativeFabricUIManager.measure(node, callback);
5154
} else {
52-
return UIManager.measure(
53-
getHostNode(fiber, findNodeHandle),
54-
callback,
55-
);
55+
return UIManager.measure(getHostNode(fiber), callback);
5656
}
5757
},
5858
};
5959
},
6060
}));
6161
}
6262

63-
// $FlowFixMe[missing-local-annot]
64-
function getHostNode(fiber: Fiber | null, findNodeHandle) {
63+
function getHostNode(fiber: Fiber | null) {
6564
if (__DEV__ || enableGetInspectorDataForInstanceInProduction) {
6665
let hostNode;
6766
// look for children first for the hostNode
@@ -179,7 +178,6 @@ function getInspectorDataForViewTag(viewTag: number): InspectorData {
179178
}
180179

181180
function getInspectorDataForViewAtPoint(
182-
findNodeHandle: (componentOrHandle: any) => ?number,
183181
inspectedView: Object,
184182
locationX: number,
185183
locationY: number,

packages/react-native-renderer/src/ReactNativeRenderer.js

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,11 @@ import {
3232
setBatchingImplementation,
3333
batchedUpdates,
3434
} from './legacy-events/ReactGenericBatching';
35-
import ReactVersion from 'shared/ReactVersion';
3635
// Modules provided by RN:
3736
import {UIManager} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface';
3837

3938
import {getClosestInstanceFromNode} from './ReactNativeComponentTree';
40-
import {
41-
getInspectorDataForViewTag,
42-
getInspectorDataForViewAtPoint,
43-
getInspectorDataForInstance,
44-
} from './ReactNativeFiberInspector';
39+
import {getInspectorDataForInstance} from './ReactNativeFiberInspector';
4540
import {LegacyRoot} from 'react-reconciler/src/ReactRootTags';
4641
import {
4742
findHostInstance_DEPRECATED,
@@ -233,17 +228,4 @@ export {
233228
isChildPublicInstance,
234229
};
235230

236-
injectIntoDevTools({
237-
findFiberByHostInstance: getClosestInstanceFromNode,
238-
bundleType: __DEV__ ? 1 : 0,
239-
version: ReactVersion,
240-
rendererPackageName: 'react-native-renderer',
241-
rendererConfig: {
242-
getInspectorDataForInstance,
243-
getInspectorDataForViewTag: getInspectorDataForViewTag,
244-
getInspectorDataForViewAtPoint: getInspectorDataForViewAtPoint.bind(
245-
null,
246-
findNodeHandle,
247-
),
248-
},
249-
});
231+
injectIntoDevTools();

packages/react-noop-renderer/src/createReactNoop.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import {
4242
} from 'shared/ReactFeatureFlags';
4343

4444
import ReactSharedInternals from 'shared/ReactSharedInternals';
45+
import ReactVersion from 'shared/ReactVersion';
4546

4647
type Container = {
4748
rootID: string,
@@ -367,6 +368,9 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
367368
}
368369

369370
const sharedHostConfig = {
371+
rendererVersion: ReactVersion,
372+
rendererPackageName: 'react-noop',
373+
370374
supportsSingletons: false,
371375

372376
getRootHostContext() {

packages/react-reconciler/src/ReactFiberDevToolsHook.js

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import type {EventPriority} from './ReactEventPriorities';
1717
// React which this hook might be in.
1818
type DevToolsProfilingHooks = any;
1919

20-
import {getLabelForLane, TotalLanes} from 'react-reconciler/src/ReactFiberLane';
2120
import {DidCapture} from './ReactFiberFlags';
2221
import {
2322
consoleManagedByDevToolsDuringStrictMode,
@@ -75,17 +74,6 @@ export function injectInternals(internals: Object): boolean {
7574
return true;
7675
}
7776
try {
78-
if (enableSchedulingProfiler) {
79-
// Conditionally inject these hooks only if Timeline profiler is supported by this build.
80-
// This gives DevTools a way to feature detect that isn't tied to version number
81-
// (since profiling and timeline are controlled by different feature flags).
82-
internals = {
83-
...internals,
84-
getLaneLabelMap,
85-
injectProfilingHooks,
86-
};
87-
}
88-
8977
rendererID = hook.inject(internals);
9078

9179
// We have successfully injected, so now it is safe to set up hooks.
@@ -235,27 +223,12 @@ export function setIsStrictModeForDevtools(newIsStrictMode: boolean) {
235223

236224
// Profiler API hooks
237225

238-
function injectProfilingHooks(profilingHooks: DevToolsProfilingHooks): void {
226+
export function injectProfilingHooks(
227+
profilingHooks: DevToolsProfilingHooks,
228+
): void {
239229
injectedProfilingHooks = profilingHooks;
240230
}
241231

242-
function getLaneLabelMap(): Map<Lane, string> | null {
243-
if (enableSchedulingProfiler) {
244-
const map: Map<Lane, string> = new Map();
245-
246-
let lane = 1;
247-
for (let index = 0; index < TotalLanes; index++) {
248-
const label = ((getLabelForLane(lane): any): string);
249-
map.set(lane, label);
250-
lane *= 2;
251-
}
252-
253-
return map;
254-
} else {
255-
return null;
256-
}
257-
}
258-
259232
export function markCommitStarted(lanes: Lanes): void {
260233
if (enableSchedulingProfiler) {
261234
if (

0 commit comments

Comments
 (0)