{"id":15731802,"url":"https://github.com/saltyshiomix/react-ssr","last_synced_at":"2025-04-04T17:04:13.289Z","repository":{"id":37752228,"uuid":"185355314","full_name":"saltyshiomix/react-ssr","owner":"saltyshiomix","description":"React SSR as a view template engine","archived":false,"fork":false,"pushed_at":"2023-08-03T06:30:33.000Z","size":2376,"stargazers_count":271,"open_issues_count":16,"forks_count":44,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-02T17:53:00.243Z","etag":null,"topics":["react","react-ssr","server-side-rendering","template-engine","view-engine"],"latest_commit_sha":null,"homepage":"https://npm.im/@react-ssr/express","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/saltyshiomix.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["saltyshiomix"]}},"created_at":"2019-05-07T08:20:18.000Z","updated_at":"2025-03-10T17:29:52.000Z","dependencies_parsed_at":"2024-06-18T15:36:15.635Z","dependency_job_id":"d21eb8a7-80d7-449e-9cdc-1ae8db0be683","html_url":"https://github.com/saltyshiomix/react-ssr","commit_stats":{"total_commits":2148,"total_committers":5,"mean_commits":429.6,"dds":0.002327746741154546,"last_synced_commit":"f2605e6f20b9aa74250026f42c63925410012c02"},"previous_names":[],"tags_count":435,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saltyshiomix%2Freact-ssr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saltyshiomix%2Freact-ssr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saltyshiomix%2Freact-ssr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saltyshiomix%2Freact-ssr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/saltyshiomix","download_url":"https://codeload.github.com/saltyshiomix/react-ssr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247217174,"owners_count":20903008,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["react","react-ssr","server-side-rendering","template-engine","view-engine"],"created_at":"2024-10-04T00:05:44.914Z","updated_at":"2025-04-04T17:04:13.272Z","avatar_url":"https://github.com/saltyshiomix.png","language":"TypeScript","funding_links":["https://github.com/sponsors/saltyshiomix"],"categories":[],"sub_categories":[],"readme":"## Overview\n\n- SSR (Server Side Rendering) as a view template engine\n- Dynamic `props`\n  - Passing the server data to the React client `props`\n  - Suitable for:\n    - Admin Panels\n    - Blogging\n- Developer Experience\n  - Zero config of webpack and babel\n  - HMR (Hot Module Replacement) both scripts and even if styles when `process.env.NODE_ENV !== 'production'`\n  - Built-in Sass (SCSS) support\n\n## Pros and Cons\n\n### Pros\n\nBecause it is just a view template engine:\n\n- It doesn't need to have any APIs, all we have to do is to pass the server data to the client\n- It supports multiple engines like `.hbs`, `.ejs` and React `.(ts|js)x`\n- We can use [passport](http://www.passportjs.org) authentication as it always is\n\n### Cons\n\n- It is not so performant, because it assembles the whole HTML on each request\n- It does not support **client side routing**\n\n## Usage\n\n### With @react-ssr/express\n\nInstall it:\n\n```bash\n$ npm install --save @react-ssr/core @react-ssr/express express react react-dom\n```\n\nAnd add a script to your package.json like this:\n\n```json\n{\n  \"scripts\": {\n    \"start\": \"node server.js\"\n  }\n}\n```\n\nThen, populate files below inside your project:\n\n**`server.js`**:\n\n```js\nconst express = require('express');\nconst register = require('@react-ssr/express/register');\n\nconst app = express();\n\n(async () =\u003e {\n  // register `.jsx` or `.tsx` as a view template engine\n  await register(app);\n\n  app.get('/', (req, res) =\u003e {\n    const message = 'Hello World!';\n    res.render('index', { message });\n  });\n\n  app.listen(3000, () =\u003e {\n    console.log('\u003e Ready on http://localhost:3000');\n  });\n})();\n```\n\n**`views/index.jsx`**:\n\n```jsx\nexport default function Index({ message }) {\n  return \u003cp\u003e{message}\u003c/p\u003e;\n}\n```\n\nFinally, just run `npm start` and go to `http://localhost:3000`, and you'll see `Hello World!`.\n\n### With @react-ssr/nestjs-express\n\nInstall it:\n\n```bash\n# install NestJS dependencies\n$ npm install --save @nestjs/core @nestjs/common @nestjs/platform-express reflect-metadata rxjs\n\n# install @react-ssr/nestjs-express\n$ npm install --save @react-ssr/core @react-ssr/nestjs-express react react-dom\n```\n\nAnd add a script to your package.json like this:\n\n```json\n{\n  \"scripts\": {\n    \"start\": \"ts-node --project tsconfig.server.json server/main.ts\"\n  }\n}\n```\n\nThen, populate files below inside your project:\n\n**`tsconfig.json`**:\n\n```json\n{\n  \"compilerOptions\": {\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"jsx\": \"preserve\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\n    \"strict\": true,\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true\n  },\n  \"exclude\": [\n    \"node_modules\",\n    \"ssr.config.js\",\n    \"dist\",\n    \".ssr\"\n  ]\n}\n```\n\n**`tsconfig.server.json`**:\n\n```json\n{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\n    \"server\"\n  ]\n}\n```\n\n**`server/main.ts`**:\n\n```ts\nimport { NestFactory } from '@nestjs/core';\nimport { NestExpressApplication } from '@nestjs/platform-express';\nimport register from '@react-ssr/nestjs-express/register';\nimport { AppModule } from './app.module';\n\n(async () =\u003e {\n  const app = await NestFactory.create\u003cNestExpressApplication\u003e(AppModule);\n\n  // register `.tsx` as a view template engine\n  await register(app);\n\n  app.listen(3000, async () =\u003e {\n    console.log(`\u003e Ready on http://localhost:3000`);\n  });\n})();\n```\n\n**`server/app.module.ts`**:\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { AppController } from './app.controller';\n\n@Module({\n  controllers: [\n    AppController,\n  ],\n})\nexport class AppModule {}\n```\n\n**`server/app.controller.ts`**:\n\n```ts\nimport {\n  Controller,\n  Get,\n  Render,\n} from '@nestjs/common';\n\n@Controller()\nexport class AppController {\n  @Get()\n  @Render('index') // this will render `views/index.tsx`\n  public showHome() {\n    const user = { name: 'NestJS' };\n    return { user };\n  }\n}\n```\n\n**`views/index.tsx`**:\n\n```tsx\ninterface IndexProps {\n  user: any;\n}\n\nconst Index = ({ user }: IndexProps) =\u003e {\n  return \u003cp\u003eHello {user.name}!\u003c/p\u003e;\n};\n\nexport default Index;\n```\n\nFinally, just run `npm start` and go to `http://localhost:3000`, and you'll see `Hello NestJS!`.\n\n## Configuration (`ssr.config.js`)\n\nHere is the default `ssr.config.js`, which is used by `react-ssr` when there are no valid values:\n\n```js\nmodule.exports = {\n  id: 'default',\n  distDir: '.ssr',\n  viewsDir: 'views',\n  staticViews: [],\n  webpack: (config /* webpack.Configuration */, env /* 'development' | 'production' */) =\u003e {\n    return config;\n  },\n};\n```\n\n### `ssr.config.js#id`\n\nThe id of **UI framework**. (default: `default`)\n\nIt can be ignored only when the project does not use any UI frameworks.\n\nSupported UI frameworks are:\n\n- [x] default (the id `default` doesn't need to be specified in `ssr.config.js`)\n  - [x] [bulma](https://bulma.io)\n  - [x] [semantic-ui](https://react.semantic-ui.com)\n  - [x] Or any other **non** CSS-in-JS UI frameworks\n- [x] [emotion](https://emotion.sh)\n- [x] [styled-components](https://www.styled-components.com)\n- [x] [material-ui](https://material-ui.com)\n- [x] [antd](https://ant.design)\n- [ ] and more...\n\nFor example, if we want to use `emotion`, `ssr.config.js` is like this:\n\n```js\nmodule.exports = {\n  id: 'emotion',\n};\n```\n\n### `ssr.config.js#distDir`\n\nThe place where `react-ssr` generates **production** results. (default: `.ssr`)\n\nIf we use TypeScript or any other library which must be compiled, the config below may be useful:\n\n```js\nmodule.exports = {\n  // dist folder should be ignored by `.gitignore`\n  distDir: 'dist/.ssr',\n};\n```\n\n### `ssr.config.js#viewsDir`\n\nThe place where we put views. (default: `views`)\n\nA function `res.render('xxx')` will render `views/xxx.jsx` or `views/xxx.tsx`.\n\nA working example is here: [examples/basic-custom-views](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-custom-views)\n\n### `ssr.config.js#staticViews`\n\nIf specified, `react-ssr` generates html cache when production:\n\n```js\nmodule.exports = {\n  staticViews: [\n    'auth/login',\n    'auth/register',\n    'about',\n  ],\n};\n```\n\n### `ssr.config.js#webpack()`\n\n```js\nmodule.exports = {\n  webpack: (config /* webpack.Configuration */, env /* 'development' | 'production' */) =\u003e {\n    // we can override default webpack config here\n    return config;\n  },\n};\n```\n\n## Custom `process.env.NODE_ENV`\n\nIf you set `process.env.REACT_SSR_ENV`, you can separate `process.env.NODE_ENV` from react-ssr:\n\n**package.json**\n\n```json\n{\n  \"scripts\": {\n    \"start\": \"cross-env NODE_ENV=k8s REACT_SSR_ENV=production node dist/main.js\"\n  }\n}\n```\n\n## Custom Babel Config\n\nWe can extends its default `.babelrc` like this:\n\n**`.babelrc`**:\n\n```json\n{\n  \"presets\": [\n    \"@react-ssr/express/babel\"\n  ]\n}\n```\n\nA working example is here: [examples/basic-custom-babelrc](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-custom-babelrc)\n\n## Custom App\n\nJust put `_app.jsx` or `_app.tsx` into the views root:\n\n**`views/_app.jsx`**:\n\n```jsx\n// we can import global styles or use theming\nimport '../styles/global.scss';\n\nconst App = (props) =\u003e {\n  // yes, this `props` contains data passed from the server\n  // and also we can inject additional data into pages\n  const { children, ...rest } = props;\n\n  // we can wrap this PageComponent for persisting layout between page changes\n  const PageComponent = children;\n\n  return \u003cPageComponent {...rest} /\u003e;\n};\n\nexport default App;\n```\n\nA working example is here:\n\n- [examples/basic-custom-app](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-custom-app)\n- [examples/with-jsx-emotion](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-emotion)\n- [examples/with-jsx-material-ui](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-material-ui)\n\n## Custom Document\n\nJust put `_document.jsx` or `_document.tsx` into the views root:\n\n**`views/_document.jsx`**:\n\n```jsx\nimport React from 'react';\nimport {\n  Document,\n  Head,\n  Main,\n} from '@react-ssr/express';\n\nexport default class extends Document {\n  render() {\n    return (\n      \u003chtml lang=\"en\"\u003e\n        \u003cHead\u003e\n          \u003ctitle\u003eDefault Title\u003c/title\u003e\n          \u003cmeta charSet=\"utf-8\" /\u003e\n          \u003cmeta name=\"viewport\" content=\"minimum-scale=1, initial-scale=1, width=device-width\" /\u003e\n          \u003clink rel=\"shortcut icon\" href=\"/favicon.ico\" /\u003e\n        \u003c/Head\u003e\n        \u003cbody\u003e\n          \u003cMain /\u003e\n        \u003c/body\u003e\n      \u003c/html\u003e\n    );\n  }\n}\n```\n\n**Note**:\n\n- **Please put `\u003cMain /\u003e` component directly under `\u003cbody\u003e` tag and don't wrap `\u003cMain /\u003e` component with another components**, because this is a hydration target for the client.\n\nAnd then, use it as always:\n\n**`views/index.jsx`**:\n\n```jsx\nconst Index = (props) =\u003e {\n  return \u003cp\u003eHello World!\u003c/p\u003e;\n};\n\nexport default Index;\n```\n\nA working example is here: [examples/basic-custom-document](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-custom-document)\n\n## Dynamic `Head`\n\nWe can use the `Head` component in any pages:\n\n**`views/index.jsx`**:\n\n```jsx\nimport React from 'react';\nimport { Head } from '@react-ssr/express';\n\nconst Index = (props) =\u003e {\n  return (\n    \u003cReact.Fragment\u003e\n      \u003cHead\u003e\n        \u003ctitle\u003eDynamic Title\u003c/title\u003e\n        \u003cmeta name=\"description\" content=\"Dynamic Description\" /\u003e\n      \u003c/Head\u003e\n      \u003cp\u003eOf course, SSR Ready!\u003c/p\u003e\n    \u003c/React.Fragment\u003e\n  );\n};\n\nexport default Index;\n```\n\nA working example is here: [examples/basic-dynamic-head](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-dynamic-head)\n\n## Supported UI Framework\n\n- [x] default (the id `default` doesn't need to be specified in `ssr.config.js`)\n  - [x] [bulma](https://bulma.io)\n  - [x] [semantic-ui](https://react.semantic-ui.com)\n  - [x] Or any other **non** CSS-in-JS UI frameworks\n- [x] [emotion](https://emotion.sh)\n- [x] [styled-components](https://www.styled-components.com)\n- [x] [material-ui](https://material-ui.com)\n- [x] [antd](https://ant.design)\n- [ ] and more...\n\n### Non CSS-in-JS framework\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://i.imgur.com/0PwlfVk.png\"\u003e\u003c/p\u003e\n\nLike [semantic-ui](https://react.semantic-ui.com), non CSS-in-JS frameworks are supported without extra configuration.\n\nAll we have to do is to load global CSS in `_document` or each page:\n\n**`views/_document.jsx`**:\n\n```jsx\nimport React from 'react';\nimport {\n  Document,\n  Head,\n  Main,\n} from '@react-ssr/express';\n\nexport default class extends Document {\n  render() {\n    return (\n      \u003chtml\u003e\n        \u003cHead\u003e\n          \u003ctitle\u003eA Sample of Semantic UI React\u003c/title\u003e\n          \u003clink rel=\"stylesheet\" href=\"//cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css\" /\u003e\n        \u003c/Head\u003e\n        \u003cbody\u003e\n          \u003cMain /\u003e\n        \u003c/body\u003e\n      \u003c/html\u003e\n    );\n  }\n}\n```\n\n### With Ant Design\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://i.imgur.com/yWGxseM.png\"\u003e\u003c/p\u003e\n\nIn order to enable SSR, we must install `babel-plugin-import` as devDependencies.\n\nAnd then, populate `.babelrc` in your project root:\n\n```json\n{\n  \"presets\": [\n    \"@react-ssr/express/babel\"\n  ],\n  \"plugins\": [\n    [\n      \"import\",\n      {\n        \"libraryName\": \"antd\",\n        \"style\": \"css\"\n      }\n    ]\n  ]\n}\n```\n\nA working example is here: [examples/with-jsx-antd](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-antd)\n\n### With Emotion\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://i.imgur.com/XN8evEM.png\"\u003e\u003c/p\u003e\n\nIn order to enable SSR, we must install these packages:\n\n- [@emotion/cache](https://npm.im/@emotion/cache) as **dependencies**\n- [create-emotion-server](https://npm.im/create-emotion-server) as **dependencies**\n- [babel-plugin-emotion](https://npm.im/babel-plugin-emotion) as devDependencies\n\nAnd then, populate `.babelrc` in your project root:\n\n```json\n{\n  \"presets\": [\n    \"@react-ssr/express/babel\"\n  ],\n  \"plugins\": [\n    \"emotion\"\n  ]\n}\n```\n\nA working example is here: [examples/with-jsx-emotion](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-emotion)\n\n### With Material UI\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://i.imgur.com/o1AWdyd.png\"\u003e\u003c/p\u003e\n\nWe can use [material-ui](https://material-ui.com) without extra configuration.\n\nA working example is here: [examples/with-jsx-material-ui](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-material-ui)\n\n### With styled-components\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://i.imgur.com/RtuijYA.png\"\u003e\u003c/p\u003e\n\nIn order to enable SSR, we must install `babel-plugin-styled-components` as devDependencies.\n\nAnd then, populate `.babelrc` in your project root:\n\n```json\n{\n  \"presets\": [\n    \"@react-ssr/express/babel\"\n  ],\n  \"plugins\": [\n    \"styled-components\"\n  ]\n}\n```\n\nA working example is here: [examples/with-jsx-styled-components](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-styled-components)\n\n## TypeScript Support\n\nTo enable TypeScript engine (`.tsx`), just put `tsconfig.json` in your project root directory.\n\nThe code of TypeScript will be like this:\n\n**`package.json`**:\n\n```json\n{\n  \"scripts\": {\n    \"start\": \"ts-node server.ts\"\n  }\n}\n```\n\n**`server.ts`**:\n\n```ts\nimport express, { Request, Response } from 'express';\nimport register from '@react-ssr/express/register';\n\nconst app = express();\n\n(async () =\u003e {\n  // register `.tsx` as a view template engine\n  await register(app);\n\n  app.get('/', (req: Request, res: Response) =\u003e {\n    const message = 'Hello World!';\n    res.render('index', { message });\n  });\n\n  app.listen(3000, () =\u003e {\n    console.log('\u003e Ready on http://localhost:3000');\n  });\n})();\n```\n\n**`views/index.tsx`**:\n\n```tsx\ninterface IndexProps {\n  message: string;\n}\n\nexport default function Index({ message }: IndexProps) {\n  return \u003cp\u003e{message}\u003c/p\u003e;\n}\n```\n\n## Packages\n\n| package | version |\n| --- | --- |\n| [@react-ssr/core](https://github.com/saltyshiomix/react-ssr/blob/master/packages/core/README.md) | ![@react-ssr/core](https://img.shields.io/npm/v/@react-ssr/core.svg) ![downloads](https://img.shields.io/npm/dt/@react-ssr/core.svg) |\n| [@react-ssr/express](https://github.com/saltyshiomix/react-ssr/blob/master/packages/express/README.md) | ![@react-ssr/express](https://img.shields.io/npm/v/@react-ssr/express.svg) ![downloads](https://img.shields.io/npm/dt/@react-ssr/express.svg) |\n| [@react-ssr/nestjs-express](https://github.com/saltyshiomix/react-ssr/blob/master/packages/nestjs-express/README.md) | ![@react-ssr/nestjs-express](https://img.shields.io/npm/v/@react-ssr/nestjs-express.svg) ![downloads](https://img.shields.io/npm/dt/@react-ssr/nestjs-express.svg) |\n\n## Examples\n\n### @react-ssr/express\n\n**.jsx**\n\n- [examples/basic-jsx](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-jsx)\n- [examples/basic-custom-app](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-custom-app)\n- [examples/basic-custom-babelrc](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-custom-babelrc)\n- [examples/basic-custom-document](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-custom-document)\n- [examples/basic-custom-views](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-custom-views)\n- [examples/basic-dynamic-head](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-dynamic-head)\n- [examples/basic-hmr-css](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-hmr-css)\n- [examples/basic-hmr-scss](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-hmr-scss)\n- [examples/basic-blogging](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-blogging)\n- [examples/basic-multiple-view-engines](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-multiple-view-engines)\n- [examples/support-yarn2-pnp](https://github.com/saltyshiomix/react-ssr/tree/master/examples/support-yarn2-pnp)\n- [examples/with-jsx-antd](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-antd)\n- [examples/with-jsx-bulma](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-bulma)\n- [examples/with-jsx-emotion](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-emotion)\n- [examples/with-jsx-material-ui](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-material-ui)\n- [examples/with-jsx-semantic-ui](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-semantic-ui)\n- [examples/with-jsx-styled-components](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-jsx-styled-components)\n\n**.tsx**\n\n- [examples/basic-tsx](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-tsx)\n- [examples/with-tsx-redux-todo](https://github.com/saltyshiomix/react-ssr/tree/master/examples/with-tsx-redux-todo)\n\n### @react-ssr/nestjs-express\n\n- [examples/basic-nestjs](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-nestjs)\n- [examples/basic-nestjs-nodemon](https://github.com/saltyshiomix/react-ssr/tree/master/examples/basic-nestjs-nodemon)\n\n## Real World Examples\n\n- [react-ssr-jsx-starter](https://github.com/saltyshiomix/react-ssr-jsx-starter)\n- [react-ssr-tsx-starter](https://github.com/saltyshiomix/react-ssr-tsx-starter)\n- [react-ssr-nestjs-starter](https://github.com/saltyshiomix/react-ssr-nestjs-starter)\n- [react-ssr-redux-todo-app](https://github.com/saltyshiomix/react-ssr-redux-todo-app)\n\n## Develop `examples/\u003cexample-folder-name\u003e`\n\n```bash\n$ git clone https://github.com/saltyshiomix/react-ssr.git\n$ cd react-ssr\n$ lerna bootstrap\n$ yarn\n$ yarn dev \u003cexample-folder-name\u003e\n```\n\n## Articles\n\n[Introducing an Alternative to NEXT.js](https://dev.to/saltyshiomix/introducing-an-alternative-to-next-js-12ph)\n\n[[Express] React as a View Template Engine?](https://dev.to/saltyshiomix/express-react-as-a-view-template-engine-h37)\n\n## Related\n\n[reactjs/express-react-views](https://github.com/reactjs/express-react-views)\n\n## Contact\n\n- via [GitHub Issues](https://github.com/saltyshiomix/react-ssr/issues)\n- via [Twitter](https://twitter.com/saltyshiomix)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaltyshiomix%2Freact-ssr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsaltyshiomix%2Freact-ssr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaltyshiomix%2Freact-ssr/lists"}