<!-- Thanks for submitting a pull request! We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory. Before submitting a pull request, please make sure the following is done: 1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`. 2. Run `yarn` in the repository root. 3. If you've fixed a bug or added code that should be tested, add tests! 4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development. 5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`. 6. If you need a debugger, run `yarn debug-test --watch TestName`, open `chrome://inspect`, and press "Inspect". 7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`). 8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files. 9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`). 10. If you haven't already, complete the CLA. Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html --> ## Summary <!-- Explain the **motivation** for making this change. What existing problem does the pull request solve? --> This pull request emit the trace update events `drawTraceUpdates` with the trace frame information when the trace update drawer runs outside of web environment. This allows React Devtool running in mobile or other platforms have a chance to render such highlights and provide similar feature on web to provide re-render highlights. This is a feature needed for identifying unnecessary re-renders. ## How did you test this change? <!-- Demonstrate the code is solid. Example: The exact commands you ran and their output, screenshots / videos if the pull request changes the user interface. How exactly did you verify that your PR solves the issue you wanted to solve? If you leave this empty, your PR will very likely be closed. --> I tested this change with Flipper desktop app running against mobile app, and verified that the event with correct array of frames are passing through properly.
react-devtools-core
This package provides low-level APIs to support renderers like React Native. If you're looking for the standalone React DevTools UI, we suggest using react-devtools instead of using this package directly.
This package provides two entrypoints: labeled "backend" and "standalone" (frontend). Both APIs are described below.
Backend API
Backend APIs are embedded in development builds of renderers like React Native in order to connect to the React DevTools UI.
Example
If you are building a non-browser-based React renderer, you can use the backend API like so:
if (process.env.NODE_ENV !== 'production') {
const { connectToDevTools } = require("react-devtools-core");
// Must be called before packages like react or react-native are imported
connectToDevTools({
...config
});
}
Note
that this API (
connectToDevTools) must be (1) run in the same context as React and (2) must be called before React packages are imported (e.g.react,react-dom,react-native).
connectToDevTools options
| Prop | Default | Description |
|---|---|---|
host |
"localhost" |
Socket connection to frontend should use this host. |
isAppActive |
(Optional) function that returns true/false, telling DevTools when it's ready to connect to React. | |
port |
8097 |
Socket connection to frontend should use this port. |
resolveRNStyle |
(Optional) function that accepts a key (number) and returns a style (object); used by React Native. | |
retryConnectionDelay |
200 |
Delay (ms) to wait between retrying a failed Websocket connection |
useHttps |
false |
Socket connection to frontend should use secure protocol (wss). |
websocket |
Custom WebSocket connection to frontend; overrides host and port settings. |
Frontend API
Frontend APIs can be used to render the DevTools UI into a DOM node. One example of this is react-devtools which wraps DevTools in an Electron app.
Example
import DevtoolsUI from "react-devtools-core/standalone";
// See the full list of API methods in documentation below.
const { setContentDOMNode, startServer } = DevtoolsUI;
// Render DevTools UI into a DOM element.
setContentDOMNode(document.getElementById("container"));
// Start socket server used to communicate between backend and frontend.
startServer(
// Port defaults to 8097
1234,
// Host defaults to "localhost"
"example.devserver.com",
// Optional config for secure socket (WSS).
{
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
}
);
Exported methods
The default export is an object defining the methods described below.
These methods support chaining for convenience. For example:
const DevtoolsUI = require("react-devtools-core/standalone");
DevtoolsUI.setContentDOMNode(element).startServer();
connectToSocket(socket: WebSocket)
This is an advanced config function that is typically not used.
Custom WebSocket connection to use for communication between DevTools frontend and backend. Calling this method automatically initializes the DevTools UI (similar to calling startServer()).
openProfiler()
Automatically select the "Profiler" tab in the DevTools UI.
setContentDOMNode(element: HTMLElement)
Set the DOM element DevTools UI should be rendered into on initialization.
setDisconnectedCallback(callback: Function)
Optional callback to be notified when DevTools WebSocket closes (or errors).
setProjectRoots(roots: Array<string>)
Optional set of root directories for source files. These roots can be used to open an inspected component's source code using an IDE.
setStatusListener(callback: Function)
Optional callback to be notified of socket server events (e.g. initialized, errored, connected).
This callback receives two parameters:
function onStatus(
message: string,
status: 'server-connected' | 'devtools-connected' | 'error'
): void {
// ...
}
startServer(port?: number, host?: string, httpsOptions?: Object, loggerOptions?: Object)
Start a socket server (used to communicate between backend and frontend) and renders the DevTools UI.
This method accepts the following parameters:
| Name | Default | Description |
|---|---|---|
port |
8097 |
Socket connection to backend should use this port. |
host |
"localhost" |
Socket connection to backend should use this host. |
httpsOptions |
Optional object defining key and cert strings. |
|
loggerOptions |
Optional object defining a surface string (to be included with DevTools logging events). |
Development
Watch for changes made to the backend entry point and rebuild:
yarn start:backend
Watch for changes made to the standalone UI entry point and rebuild:
yarn start:standalone
Run the standalone UI using yarn start in the react-devtools.