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
px
part 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-loader
npm install --save-dev postcss-variables-loader
NB: 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'