• Stars
    star
    337
  • Rank 125,272 (Top 3 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created almost 4 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

React Worker Components simplify using Web Workers

react-worker-components

CI npm size discord

React Worker Components simplify using Web Workers

Introduction

This is an experimental project inspired by React Server Component.

I've been developing several libraries to interact with Web Workers.

While they provide various interfaces with good abstraction, RSC style would be another approach which is useful for Web Workers.

RWC is a library to provide RSC-like interface for Web Workers. It serializes React elements keeping their referential identities as much as possible. If a React component is "registered", it will be referenced by string names, and it can be used at the both ends.

Project Status: Experimental but basic examples are working. Welcome to try realistic examples.

Install

npm install react-worker-components

Usage

TextBox.js

This is a component that can be used in the RWC tree. register is important to enable serialization.

import React, { useState } from 'react';

import { register } from 'react-worker-components';

export const TextBox = () => {
  const [text, setText] = useState('');
  return (
    <div>
      <span>Text: {text}</span>
      <input value={text} onChange={(event) => setText(event.target.value)} />
    </div>
  );
};

register(TextBox, 'TextBox');

Hello.worker.js

This is a component that runs only on web workers. expose is necessary to communicate with the main thread.

import React from 'react';

import { expose } from 'react-worker-components';

import { TextBox } from './TextBox';

const fib = (i) => (i <= 1 ? i : fib(i - 1) + fib(i - 2));

const Hello = ({ count, children }) => {
  const fibNum = fib(count);
  return (
    <div>
      <div>Hello from worker: {fibNum}</div>
      <h1>Main TextBox</h1>
      {children}
      <h1>Worker TextBox</h1>
      <TextBox />
    </div>
  );
};

expose(Hello);

App.js

This is the entry point component in the main thread. wrap is to communicate with the worker thread.

import React, { Suspense, useState } from 'react';

import { wrap } from 'react-worker-components';

import { TextBox } from './TextBox';

const Hello = wrap(() => new Worker(new URL('./Hello.worker', import.meta.url)));

export const App = () => {
  const [count, setCount] = useState(1);
  return (
    <div>
      <span>Count: {count}</span>
      <button type="button" onClick={() => setCount(count + 1)}>+1</button>
      <button type="button" onClick={() => setCount((c) => c - 1)}>-1</button>
      <Suspense fallback="Loading...">
        <Hello count={count}>
          <TextBox />
        </Hello>
      </Suspense>
    </div>
  );
};

API

expose

Expose a React function component from web workers.

Parameters

  • Component React.FC<Props>
  • key string?

Examples

// foo.worker.js
import { expose } from 'react-worker-components';

const Foo = () => {
  return <h1>Foo</h1>;
};

expose(Foo);

register

Register a component with a string name

This allows serializing components between main and worker threads.

Parameters

  • component AnyComponent
  • name string

Examples

import { register } from 'react-worker-components';

const Counter = () => {
  const [count, setCount] = useState(0);
  return <div>{count}<button onClick={() => setCount(1)}>1</button></div>;
};

register(Counter, 'Counter');

wrap

Wrap an exposed component in main thread

This will connect the component in the worker thread. Requires Suspense.

It will create a dedicated worker for each createWorker function reference.

Parameters

  • createWorker any
  • key string?

Examples

import { wrap } from 'react-worker-components';

const Foo = wrap(() => new Worker(new URL('./Foo.worker', import.meta.url)));

Examples

The examples folder contains working examples. You can run one of them with

PORT=8080 npm run examples:01_minimal

and open http://localhost:8080 in your web browser.

More Repositories

1

waku

⛩️ The minimal React framework
TypeScript
4,363
star
2

react-tracked

State usage tracking with Proxies. Optimize re-renders for useState/useReducer, React Redux, Zustand and others.
TypeScript
2,663
star
3

use-context-selector

React useContextSelector hook in userland
TypeScript
2,518
star
4

excalidraw-animate

A tool to animate Excalidraw drawings
TypeScript
1,252
star
5

react-hooks-global-state

[NOT MAINTAINED] Simple global state for React with Hooks API without Context API
TypeScript
1,099
star
6

proxy-memoize

Intuitive magical memoization library with Proxy and WeakMap
TypeScript
715
star
7

react-hooks-worker

React custom hooks for web workers
TypeScript
698
star
8

will-this-react-global-state-work-in-concurrent-rendering

Test tearing and branching in React concurrent rendering
JavaScript
546
star
9

reactive-react-redux

[NOT MAINTAINED] React Redux binding with React Hooks and Proxy
TypeScript
502
star
10

react-hooks-async

[NOT MAINTAINED] React custom hooks for async functions with abortability and composability
JavaScript
496
star
11

excalidraw-claymate

A tool based on Excalidraw to create stop motion animations and slides.
TypeScript
482
star
12

react-hooks-fetch

[NOT MAINTAINED] Minimal data fetching library with React Suspense
TypeScript
397
star
13

use-signals

An experimental React hook for TC39 signals
TypeScript
309
star
14

react-suspense-fetch

[NOT MAINTAINED] A low-level library for React Suspense for Data Fetching
TypeScript
297
star
15

katachidraw

SVG based drawing tool and react-native component
TypeScript
290
star
16

proxy-compare

Compare two objects using accessed properties with Proxy
TypeScript
268
star
17

redux-in-worker

Entire Redux in Web Worker
TypeScript
258
star
18

social-cms-backend

Express middleware to provide schema-less REST APIs for creating a social networking website primarily using angular.js. It comes with built-in authentication, authorization and notification features.
JavaScript
216
star
19

use-reducer-async

React useReducer with async actions
TypeScript
178
star
20

valtio-yjs

valtio-yjs makes yjs state easy
TypeScript
177
star
21

connect-prerenderer

Express/connect middleware to pre-render ajax page for non-ajax browsers, especially using angular.js
JavaScript
161
star
22

typescript-expo-apollo-boilerplate

[NOT MAINTAINED] Clean boilerplate for TypeScript + Expo (React Native) + React Apollo (GraphQL)
TypeScript
144
star
23

es-beautifier

[NOT MAINTAINED] ECMAScript beautifier based on eslint
JavaScript
120
star
24

create-react-signals

A factory function to create signals for React
TypeScript
111
star
25

zustand-signal

Another React binding for Zustand
TypeScript
109
star
26

react18-use

React 19 use hook shim
TypeScript
109
star
27

use-atom

Yet another implementation for Jotai atoms without side effects
TypeScript
108
star
28

remote-faces

A tool for Working From Home: Share your webcam images with your colleagues
JavaScript
95
star
29

react-suspense-router

[NOT MAINTAINED] React Router for React Suspense and Render-as-You-Fetch
TypeScript
87
star
30

continuation.js

A module for tail call optimization by Continuation Passing Style (CPS) transformation with trampoline technique for Node.js
JavaScript
78
star
31

rss-pipes

RSS feed aggregator by Node.js
JavaScript
74
star
32

derive-zustand

A function to create a derived Zustand store from stores
TypeScript
71
star
33

lets-compare-global-state-with-react-hooks

Comparing global state libraries with React Hooks
59
star
34

use-zustand

Another custom hook to use Zustand vanilla store
TypeScript
57
star
35

easy-livereload

Express middleware to use livereload2 easily (both server and client)
JavaScript
56
star
36

codeonmobile

A coding tool on mobile devices targeting GitHub/Codeship/Heroku
JavaScript
55
star
37

valtio-signal

Another React binding for Valtio proxy state
TypeScript
50
star
38

connect-cache-manifest

Express/connect middleware to generate HTML5 cache manifest file.
JavaScript
49
star
39

excalidraw-gallery

A tool to display Excalidraw drawings
JavaScript
37
star
40

excalidraw-layers

A tool to view layers of Excalidraw drawings
TypeScript
33
star
41

notes-app-sample

A sample HTML5 web app using social-cms-backend (the BMEAN stack)
JavaScript
33
star
42

express-react-redux

Express middleware for React/Redux applications
JavaScript
30
star
43

svelte3-redux

[NOT MAINTAINED] Redux for Svelte 3
TypeScript
30
star
44

react-suspense-worker

[NOT MAINTAINED] React Suspense for Web Worker with Comlink
TypeScript
26
star
45

react-native-dom-expo

[NOT MAINTAINED] A patch library to make Expo work with react-native-dom
JavaScript
25
star
46

react-context-global-state

[NOT MAINTAINED] Simple global state for React with Context API
JavaScript
23
star
47

gqless-hook

[NOT MAINTAINED] Yet another React hook for gqless
TypeScript
22
star
48

use-valtio

Another custom hook to use Valtio proxy state
TypeScript
21
star
49

react-hooks-render-props

[NOT MAINTAINED] A hacking custom hook to emulate render props
JavaScript
18
star
50

benchmark-octane

Octane benchmark for Node.js
JavaScript
18
star
51

recoildux

[NOT MAINTAINED] Recoil inspired implementation with Redux
TypeScript
16
star
52

react-compose-state

A helper function to attach state to stateless function components
JavaScript
16
star
53

gunosy-rss

[OBSOLETE] Gunosy RSS feed web service by Node.js
JavaScript
15
star
54

apollo-link-lazy

Apollo Link for lazy loading
JavaScript
14
star
55

react-suspense-router-demo

[NOT MAINTAINED] A demo app with react-suspense-router
TypeScript
11
star
56

react-apollo-github-api-infinite-scroll-example

React Apollo GitHub GraphQL API infinite scroll example code
JavaScript
11
star
57

twitter-clone-sample

JavaScript
7
star
58

blog

Personal blog
Less
6
star
59

waku-vercel-starter

TypeScript
5
star
60

meteor-fan

HTML
4
star
61

waku-netlify-starter

TypeScript
4
star
62

dai-shi

3
star
63

minimal-apollo-example

Minimal Apollo stack example code
JavaScript
2
star
64

react-compose-onmount

A helper function to attach onmount handler to stateless function components
JavaScript
2
star
65

GBrain

A Google AppEngine web app for sharing brains.
Java
1
star
66

meteor-google-maps-example

JavaScript
1
star
67

meteor-blaze-google-maps

Easy Blaze template for Google Maps with reactivity
JavaScript
1
star
68

meteor-blaze-showhide

Handy block helpers for show/hide functionality in Blaze
JavaScript
1
star
69

meteor-facebook-server-api

A Meteor package to provide Facebook Graph API
JavaScript
1
star