Skip to content

Instantly share code, notes, and snippets.

@gaearon
Last active April 25, 2023 09:06
Show Gist options
  • Star 60 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save gaearon/fbd581089255cd529e62 to your computer and use it in GitHub Desktop.
Save gaearon/fbd581089255cd529e62 to your computer and use it in GitHub Desktop.
Webpack's async code splitting with React Router
'use strict';
var React = require('react');
function createAsyncHandler(getHandlerAsync, displayName) {
var Handler = null;
return React.createClass({
displayName: displayName,
statics: {
willTransitionTo(transition, params, query, callback) {
getHandlerAsync().then(resolvedHandler => {
Handler = resolvedHandler;
if (!Handler.willTransitionTo) {
return callback();
}
Handler.willTransitionTo(transition, params, query, callback);
if (Handler.willTransitionTo.length < 4) {
callback();
}
});
},
willTransitionFrom(transition, component, callback) {
if (!Handler || !Handler.willTransitionFrom) {
callback();
}
Handler.willTransitionFrom(transition, component, callback);
if (Handler.willTransitionFrom.length < 3) {
callback();
}
}
},
render() {
return <Handler {...this.props} />;
}
});
}
module.exports = createAsyncHandler;
@Retired
Copy link

Retired commented Feb 11, 2015

@Schniz, thank you! Apologies for the delayed response but that seemed to have solved the problem. I guess those unfamiliar constructs in gaearon's gist belong to the ES6 spec.

@pilwon
Copy link

pilwon commented Feb 17, 2015

@gaearon Thanks for sharing the code. Line 29 is missing return.

@mikechau
Copy link

@gaearon this is awesome, thank you!

@plasticine
Copy link

This is pretty neat, but does have some unfortunate side-effects.

For example the component param that will be passed to willTransitionFrom will reference the component returned from createAsyncHandler — not Handler. This isn’t a deal-breaker but does mean that this isn’t fool-proof.

@plasticine
Copy link

Which I guess you can hack around if you’re happy to reach in and grab a reference to the component when it renders. Pretty shady though. :/

componentDidMount: {
  if (Handler) {
    HandlerComponent = this.refs.component;
  }
}
Handler.willTransitionFrom(transition, HandlerComponent, callback)

@makefunstuff
Copy link

Is it possible to use this example with es6 harmony modules?

@jamesjjk
Copy link

Have you tried with isomorphic ensure? : https://github.com/tomekwi/isomorphic-ensure

@rubencodes
Copy link

Any chance this gist can be updated for latest RR? Tried doing it myself but wasn't able to do it...The willTransitionTo/From hooks aren't a thing anymore, I think.

@anorudes
Copy link

anorudes commented Mar 7, 2016

+1, can you update the code?)

@rosskevin
Copy link

rosskevin commented May 25, 2016

I just researched a bunch of this, and settled on https://github.com/luqin/react-router-loader. It has considered several other forks of loaders and appears to be maintained.

Here's a gist of the dynamic auth-flow example using jsx syntax:
https://gist.github.com/rosskevin/de55079e0d48f046fb518e45bb4f12b1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment