37

The current practice for CSS with React components seems to be using webpack's style-loader to load it into the page in.

import React, { Component } from 'react';
import style from './style.css';

class MyComponent extends Component {
    render(){
        return (
            <div className={style.demo}>Hello world!</div>
        );
    }
}

By doing this the style-loader will inject a <style> element into the DOM. However, the <style> will not be in the virtual DOM and so if doing server side rendering, the <style> will be omitted. This cause the page to have FOUC.

Is there any other methods to load CSS modules that work on both server and client side?

3
  • You can try this postcss plugin: github.com/ctxhou/postcss-hash-classname . I found the style loader only limit to the webpack, so with this plugin, you can extract the css class name as a js object file. Then you can require this style.js and use the same code. Because this is a .js file, of course it can support server side rendering. You can check the repo to know more : ) Commented Jan 5, 2016 at 20:15
  • The problem I'm looking to solve is to make webpack inject the CSS into the virtual DOM so server side rendering also has CSS packed. I don't think that one has anything related to this task? Commented Jan 6, 2016 at 0:58
  • You mean you don't want to create another css file and only want the webpack to help you inject it ? Commented Jan 6, 2016 at 21:00

3 Answers 3

11

You can use webpack/extract-text-webpack-plugin. This will create a independently redistributable stylesheet you can reference then from your documents.

Sign up to request clarification or add additional context in comments.

1 Comment

that doesnt help with the combination of css modules and server side rendering
10

You can have a look at the isomorphic-style-loader. The loader was specifically created to solve this kind of issues.

However for using this you have to use an _insertCss() method provided by the loader. The documentation details how to use it.

Hope it helped.

Comments

3

For me, I am using the Webpack loader css-loader to implement CSS modules in isomorphic application.

On server side, the webpack config will be like this:

  module: {
    rules: [
      {
        test: /\.(css)$/,
        include: [
          path.resolve(__dirname, '../src'),
        ],
        use: [
          {
            // Interprets `@import` and `url()` like `import/require()` and will resolve them
            loader: 'css-loader/locals',
            options: {
              modules: true,
              localIdentName: '[name]__[local]--[hash:base64:5]'
            }
          },
        ],
      },
    ]
  }

On client side, the webpack config looks like this

          {
            // Interprets `@import` and `url()` like `import/require()` and will resolve them
            loader: 'css-loader',
            options: {
              modules: true,
              localIdentName: '[name]__[local]--[hash:base64:5]'
            }
          },

Off course, if you are using SASS, you need to use sass-loader to compile scss to css, and postcss-loader can help to add the autoprefixer.

3 Comments

when mention sass, sass-loader, autoprefixer etc - do I also need to setup webpack to handle those for the server-side?
yes, you need to setup those up for server side as well.
Is there a way to do this using only one set of config - for example, creating a library which will be used for either server- or client-side rendering? (Unknown at build time)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.