
Security News
GitHub Actions Pricing Whiplash: Self-Hosted Actions Billing Change Postponed
GitHub postponed a new billing model for self-hosted Actions after developer pushback, but moved forward with hosted runner price cuts on January 1.
@simple-contacts/react-router-async-routes
Advanced tools
Extend <Route> API to include async rendering and transitions. This is useful to do webpack code-splitting and fetching essential data before rendering.
npm install @simple-contacts/react-router-async-routes --save
or
yarn add @simple-contacts/react-router-async-routes
To make a asynchronous route, use the async prop. When using the async prop, the component prop becomes a function that evaluates to a promise of the component. The render prop becomes a promise of the render method. The transition prop can include options for 'react-transition-group'.
import("isomorphic-fetch");
import { render } from "react-dom";
import { BrowserRouter } from "react-router-dom";
import Home from "./home";
import Page1 from "./page1";
import Page3 from "./page3";
import { Route } from "react-router-async-routes";
const FadeInTransition = {
transitionName: "example",
transitionAppear: false,
transitionEnterTimeout: 500,
transitionEnter: true,
transitionLeave: false
};
const myErrorHandler = () => {
console.error("Error loading page...");
};
const routes = (
<div>
{/* Original API */}
<Route path="/" component={Home} />
{/* Route with transition */}
<Route transition={FadeInTransition} path="/page1" component={Page1} />
{/* Code Split */}
<Route
async
path="/page2"
component={() => import("./page2")}
onError={myErrorHandler}
/>
{/* Fetch data before render */}
<Route
async
path="/page3"
render={() => fetch("/api/endpoint1").then(data => <Page3 data={data} />)}
/>
{/* Code split, data fetch and transition */}
<Route
async
transition={FadeInTransition}
path="/page4"
render={async () => {
const [Page5, data] = await Promise.all([
import("./page3"),
fetch("/api/endpoint2")
]);
return <Page3 data={data} />;
}}
/>
</div>
);
render(<BrowserRouter>{routes}</BrowserRouter>);
The async routes can be preprocessed and resolved using resolveRoutes. Once resolved, React.renderToString can be used.
import express from "express";
import { resolveRoutes } from "react-router-async-routes";
import { renderToString } from "react-dom/server";
import App, { routes } from "./App";
app.use(async function(req, res) {
const resolvedRoutes = await ResolveRoutes(routes, req.url);
const html = renderToString(
<StaticRouter location={req.url} context={{}}>
{resolvedRoutes}
</StaticRouter>
);
res.send(`<body><div id='app'>${html}</div></body>`);
});
To run the example do a yarn start. You can view the example using the webpack-dev-server via http://localhost:8080. When changes are detected to server or client, the service is restarted automatically (via pm2).
If you want to see the example with bundled files. Run yarn run build-example, then yarn start, and access via http://localhost:8081.
FAQs
Async Routes and transitions for React Router v4
We found that @simple-contacts/react-router-async-routes demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
GitHub postponed a new billing model for self-hosted Actions after developer pushback, but moved forward with hosted runner price cuts on January 1.

Research
Destructive malware is rising across open source registries, using delays and kill switches to wipe code, break builds, and disrupt CI/CD.

Security News
Socket CTO Ahmad Nassri shares practical AI coding techniques, tools, and team workflows, plus what still feels noisy and why shipping remains human-led.