Middleware for redux store in standalone mode for nodejs environment
Nowadays many websites use SPA architecture:
More and more JavaScript is being used. A lot of code on the client side. Some code can be shared with back-end.
These instructions will let you know how to use the library.
Things you need to install before using this library.
node: 10.15.0
nvm: 0.33.6
Using npm:
npm i --save standalone-store
Using yarn:
yarn add --dev standalone-store
Once you have instanciated your store, you can use standalone-store
as a middleware.
If you don't know what is configureStore
take a look at redux documentation (https://redux.js.org/recipes/configuring-your-store#the-solution-configurestore).
In addition to redux documentation, configureStore
need a parameter.
type ConfigureStore = ({ middlewares }: { middlewares: Middleware[] }) => ReturnType<StoreCreator>
const getUser = () => {
return dispatchActionsAndWaitResponse({
actionsDispatch: [getUser(payload)],
actionCreatorsResolve: [getUser]
configureStore,
selector: userSelector,
})
.then(data => {
console.log(data)
})
.catch(error => {
console.log(error)
})
.finally(() => {
console.log('done')
})
}
const getUser = async () => {
try {
const data = await dispatchActionsAndWaitResponse({
actionsDispatch: [getUser(payload)],
actionCreatorsResolve: [getUser],
configureStore,
selector: userSelector,
})
console.log(data)
}
catch (error) {
console.log(error)
}
finally {
console.log('done')
}
}
const standaloneStore = new StandaloneStore<TState>({ configureStore })
For example we have an action getUser
, we want to display this action with a payload.
const payload = { userId: '1234' }
standaloneStore.dispatchAction(getUser(payload))
standaloneStore.getListeners()
import { isActionOf } from 'typesafe-actions'
standaloneStore.subscribe((action, state) => {
if (isActionOf(getUser, action)) {
console.log({ action, state })
}
})
standaloneStore.unsubscribe()
ConfigureStore
has been added with specific parameter, normally it should be a function which encapsulates store creation logic, in addition of that, it can accept a list of middleware to be applied.
- If you don't need to add any extra middleware, just pass an empty array (
configureStore({ middlewares: []})
). - Make sure your
configureStore
match with given type.
type ConfigureStore = ({ middlewares }: { middlewares: Middleware[] }) => ReturnType<StoreCreator>
Breaking changes:
- In
v1.x.x
, parameterstore
was replace byconfigureStore
;
// before
dispatchActionsAndWaitResponse({
actionsDispatch: [getUser(payload)],
actionCreatorsResolve: [getUser]
store: configureStore(),
selector: userSelector,
})
// after
dispatchActionsAndWaitResponse({
actionsDispatch: [getUser(payload)],
actionCreatorsResolve: [getUser]
configureStore,
selector: userSelector,
})
- In
v1.x.x
functions below are deprecated;
standaloneStore.listenersPop
standaloneStore.listenersClear
has been replaced byunsubscribe
StandaloneStore
take a methodconfigureStore
as parameter, store was removed. Pay attention about the type ofconfigureStore
.
// before
const store = configureStore()
const standaloneStore = new StandaloneStore<TState>({ store })
// after
const standaloneStore = new StandaloneStore()<TState>({ configureStore })
Tests are written with jest
Using jest:
yarn run test
Deployment is done with Travis.
- TSDX - TSDX
Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
We use SemVer for versioning. For the versions available, see the tags on this repository.
- Arnaud Zheng - Initial work - arnaud-zg
See also the list of contributors who participated in this project.
This project is licensed under the MIT License - see the LICENSE.md file for details