Code Monkey home page Code Monkey logo

server-side-rendering's Introduction

Interactive Guide to Server-side rendering with Webpack, React, React Transmit, CSS modules and more

Follow the tutorial commit-by-commit, to see the server-side rendering drama unfold with a happy ending!

CLICK TO GET STARTED

Contents (mostly for Google)

RUN: npm run start and then open index.html in the browser.

Webpack helps us to bundle our code with dependencies from npm (such as React), and then transforms the code with Babel, to make it compatible with ES5.

RUN: npm run start and go to http://localhost:3000.

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.

Now lets learn to deal with styles. We configure webpack loaders to support loading CSS files. This is cool, but there comes one problem with server-side rendering: styles won't be loaded until all of JS loads, so no styles for devices without JS.

Let's fix this problem with webpack's ExtractTextPlugin plugin: it extracts all CSS styles into one CSS file that we can serve to our client, so our page will instantly look perfectly styled, even without JS.

Everybody loves CSS modules, and the great news is that they come free with Webpack. The bad news is that we can't use them with server-side rendering, as we don't use Webpack when rendering on the server-side.

So at this step we broke everything, and the only way to continue from here, is to start using Webpack to pre-build code for server-side rendering too, and that's what we'll do at the next step.

To save our issue with CSS modules, we make Webpack to render both our client and our server side code. The best way to do it is to use Webpack's abillity to handle array of configs.

With first config we transform our client-side code (client.js), just as we were doing before. But with the second config we transform handleRender function that we have extracted into serverEntry.js, so now our server-side rendering code gets processed by Webpack too. There we use css-loader/locals as a CSS loader, to just get class names from CSS modules, as that's all we need to render html on the server. Also notice how we use target:node and nodeExternals.

Great! Now our build is fixed, so we can use CSS modules both during client and server rendering.

Now let's fetch some data asyncronously. We'll use isomorphic-fetch, as it works both on client and server our of the box.

Fetching data works just fine on the server, but the problem is that on the server we didn't wait for fetch to finish fetching the data before sending the response, so our pre-rendered html doesn't have any async data when it arrives. Let's try to fix it in the next step.

There are multiple ways to solve async rendering issue. Here we'll use react-transmit to declaratively define our data dependencies per component, and return rendered html only when all data is resolved.

It works even with nested components, constructing the single promises tree, which is qute cool. It is inspired by Facebook Relay, so if you are familiar with it, you'll feel right at home.

That's all, folks!

Got more tips or challenges with server-side rendering of React? Submit a PR!

server-side-rendering's People

Contributors

dimaip avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

server-side-rendering's Issues

Is this guide up to date?

I'm surprised that this repo has become relatively popular. Can anyone check if this guide is still up to date? Anything that needs updating?

How to deploy and run production server?

After the last step I succesfully run npm run start so I can test on dev server that all is working.

Now I must deploy. Must I upload only the 3 files of built folder into the root? Or what?

It's usefull your guide but need the extra final step: deployment on production host.

server side reload

The project is awesome. I find it is impossible to hotload the server side code when I change some code. Please add the feature. Thanks

Typo ?

I wonder if u meant /build instead of /built

output: {
    path: path.join(__dirname, 'built/'),
    filename: 'index.js',
    publicPath: '/built/'
  },

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.