Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

iso-morphic-style-loader

creeperyang552MIT2.0.1

isomorphic style loader module for webpack

readme

npm travis license

Isomorphic Style Loader

The isomorphic style loader based on style-loader, work both with server side and browser side.

Install

npm install iso-morphic-style-loader --save-dev

Usage

In fact, there is nothing different with the style-loader, just use the same config as you like.

However, some more work if you want to add critical path CSS with isomorphic app:

/// Such as server.js, where you render your isomorphic app and will send it
/// back to your user.
data.styles = []
// iso-morphic-style-loader will offer you the way to access imported styles
// via React's context.
const context = {
  // will be invoked when render in server side
  iterateCss: (styles) => {
    styles.forEach(style => {
      data.push({
        ...style.attrs,
        id: style.id,
        cssText: style.content.join('\n')
      })
    })
  },
}
// Then we will pass this styles to your React Component.
const html = ReactDOM.renderToStaticMarkup(<App {...data} />)
res.status(route.status || 200)
res.send(`<!doctype html>${html}`)

///////////

// Here is your App.js
// Perfect, we can insert styles easily.
render() {
  return (
    {styles.map(({id, cssText, ...rest}) =>
      <style
        {...rest}
        key={id}
        id={id}
        dangerouslySetInnerHTML={{ __html: cssText }}
      />
    )}
  )
}

//////////
// And here your component where really import styles
import React from 'react'
import PropTypes from 'prop-types'
import notifyCssDeps from 'iso-morphic-style-loader/lib/notifyCssDeps'
import css from './index.css'
import css2 from './demo.css'

// The decorator will invoke previous iterateCss method when the component get rendered
@notifyCssDeps(css, css2)
class MyComponent extends React.Component {
  render() {}
}

Features

  1. For server side, the lib will use React's context to offer you a way to access styles.

     iterateCss: (styles) => {
       styles.forEach(style => {
         data.push({
           ...style.attrs,
           id: style.id,
           cssText: style.content.join('\n')
         })
       })
     }

    Nothing will happens if you ignore iterateCss, no errors in server side rendering, and works the same as style-loader do.

    But if you want to optimize for critical path CSS rendering, please inject styles during server side rendering.

  2. The browser side behaviour is exactly the same as `style-loader@0.18.2. And you can enjoy all features supported bystyle-loader@0.18.2`.

  3. No FOUC, no duplicate!

    1. The script will try to remove the styles injected at server side to prevent duplicate.
    2. However it only remove after client side styles created, so no FOUC.

Demo

Left is with style-loader and right is with iso-morphic-style-loader.

changelog

Change Log

All notable changes to this project will be documented in this file. See standard-version for commit guidelines.

0.18.2 (2017-06-05)

Bug Fixes

  • url: use loaderUtils.stringifyRequest to avoid invalidating hashes due to absolute paths (#242) (97508ec)
  • Add null check to removeStyleElement (#245) (0a4845c)

0.18.1 (2017-05-23)

Bug Fixes

0.18.0 (2017-05-22)

Bug Fixes

  • stringify the options.transform request (#230) (5888095)

Features

0.17.0 (2017-05-01)

Features

0.16.1 (2017-03-28)

Bug Fixes

0.16.0 (2017-03-22)

Bug Fixes

  • addStyles: update for test for old IE versions (#196) (1f68495)

Features

  • Set custom attributes for tag in url mode (#198) (2c4f427)

0.15.0 (2017-03-21)

Bug Fixes

  • match parens recursively on URLs to not fix embeded calls (#192) (71e0908)

Features

0.14.1 (2017-03-15)

Bug Fixes

  • syntax error in IE10 and below because of const keyword (#190) (01080cf)

0.14.0 (2017-03-15)

Bug Fixes

  • Adds type attr. to the generated link element (2a2f261)
  • fixUrls: add param to fix relative urls (#186) (19959ee)
  • usable: Export locals if available(#128) (e280cb6)

Features

  • tag-attribute: Add support for custom tag attribute (995f3de)