GithubHelp home page GithubHelp logo

blueberryapps / redux-preload Goto Github PK

View Code? Open in Web Editor NEW
20.0 28.0 1.0 402 KB

Preload actions on both server & client side (allows deep nesting of components)

License: MIT License

JavaScript 90.77% Shell 9.23%
redux prefetch preload componentdidmount server-side-rendering client-side-rendering react javascript blueberry-opensource

redux-preload's Introduction

Preload CircleCI Dependency Status

Description

Module is using to dispatch some actions (usually async data fetching) immediately after the rendering occurs. Works both on client and server sides.

Usage on client

import preload from 'redux-preload';

@preload([
  // You can just pass a single action creator, or array of them
  ({ someProp }) => ({ type: 'FETCH', payload: someProp })
])
class Container extends Component {
  render() {
    return <div />;
  }
}

Usage on server

On server to get all goodness of isomorphic-deeply-nested-component-data-prefetch you need to call serverPreload(routerContext) with router context.

And also send preloaded data back to client using window.__INITIAL_STATE__ = ${serialize(store.getState())};

serverPreload is a promise - when promise resolves data is already fetched (store is polluted with data) and now you can render your DOM

Here is pseudo code that demonstrate that on server in render.js

import { serverPreload } from 'redux-preload';

const getRouterContext = function(store, renderProps) {
  return (
    <Provider store={store}>
      <RouterContext {...renderProps} />
    </Provider>
  );
}

const renderHtml = (store, renderProps) => {
  return '<!DOCTYPE html>' + ReactDOMServer.renderToStaticMarkup(
    <html lang="en">
      <body>
        <div dangerouslySetInnerHTML={{__html: ReactDOMServer.renderToString(
          getRouterContext(store, renderProps)
        )}} id="app"></div>
        <script dangerouslySetInnerHTML={{__html:`
            window.__INITIAL_STATE__ = ${serialize(store.getState())};
        `}}></script>
      </body>
    </html>
  );
};

export default function render(req, res, next) {
  const store = createStore(...);
  ...
  match({routes, location}, async (error, redirectLocation, renderProps) => {
    ...
    try {
      await serverPreload(getRouterContext(store, renderProps));

      const html = renderHtml(store, renderProps, req);
      res.status(200).send(html);
    } catch (exception) {
      next(exception);
    }
  });
}

Restore state sent from server

On client you need to revive state with data sent from server.

You can do it in main.js

const store = createStore({
  initialState: window.__INITIAL_STATE__
});

ReactDOM.render(
  <Provider store={store}>
    <Router history={history}>
      {createRoutes(store.getState)}
    </Router>
  </Provider>,
  document.getElementById('app')
);

Development

yarn install
yarn eslint
yarn eslint:fix
yarn test

CI and autopublish

On Circle CI you need to add NPM_TOKEN which has rights to publish package to npmjs.org.

Also when you provide SLACK_TOKENS redux-preload/YYY/ZZZZ (take them as one string from url https://hooks.slack.com/services/redux-preload/YYY/ZZZ) it will let you know about new version.

When code gets to master branch, it will try to publish, so if version in package.json is different, it will push it automatically.

Made with love by

redux-preload's People

Contributors

ondrejbartas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

adascal

redux-preload's Issues

Replace mocha with jest

No serious reason I guess, just for fun perhaps and to go toward consistency across all other repos.

Compatibility with React Router v4

Hi @ondrejbartas, thank you for open sourcing this library! I noticed that the library seems quite agnostic to router, but wondering if you've tried or think it would be compatible with React Router v4?

In general, what would the basic requirements from the router side be for this library to be able to perform its functionality?

Add travis

Let's try to target Node 4+ and add supported versions to engines field in package.json.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.