Skip to content

Commit fad6b64

Browse files
committed
Step 2: trivial server-side rendering with Express
RUN: `npm run start` and go to `http://localhost:3000`. - A little refactoring: move Hello component to separate file etc - Render the same Hello component server-side with ReactDOMServer Now we are rendering the same Hello component both on client and server: with express server we pre-render the Hello component on the server, and server the client with rendered html, and with webpack we continue to bundle client.js into ES5 code that the browser would understand, just as we did at previous step.
1 parent 7d1d067 commit fad6b64

File tree

5 files changed

+41
-9
lines changed

5 files changed

+41
-9
lines changed

Hello.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import React from 'react';
2+
3+
const Hello = React.createClass({
4+
render: function() {
5+
return <div>Hello {this.props.name}</div>;
6+
}
7+
});
8+
9+
export default Hello;

index.js renamed to client.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom';
3-
4-
var Hello = React.createClass({
5-
render: function() {
6-
return <div>Hello {this.props.name}</div>;
7-
}
8-
});
3+
import Hello from 'Hello';
94

105
ReactDOM.render(
116
<Hello name="World" />,

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
"name": "server-side-rendering",
33
"version": "0.0.1",
44
"description": "The missing guide to server-side rendering",
5-
"main": "index.js",
5+
"main": "server.js",
66
"scripts": {
7-
"start": "webpack"
7+
"start": "webpack && babel-node server.js"
88
},
99
"author": "Dmitri Pisarev",
1010
"license": "ISC",
1111
"dependencies": {
12+
"express": "^4.13.4",
1213
"path": "^0.12.7",
1314
"react": "^0.14.8",
1415
"react-dom": "^0.14.8"

server.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import express from 'express';
2+
import fs from 'fs';
3+
import path from 'path';
4+
import React from 'react';
5+
import ReactDOMServer from 'react-dom/server';
6+
import Hello from './Hello.js';
7+
8+
function handleRender(req, res) {
9+
const html = ReactDOMServer.renderToString(
10+
<Hello name="World" />
11+
);
12+
fs.readFile('./index.html', 'utf8', function (err, file) {
13+
if (err) {
14+
return console.log(err);
15+
}
16+
const document = file.replace(/<div id="app"><\/div>/, `<div id="app">${html}</div>`);
17+
res.send(document);
18+
});
19+
}
20+
21+
const app = express();
22+
// Serve built files with express static files middleware
23+
app.use('/built', express.static(path.join(__dirname, 'built')));
24+
// Serve normal requests with our handleRender function
25+
app.get('*', handleRender);
26+
app.listen(3000);
27+
console.log('=== Go to http://localhost:3000 ===');

webpack.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const path = require('path');
22
const webpack = require('webpack');
33

44
const config = {
5-
entry: ['index.js'],
5+
entry: ['client.js'],
66
output: {
77
path: path.join(__dirname, 'built/'),
88
filename: 'index.js',

0 commit comments

Comments
 (0)