reactant-ssr
Version:
A server-side renderer for Reactant
147 lines (106 loc) • 3.27 kB
Markdown
# reactant-ssr

SSR (Server-Side Rendering) can greatly improve the first rendering time, the most popular React SSR framework is Next.js. Currently, Reactant has supported SSR based on Next.js.
## Installation
- Build a Next.js application project using the `create-next-app` cli.
```bash
npx create-next-app reactant-ts-ssr --ts
cd reactant-ts-ssr
```
- Install `reactant-ssr`.
```bash
yarn add reactant-ssr
```
- Install other `Babel` development dependencies.
```bash
yarn add -D /core /plugin-proposal-class-properties /plugin-proposal-decorators babel-plugin-parameter-decorator babel-plugin-transform-typescript-metadata
```
## Configuration
- Next.js with Typescript should use `babel`, and make sure you set:
Add `.babelrc` file
```json
{
"presets": ["next/babel"],
"plugins": [
["@babel/plugin-proposal-decorators", { "legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose": false }],
"babel-plugin-parameter-decorator",
"babel-plugin-transform-typescript-metadata"
]
}
```
Add this config to `tsconfig.json` file
```diff
+ "experimentalDecorators": true,
+ "emitDecoratorMetadata": true
```
## Usage
1. Define a module file for SSR `src/index.tsx`:
```tsx
import React from 'react';
import {
ViewModule,
injectable,
useConnector,
action,
state,
} from 'reactant-ssr';
export class Counter {
count = 0;
increase() {
this.count += 1;
}
decrease() {
this.count -= 1;
}
}
export class CounterView extends ViewModule {
constructor(public counter: Counter) {
super();
}
component() {
const count = useConnector(() => this.counter.count);
return (
<>
<button type="button" onClick={() => this.counter.decrease()}>
-
</button>
<div>{count}</div>
<button type="button" onClick={() => this.counter.increase()}>
+
</button>
</>
);
}
}
```
2. Add custom Next.js app in `pages/_app.tsx` file.
```tsx
import { createServerApp } from "reactant-ssr";
import { CounterView } from "../src/index";
export const app = createServerApp({
modules: [CounterView],
});
export default app.bootstrap;
```
3. Add home page routing page in `pages/index.tsx` file.
```tsx
import { CounterView } from "../src/index";
import { app } from "./_app";
export default app.container.get(CounterView).component;
```
4. run `yarn dev` and visit `http://localhost:3000`.
## Q&A
1. Does `reactant-router` support SSR?
`reactant-router` is based on React Router, which does not support SSR, so when you use `reactant-ssr`, your routing must use[`next/router`](https://nextjs.org/docs/api-reference/next/router)
2. Does `reactant-storage` support SSR?
Yes, it works perfectly fine. In general, `reactant-share` is a different application model, so it also does not support SSR, which is supported by all other Reactant libraries.
## Example
- [Repo](https://github.com/unadlib/reactant-examples/tree/master/server/server-side-rendering)
## Documentation
You can visit [reactant.js.org](https://reactant.js.org/) for more documentation.