Stockroom

将你的 store 管理轻松地分担给 worker。「Offload your store management to a worker easily.」

Github stars Tracking Chart

Stockroom

Offload your store management to a worker.

Stockroom seamlessly runs a Unistore store (and its actions) in a Web Worker, setting up optimized bidirectional sync so you can also use & subscribe to it on the main thread.

  • Easy same API as unistore - a simple add-on
  • Opt-in centralized actions with the option of running on the main thread
  • Convenient action selector shorthand - no action creator needed for simple actions
  • Gracefully degrades - feature-detect Worker support and fall back to stockroom/inline

Table of Contents

Install

Stockroom requires that you install unistore (300b) as a peer dependency.

npm install --save unistore stockroom

Usage

We'll have two files: index.js and worker.js. The first is what we import from our app, so it runs on the main thread - it imports our worker (using worker-loader or workerize-loader) and passes it to Stockroom to create a store instance around it.

index.js:

import createStore from 'stockroom'
import StoreWorker from 'worker-loader!./worker'

let store = createStore(new StoreWorker())

let increment = store.action('increment')
store.subscribe(console.log)

// Let's run a registered "increment" action in the worker.
// This will eventually log a state update to the console - `{ count: 1 }`
increment()

The second file is our worker code, which runs in the background thread. Here we import Stockroom's worker-side "other half", stockroom/worker. This function returns a store instance just like createStore() does in Unistore, but sets things up to synchronize with the main/parent thread. It also adds a registerActions method to the store, which you can use to define globally-available actions for that store. These actions can be triggered from the main thread by invoking store.action('theActionName') and calling the function it returns.

worker.js:

import createStore from 'stockroom/worker'

let store = createStore({
  count: 0
})

store.registerActions( store => ({
  increment: ({ count }) => ({ count: count+1 })
}) )

export default store  // if you wish to use `stockroom/inline`

API

module:stockroom

The main stockroom module, which runs on the main thread.

createStore

Given a Web Worker instance, sets up RPC-based synchronization with a WorkerStore running within it.

Parameters

  • worker Worker An instantiated Web Worker (eg: new Worker('./store.worker.js'))

Examples

import createStore from 'stockroom'
import StoreWorker from 'worker-loader!./store.worker'
let store = createStore(new StoreWorker)

Returns Store synchronizedStore - a mock unistore store instance sitting in front of the worker store.

module:stockroom/inline

Used to run your whole store on the main thread.
Useful non-worker environments or as a fallback.

createInlineStore

For SSR/prerendering, pass your exported worker store through this enhancer
to make an inline synchronous version that runs in the same thread.

Parameters

  • workerStore WorkerStore The exported store instance that would have been invoked in a Worker

Examples

let store
if (SUPPORTS_WEB_WORKERS === false) {
	let createStore = require('stockroom/inline')
	store = createStore(require('./store.worker'))
}
else {
	let createStore = require('stockroom')
	let StoreWorker = require('worker-loader!./store.worker')
	store = createStore(new StoreWorker())
}
export default store

Returns Store inlineStore - a unistore instance with centralized actions

module:stockroom/worker

The other half of stockroom, which runs inside a Web Worker.

createWorkerStore

Creates a unistore instance for use in a Web Worker that synchronizes itself to the main thread.

Parameters

  • initialState Object Initial state to populate (optional, default {})

Examples

import createWorkerStore from 'stockroom/worker'
let initialState = { count: 0 }
let store = createWorkerStore(initialState)
store.registerActions({
	increment(state) {
		return { count: state.count + 1 }
	}
})

Returns WorkerStore workerStore (enhanced unistore store)

freeze

Queue all additional processing until unfrozen.
freeze/unfreeze manages a cumulative lock:
unfreeze must be called as many times as freeze was called in order to remove the lock.

unfreeze

Remove a freeze lock and process queued work.

License

MIT License © Jason Miller

Overview

Name With Ownerdevelopit/stockroom
Primary LanguageJavaScript
Program languageJavaScript (Language Count: 1)
Platform
License:
Release Count2
Last Release Name1.0.1 (Posted on )
First Release Name1.0.0 (Posted on )
Created At2018-01-18 19:21:39
Pushed At2019-08-06 16:51:46
Last Commit At2019-03-08 08:26:46
Stargazers Count1.8k
Watchers Count22
Fork Count57
Commits Count23
Has Issues Enabled
Issues Count15
Issue Open Count7
Pull Requests Count5
Pull Requests Open Count4
Pull Requests Close Count2
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private
To the top