1.2.16 • Published 11 days ago

@appigram/react-code-split-ssr v1.2.16

Weekly downloads
5
License
MIT
Repository
github
Last release
11 days ago

React Code Split SSR

React code splitting with server side rendering

How it works

  • Based on React Router 6
  • Server side: Load all components synchronously, then render to string.
  • Client side: Load the initial component before rendering, render the entire screen synchronously, then load the rest of routes asynchronously.

Note: This packages is only tested in Meteor projects, but technically it can be used in any Nodejs projects. Here is an example with Meteor

Usage

$ 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 },
]

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

API

Bundle - React Component \<Bundle>

Props

  • mod {Promise} Required - A Promise object which can be resolved to React Component
  • loading {Component} - A React Component

generateRoutes - Func (object: Options)

A function that returns a Promise object which can be resolved to React Router routes wrapped in <Switch>

Options

  • pathname {string} Required - Pathname for initial loading
  • routes {objects}[] Required - An array of <Route> props object
    • component field only accepts () => <Bundle/>
    • location, render fields are currently not supported
  • redirects {objects}[] - An array of <Redirect> props object
  • notFoundComp {Component} - A React component for 404 Not Found, only accepts () => <Bundle/>

v1.2.0

  • Remove redirects, Fix React-Router v6 specific rendering

v1.1.0

  • Upgrade to React-Router v6

v1.0.0

  • SSR correctly for redirected routes
  • Change notFoundComp to () => <Bundle />
  • Add more argument validations
1.2.16

11 days ago

1.2.15

13 days ago

1.2.12

7 months ago

1.2.13

7 months ago

1.2.14

7 months ago

1.2.11

8 months ago

1.2.10

1 year ago

1.2.9

2 years ago

1.2.8

2 years ago

1.2.7

2 years ago

1.2.6

2 years ago

1.2.5

2 years ago

1.2.4

2 years ago

1.2.3

2 years ago

1.2.2

2 years ago

1.2.0

2 years ago

1.2.1

2 years ago

1.2.0-beta.1

3 years ago

1.2.0-beta.0

3 years ago

1.2.0-beta.3

3 years ago

1.2.0-beta.2

3 years ago

1.2.0-beta.5

3 years ago

1.2.0-beta.4

3 years ago

1.2.0-beta.7

3 years ago

1.2.0-beta.6

3 years ago

1.1.3

3 years ago

1.1.2

3 years ago

1.1.1

3 years ago

1.1.0

3 years ago

1.0.16

3 years ago

1.0.15

4 years ago

1.0.14

4 years ago

1.0.13

4 years ago

1.0.12

4 years ago

1.0.11

4 years ago

1.0.10

4 years ago

1.0.9

4 years ago

1.0.8

4 years ago

1.0.6

4 years ago

1.0.5

5 years ago

1.0.4

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago