@react-ssr/static v0.21.14
Overview
- Static site generator by using React SSR (Server Side Rendering)
- Developer Experience
- Dynamic
Headcomponent for better SEO - HMR (Hot Module Replacement) when
process.env.NODE_ENV !== 'production' - Automatically reflect to the browser as soon as you save the scripts and even if styles
- Dynamic
Usage
Install it:
$ npm install --save @react-ssr/static react react-domAnd add a script to your package.json like this:
{
"scripts": {
"dev": "static",
"build": "static build"
}
}Then, populate files below inside your project:
.babelrc:
{
"presets": [
"@react-ssr/static/babel"
]
}static.config.js:
module.exports = {
routes: {
'/': 'index',
},
};views/index.jsx:
export default function Index() {
return <p>Hello Static Site</p>;
}Finally,
- run
npm run devand you'll seeHello Static Sitein your browser. - run
npm run buildand you'll see the static files in the dist directory.
A working examples are here:
Configuration (static.config.js)
Here is the default static.config.js, which is used by react-ssr when there are no valid values:
module.exports = {
id: 'default',
distDir: 'dist',
viewsDir: 'views',
port: 3000,
routes: {},
publicPaths: [],
webpack: (config /* webpack.Configuration */, env /* 'development' | 'production' */) => {
return config;
},
};static.config.js#id
The id of UI framework. (default: default)
It can be ignored only when the project does not use any UI frameworks.
Supported UI frameworks are:
- default (the id
defaultdoesn't need to be specified instatic.config.js)- bulma
- semantic-ui
- Or any other non CSS-in-JS UI frameworks
- emotion
- styled-components
- material-ui
- antd
- and more...
For example, if we want to use emotion, static.config.js is like this:
module.exports = {
id: 'emotion',
};static.config.js#distDir
The place where react-ssr generates static files. (default: dist)
module.exports = {
distDir: 'out',
};static.config.js#viewsDir
The place where we put views. (default: views)
module.exports = {
viewsDir: 'pages',
};static.config.js#port
The port of the development server. (default: 3000)
module.exports = {
port: 4000,
};static.config.js#routes
The key is the route, and the value is the path from the views directory.
module.exports = {
routes: {
'/': 'index',
'/login': 'auth/login',
},
};static.config.js#publicPaths
The place where we put static files like images.
module.exports = {
publicPaths: [
'public',
],
};static.config.js#webpack()
module.exports = {
webpack: (config /* webpack.Configuration */, env /* 'development' | 'production' */) => {
// we can override default webpack config here
return config;
},
};Custom Document
Just put _document.jsx or _document.tsx into the views root:
views/_document.jsx:
import React from 'react';
import {
Document,
Head,
Main,
} from '@react-ssr/static';
export default class extends Document {
render() {
return (
<html lang="en">
<Head>
<title>Default Title</title>
<meta charSet="utf-8" />
<meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width" />
<link rel="shortcut icon" href="/favicon.ico" />
</Head>
<body>
<Main />
</body>
</html>
);
}
};Note:
- Please put
<Main />component directly under<body>tag and don't wrap<Main />component with another components, because this is a hydration target for the client.
And then, use it as always:
views/index.jsx:
const Index = () => {
return <p>Hello World!</p>;
};
export default Index;A working example is here: examples/basic-custom-document
Dynamic Head
We can use the Head component in any pages:
views/index.jsx:
import React from 'react';
import { Head } from '@react-ssr/static';
const Index = (props) => {
return (
<React.Fragment>
<Head>
<title>Dynamic Title</title>
<meta name="description" content="Dynamic Description" />
</Head>
<p>Of course, SSR Ready!</p>
</React.Fragment>
);
};
export default Index;A working example is here: examples/basic-dynamic-head
Supported UI Framework
- default (the id
defaultdoesn't need to be specified instatic.config.js)- bulma
- semantic-ui
- Or any other non CSS-in-JS UI frameworks
- emotion
- styled-components
- material-ui
- antd
- and more...
Non CSS-in-JS framework
Like semantic-ui, non CSS-in-JS frameworks are supported without extra configuration.
All we have to do is to load global CSS in _document or each page:
views/_document.jsx:
import React from 'react';
import {
Document,
Head,
Main,
} from '@react-ssr/static';
export default class extends Document {
render() {
return (
<html>
<Head>
<title>A Sample of Semantic UI React</title>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css" />
</Head>
<body>
<Main />
</body>
</html>
);
}
}With Ant Design
In order to enable SSR, we must install babel-plugin-import as devDependencies.
And then, populate .babelrc in your project root:
{
"presets": [
"@react-ssr/static/babel"
],
"plugins": [
[
"import",
{
"libraryName": "antd",
"style": "css"
}
]
]
}A working example is here: examples/with-jsx-antd
With Emotion
In order to enable SSR, we must install these packages:
- @emotion/cache as dependencies
- create-emotion-server as dependencies
- babel-plugin-emotion as devDependencies
And then, populate .babelrc in your project root:
{
"presets": [
"@react-ssr/static/babel"
],
"plugins": [
"emotion"
]
}A working example is here: examples/with-jsx-emotion
With Material UI
We can use material-ui without extra configuration.
A working example is here: examples/with-jsx-material-ui
With styled-components
In order to enable SSR, we must install babel-plugin-styled-components as devDependencies.
And then, populate .babelrc in your project root:
{
"presets": [
"@react-ssr/static/babel"
],
"plugins": [
"styled-components"
]
}A working example is here: examples/with-jsx-styled-components
TypeScript Support
To enable TypeScript engine (.tsx), just put tsconfig.json in your project root directory.
Examples
- @react-ssr/express
.jsx- examples/basic-jsx
- examples/basic-custom-app
- examples/basic-custom-babelrc
- examples/basic-custom-document
- examples/basic-custom-views
- examples/basic-dynamic-head
- examples/basic-hmr-css
- examples/basic-hmr-scss
- examples/basic-blogging
- examples/with-jsx-antd
- examples/with-jsx-bulma
- examples/with-jsx-emotion
- examples/with-jsx-material-ui
- examples/with-jsx-semantic-ui
- examples/with-jsx-styled-components
.tsx
- @react-ssr/nestjs-express
- @react-ssr/static
Starters
Articles
Introducing an Alternative to NEXT.js
[Express] React as a View Template Engine?
Related
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago