React code splitting with server side rendering
MIT License
React code splitting with server side rendering
$ npm i react-code-split-ssr --save
Client/server shared:
import { Bundle } from 'react-code-split-ssr'
import React from 'react'
const Home = () => <Bundle mod={import('/imports/modules/home')} />
const Posts = () => <Bundle mod={import('/imports/modules/posts')} />
export const routes = [
{ exact: true, path: '/', component: Home },
{ exact: true, path: '/posts', component: Posts },
]
export const redirects = [
{ from: '/test', to: '/posts' }
]
Client:
import React from 'react'
import { render } from 'react-dom'
import { matchPath } from 'react-router'
import { BrowserRouter, Route, Switch } from 'react-router-dom'
import { generateRoutes } from 'react-code-split-ssr'
import { routes, redirects } from '/imports/routes'
// import some components...
/* In an async function */
const Routes = await generateRoutes({
routes,
redirects,
notFoundComp: NotFound,
pathname: window.location.pathname,
})
render(
<BrowserRouter>
<Layout>
<Routes />
</Layout>
</BrowserRouter>,
document.getElementById('app'),
)
Server:
import { Route, StaticRouter, Switch } from 'react-router'
import React from 'react'
import { renderToString } from 'react-dom/server'
import { generateRoutes } from 'react-code-split-ssr'
import { routes, redirects } from '/imports/routes'
// import some components...
/* In an async server router */
const Routes = await generateRoutes({
routes,
redirects,
notFoundComp: NotFound,
pathname: req.url
})
const ServerRoutes = ({url, context = {}}) => (
<StaticRouter
location={url.pathname}
context={context}
>
<Layout>
<Routes />
</Layout>
</StaticRouter>
)
const bodyHtmlString = renderToString(<ServerRoutes url={sink.request.url} />)
// Use bodyHtmlString to where you need
Promise
object which can be resolved to React ComponentA function that returns a Promise
object which can be resolved to React Router routes wrapped in <Switch>
<Route>
props object
component
field only accepts () => <Bundle/>
location
, render
fields are currently not supported<Redirect>
props object() => <Bundle/>
notFoundComp
to () => <Bundle />