DavidWells/isomorphic-react-example
DavidWells/isomorphic-react-example has 1,667 GitHub stars and 262 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-07 03:23 UTC. Last push 2017-10-30.
Deprecated! ReactJS + NodeJS ( express ) demo tutorial with video. Universal/Isomorphic JS = Shared JavaScript that runs on both the client & server.
Measured star growth
- in 24h
- 0
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
OriginalWhat is Isomorphic/Universal JavaScript ?
There is a push to change the word Isomorphic to Universal. Whatever floats your boat!
See full post on ReactJS News
Shared JavaScript that runs on both the client & server.
What's the point?
JavaScript driven MVCs (angular, ember, backbone, etc.) render on DOM load, this can be really slowwwww & can make for a bad user experience.
Another major problem is that they aren't indexable by search engines (without paying $$ for a third party service like https://prerender.io/). If your app is serving any kind of data that people might be searching for, this is a bad thing.
When you render JavaScript on the server side you can solve these problems and be super cool while doing so!
Isomorphic Javascript Benefits:
- Better overall user experience
- Search engine indexable
- Easier code maintenance
- Free progressive enhancements
I've built a live example of isomorphic JS for you to check out here: https://github.com/DavidWells/isomorphic-react-example
The demo uses the griddle react component to show how you can have apps with large data sets indexed by search engines and thus easier to find by potential users in search engines.
Tutorial & Video!
https://www.youtube.com/watch?v=8wfY4TGtMUo
In /server.js install the jsx transpiler:
// Make sure to include the JSX transpiler
require("node-jsx").install();
Then change components to Node friendly syntax where you module.exports the component if it's in a seperate file
Also make sure to React.createFactory your component for it to be rendered server side
/** @jsx React.DOM */
var React = require('react/addons');
/* create factory with griddle component */
var Griddle = React.createFactory(require('griddle-react'));
var fakeData = require('../data/fakeData.js').fakeData;
var columnMeta = require('../data/columnMeta.js').columnMeta;
var resultsPerPage = 100;
var ReactApp = React.createClass({
componentDidMount: function () {
console.log(fakeData);
},
render: function () {
return (
<div id="table-area">
<Griddle results={fakeData} columnMetadata={columnMeta} resultsPerPage={resultsPerPage} tableClassName="table"/>
</div>
)
}
});
/* Module.exports instead of normal dom mounting */
module.exports.ReactApp = ReactApp;
/* Normal mounting happens inside of /main.js and is bundled with browserify */
Now the magic happens with routes using React.renderToString inside /app/routes/coreRoutes.js:
var React = require('react/addons');
var ReactApp = React.createFactory(require('../components/ReactApp').ReactApp);
module.exports = function(app) {
app.get('/', function(req, res){
// React.renderToString takes your component
// and generates the markup
var reactHtml = React.renderToString(ReactApp({}));
// Output html rendered by react
// console.log(myAppHtml);
res.render('index.ejs', {reactOutput: reactHtml});
});
};
The reactOutput variable is then passed into the template:
<!doctype html>
<html>
<head>
<title>React Isomorphic Server Side Rendering Example</title>
<link href='/styles.css' rel="stylesheet">
</head>
<body>
<h1 id="main-title">React Isomorphic Server Side Rendering Example</h1>
<!-- reactOutput is the server compiled React Dom Nodes -->
<!-- comment out reactOutput to see empty non indexable source in browser -->
<div id="react-main-mount">
<%- reactOutput %>
</div>
<!-- comment out main.js to ONLY see server side rendering -->
<script src="/main.js"></script>
</body>
</html>
Notes:
Because the files are .js and not .jsx, the React.createFactory has to be used when including components. See why here: https://gist.github.com/sebmarkbage/ae327f2eda03bf165261
Demo Install Instructions
If you would like to download the code and try it for yourself:
- Clone the repo:
[email protected]:DavidWells/isomorphic-react-example.git - Install packages:
npm install - Launch:
node server.js - Visit in your browser at:
http://localhost:4444 - To see serverside rendering, comment out main.js from the /views/index.ejs file. This will show what is rendered purely from the server side.
Build changes with gulp
Other Isomorphic Tutorials & Resources
Server-Client with React
- Server/Client With React, Part 1: Getting Started
- Server/Client With React, Part 2: The Build System
- Server/Client With React, Part 3: Frontend Server
Server Side rendering
- Server Side Rendering for ReactJS
- React Server Rendering
- JDK8 + Facebook React: Rendering single page apps on the server
- Server-side React with PHP – part 1
- Server-side React with PHP – part 2
- Server-rendered React components in Rails
New to React? Check out these tutorials
Explore related projects
codecrafters-io/build-your-own-x
Master programming by recreating your favorite technologies from scratch.
560,641 starspublic-apis/public-apis
A collective list of free APIs
496,892 starsmorluto/rea
Reverse engineer anything with agents, from app behavior down to native binaries.
439,712 starsopenclaw/openclaw
The AI that really does things. Any OS. Any Platform. The lobster way. 🦞
394,110 stars