Allows you to share variables between CSS and JS with Webpack and HMR.
This loader transforms special CSS files to JS modules.
- Shared variables between CSS and JS
- HMR friendly, CSS changes are applied on the fly.
To be more JS friendly loader will:
- strip pxpart from CSS px numbers
- convert dashes-case to camelCase
- check for runtime config mutations and access of missing keys (only in dev or es6 mode)
/* variables.config.css */
@custom-media --small-device (max-width: 480px))
:root {
  --primary-color: blue;
  --gutter: 30px;
}/* component.css  */
@import 'colors.config.css'
.component {
  color: var(--primary-color);
  margin: 0 var(--gutter);
}
@media (--small-device) {
  /* styles for small viewport */
}// component.js
import variables from 'colors.config.css';
console.log(variables);
/*
  variables = {
    primaryColor: 'blue';
    gutter: 30;
    smallDevice: '(max-width: 480px)'
  }
*/
component.style.color = variables.primaryColor;
function add5ToGutter() {
  return 5 + variables.gutter;
}yarn add --dev postcss-variables-loadernpm install --save-dev postcss-variables-loaderNB: You need to process CSS somehow (eg postcss) and imports inside css (eg via postcss-import)
Recommended webpack configuration:
webpack.config.js with babel-loader
rules: [
  {
    test: /\.config.css$/,
    loader: 'babel-loader!postcss-variables-loader'
  },
  // dont forget to exclude *.config.css from other css loaders
  {
    test: /\.css$/,
    exclude: /\.config.css$/,
    loader: 'css-loader!postcss-loader'
  }
]
if production.env.NODE_ENV === 'development' it will try to wrap config inside Proxy in runtime.
It is used to guard from accidental mutations or accessing missing keys.
If you dont want this behaviour: pass es5=1:
loader: 'postcss-variables-loader?es5=1'