@ecomfe/class-names-loader
v2.0.0
Published
Webpack loader to transform style into classNames bindings
Downloads
136
Keywords
Readme
class-names-loader
Webpack loader to transform style into classNames bindings.
Inspired by itsmepetrov/classnames-loader and have a total written to introduce features and breaking changes like:
- Written in TypeScript.
- Support
style-loader
'sesModule
format only. - Compatible both default export and named export.
- Drop support for IE < 9 to minimize output code.
- Produce ES module code to enable optimizations like module concatenation.
We will keep active maintain.
Install
npm install -D class-names-loader
Auto binding
This loader is to bind a CSS modules enabled style-loader
output into a classnames
compatible function, received class names are mapped to CSS modules transformed ones:
import c from './index.css';
// May renders as `<div class="title-0f2bd">
<div className={c('title')} />
This function is also a mapping object from raw class names to transformed ones, so c.title
is identical to c('title')
.
Also it behaves like classnames
and accept more complex arguments like c('title', {emphasis: props.isHeading}, props.className)
. Any class names not in CSS file are rended as is, c('some-class')
returns "some-class"
.
Usage
A traditional webpack configuration looks like:
{
module: {
rules: [
{
test: /\.css$/,
use: [
{
loader: 'class-names-loader',
options: {
// options
},
},
{
loader: 'style-loader',
modules: true,
},
{
loader: 'css-loader',
modules: true,
},
],
},
],
},
}
style-loader >= 2
enables esModule
option by default, and it must be enabled when combine with class-names-loader
.
Options
interface Options {
// Custom classnames module path, by default it imports `classnames`
classNamesModule?: string;
// Use named import from style-loader
namedImport?: boolean;
}
Custom classnames
By default we require classnames
module to be installed and import it, you can also install a custom module and pass it's module path to classNameModule
option.
This is especially useful when you create a custom build tool and want to encapsulate classnames
inside this tool:
// Build tool with class-names-loader and classnames installed locally
{
loader: require.resolve('class-names-loader'),
options: {
classNamesModule: require.resolve('classnames'),
},
}
Named import
If you have namedExport
option enabled in style-loader
, you should also enable namedImport
option to make it compatible.