# react-worker-dom **Repository Path**: mirrors_Shopify/react-worker-dom ## Basic Information - **Project Name**: react-worker-dom - **Description**: Experiments to see the advantages of using Web Workers to Render React Virtual DOM - **Primary Language**: Unknown - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-19 - **Last Updated**: 2026-07-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # React Renderer using Web Workers A React Custom renderer using Web Workers. All the Virtual DOM reconcilliations happen in a WebWorker thread. Only node updates are sent over to the UI thread, result in a much more responsive UI. An existing React application can leverage WebWorkers using this library with minimal change. Look at the usage section for details. ## Demo The demo is hosted at [http://web-perf.github.io/react-worker-dom/](http://web-perf.github.io/react-worker-dom/). To run a local version of the demo, - Clone the repo run `npm install` to install all dependencies. - Build the app using `npm run demo` - Open `http://localhost:8080/test/dbmonster/` to view the demo app, or `http://localhost:8080/test/todo` for the todo app. - Tweak the params in the URL to change to use web workers, increase number of components, etc. ## Usage ### A typical React application A typical React application would looks something like the following. ```js // File: main.jsx import React from 'react'; import reactDOM from 'react-dom'; reactDOM.render(, document.getElementById('container')); ``` ### Using it with Web Workers To use this renderer, we would need to split the above file into 2 parts, one that is on the page, and another that starts as a web worker. ```js // File: main.js - included using a script tag in index.html import React from 'react'; import reactDOM from 'react-worker-dom'; // Instead of using react-dom reactDOM.render(new Worker('worker.js'), document.getElementById('container')); ``` The `worker.js` file is the one that now holds the actual Component. ```js // File: worker.jsx - loaded in index.html using new Worker('worker.jsx') in the file script above; import React from 'react'; import ReactWorkerDOM from 'react-worker-dom-worker'; ReactWorkerDOM.render(); ``` Look at `test\dbmonster` and `test\todoapp` directory for the examples. ## Testing Performance To manually look at frame rates, load the dbmonster [demo pages](http://web-perf.github.io/react-worker-dom/) in Chrome, and view the [frame meter](https://developer.chrome.com/devtools/docs/rendering-settings#show-fps%20meter) in devtools. To automatically collect frame rates and compare it with the normal version - Run `npm run demo` to start the server and host the web pages - Run `npm run perf chrome worker` to test frame rates for various rows in chrome in a Web Worker. Instead of `chrome`, you could use `android`, and instead of `worker`, you could use `normal` to test the other combinations. - The frame rates are available in `_dbmonster.json` file, for each row count. ## Roadmap Here are the things that need to be done next. - Add support for form elements like ``, `