Skip to content
React custom hooks for web workers
Branch: master
Clone or download
Latest commit 09e04d6 Sep 12, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
__tests__ rename worker files Aug 18, 2019
dist createWorker factory instead of worker instance Aug 11, 2019
examples rename worker files Aug 18, 2019
src fix warning by tsc in js Sep 8, 2019
.eslintrc.json minor change in eslintrc Sep 12, 2019
.gitignore inital commit Jan 27, 2019
.travis.yml inital commit Jan 27, 2019 new worker-base api Aug 11, 2019
LICENSE inital commit Jan 27, 2019 add blog item Sep 8, 2019
package-lock.json update deps Sep 8, 2019
package.json update deps Sep 8, 2019
tsconfig.json enable source-map and so on Sep 10, 2019
webpack.config.js enable source-map and so on Sep 10, 2019


Build Status npm version bundle size

React custom hooks for web workers.


Web Workers are another thread from the main thread in browsers. We can run heavy computation in a separate thread so that users don't feel slowing down.

React provides a reactive system. This library hides the async nature of Web Workers with React custom hooks. Results returned by Web Workers are stored in a React local state.

Developers can implement a worker as:

  • sync function
  • async function
  • sync generator function
  • async generator function


npm install react-hooks-worker



import { exposeWorker } from 'react-hooks-worker';

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



import React from 'react';

import { useWorker } from 'react-hooks-worker';

const createWorker = () => new Worker('./slow_fib.worker', { type: 'module' });

const CalcFib = ({ count }) => {
  const { result, error } = useWorker(createWorker, count);
  if (error) return <div>Error: {error}</div>;
  return <div>Result: {result}</div>;

const App = () => (
    <CalcFib count={5} />

Bundler support requirements

This library requires a bundler to recognize Web Worker properly. Not everything is tested, and we appreciate for your help. (So far, only tested with worker-plugin.)



Parcel allow your Web Worker script to be automatically bundled.



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

PORT=8080 npm run examples:minimal

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


You can’t perform that action at this time.