├── .gitignore ├── app ├── image.jpg ├── image.png ├── Application.css ├── entry.js └── Application.js ├── server ├── style-collector.js ├── style-collector.loader.js ├── index.js └── page.js ├── package.json ├── webpack.config.js └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /server/*.generated.* 3 | /public/assets -------------------------------------------------------------------------------- /app/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webpack/react-webpack-server-side-example/master/app/image.jpg -------------------------------------------------------------------------------- /app/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webpack/react-webpack-server-side-example/master/app/image.png -------------------------------------------------------------------------------- /app/Application.css: -------------------------------------------------------------------------------- 1 | .application { 2 | border: 1px solid blue; 3 | background: url(image.png), url(image.jpg); 4 | } -------------------------------------------------------------------------------- /server/style-collector.js: -------------------------------------------------------------------------------- 1 | exports.collect = function(fn) { 2 | var stuff = []; 3 | function add(css) { 4 | stuff.push(css); 5 | } 6 | var old = exports.add; 7 | exports.add = add; 8 | fn(); 9 | exports.add = old; 10 | return stuff.join("\n"); 11 | } 12 | 13 | exports.add = function() {} -------------------------------------------------------------------------------- /server/style-collector.loader.js: -------------------------------------------------------------------------------- 1 | module.exports = function() {}; 2 | module.exports.pitch = function(req) { 3 | this.cacheable(); 4 | return "require(" + JSON.stringify(require.resolve("./style-collector")) + ").add(require(" + JSON.stringify("!!" + req) + "));\n" + 5 | "delete require.cache[module.id];"; 6 | } -------------------------------------------------------------------------------- /app/entry.js: -------------------------------------------------------------------------------- 1 | /** @jsx React.DOM */ 2 | 3 | var React = require("react"); 4 | var Application = require("./Application"); 5 | 6 | React.renderComponent( 7 | , 8 | document.getElementById("content") 9 | ); 10 | 11 | var serverSideStyle = document.getElementById("server-side-style"); 12 | if(serverSideStyle) 13 | document.getElementsByTagName("head")[0].removeChild(serverSideStyle); -------------------------------------------------------------------------------- /app/Application.js: -------------------------------------------------------------------------------- 1 | /** @jsx React.DOM */ 2 | 3 | var React = require("react"); 4 | 5 | var Application = React.createClass({ 6 | render: function() { 7 | require("./Application.css"); 8 | return ( 9 |
10 |

Hello World

11 |
{this.props.url}
12 | 13 | 14 |
15 | ); 16 | } 17 | }); 18 | 19 | module.exports = Application; -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | var express = require("express"); 2 | var path = require("path"); 3 | var page = require("./page.generated.js"); 4 | 5 | var app = express(); 6 | 7 | app.use(express.static(path.join(__dirname, "..", "public"))); 8 | 9 | var stats = require("./stats.generated.json"); 10 | 11 | app.get("/", function(req, res) { 12 | res.end(page(req, stats.assetsByChunkName.main)); 13 | }); 14 | 15 | var server = app.listen(3000, function() { 16 | console.log('Listening on port %d', server.address().port); 17 | }); -------------------------------------------------------------------------------- /server/page.js: -------------------------------------------------------------------------------- 1 | /** @jsx React.DOM */ 2 | 3 | var React = require("react"); 4 | 5 | var Application = require("../app/Application"); 6 | 7 | var styleCollector = require("./style-collector"); 8 | 9 | module.exports = function(req, scriptFilename) { 10 | 11 | var html; 12 | var css = styleCollector.collect(function() { 13 | html = React.renderComponentToString(); 14 | }); 15 | return React.renderComponentToString( 16 | 17 | 18 |