GitPedia

Babel plugin css modules transform

Extract css class names from required css module files, so we can render it on server.

From michalkvasnicak·Updated June 12, 2026·View on GitHub·

This Babel plugin finds all `require`s for css module files and replace them with a hash where keys are class names and values are generated css class names. The project is written primarily in JavaScript, distributed under the MIT License license, first published in 2015. Key topics include: babel, babel-plugin, css-files, css-modules, extract-css.

Latest release: v1.2.7Extend camelCase option
March 22, 2017View Changelog →

babel-plugin-css-modules-transform Circle CI

🎉 Babel 6 and Babel 7 compatible

⚠️ Babel 7 compatibility added in 1.4.0

This Babel plugin finds all requires for css module files and replace them with a hash where keys are class names and values are generated css class names.

This plugin is based on the fantastic css-modules-require-hook.

Warning

This plugin is experimental, pull requests are welcome.

Do not run this plugin as part of webpack frontend configuration. This plugin is intended only for backend compilation.

Example

css
/* test.css */ .someClass { color: red; }
js
// component.js const styles = require('./test.css'); console.log(styles.someClass); // transformed file const styles = { 'someClass': 'Test__someClass___2Frqu' } console.log(styles.someClass); // prints Test__someClass___2Frqu

Installation

console
npm install --save-dev babel-plugin-css-modules-transform

Include plugin in .babelrc

json
{ "plugins": ["css-modules-transform"] }

With custom options css-modules-require-hook options

js
{ "plugins": [ [ "css-modules-transform", { "append": [ "npm-module-name", "./path/to/module-exporting-a-function.js" ], "camelCase": false, "createImportedName": "npm-module-name", "createImportedName": "./path/to/module-exporting-a-function.js", "devMode": false, "extensions": [".css", ".scss", ".less"], // list extensions to process; defaults to .css "generateScopedName": "[name]__[local]___[hash:base64:5]", // in case you don't want to use a function "generateScopedName": "./path/to/module-exporting-a-function.js", // in case you want to use a function "generateScopedName": "npm-module-name", "hashPrefix": "string", "ignore": "*css", "ignore": "./path/to/module-exporting-a-function-or-regexp.js", "preprocessCss": "./path/to/module-exporting-a-function.js", "preprocessCss": "npm-module-name", "processCss": "./path/to/module-exporting-a-function.js", "processCss": "npm-module-name", "processorOpts": "npm-module-name", "processorOpts": "./path/to/module/exporting-a-plain-object.js", "mode": "string", "prepend": [ "npm-module-name", "./path/to/module-exporting-a-function.js" ], "extractCss": "./dist/stylesheets/combined.css" } ] ] }

Using a preprocessor

When using this plugin with a preprocessor, you'll need to configure it as such:

js
// ./path/to/module-exporting-a-function.js var sass = require('node-sass'); var path = require('path'); module.exports = function processSass(data, filename) { var result; result = sass.renderSync({ data: data, file: filename }).css; return result.toString('utf8'); };

and then add any relevant extensions to your plugin config:

js
{ "plugins": [ [ "css-modules-transform", { "preprocessCss": "./path/to/module-exporting-a-function.js", "extensions": [".css", ".scss"] } ] ] }

Extract CSS Files

When you publish a library, you might want to ship compiled css files as well to
help integration in other projects.

An more complete alternative is to use
babel-plugin-webpack-loaders
but be aware that a new webpack instance is run for each css file, this has a
huge overhead. If you do not use fancy stuff, you might consider using
babel-plugin-css-modules-transform
instead.

To combine all css files in a single file, give its name:

js
{ "plugins": [ [ "css-modules-transform", { "extractCss": "./dist/stylesheets/combined.css" } ] ] }

To extract all files in a single directory, give an object:

js
{ "plugins": [ [ "css-modules-transform", { "extractCss": { "dir": "./dist/stylesheets/", "relativeRoot": "./src/", "filename": "[path]/[name].css" } } ] ] }

Note that relativeRoot is used to resolve relative directory names, available
as [path] in filename pattern.

Keeping import

To keep import statements you should set option keepImport to true. In this way, simultaneously with the converted values, the import will be described as unassigned call expression.

js
// before const styles = require('./test.css');
js
// after require('./test.css'); const styles = { 'someClass': 'Test__someClass___2Frqu' }

Alternatives

License

MIT

Contributors

Showing top 11 contributors by commit count.

View all contributors on GitHub →

This article is auto-generated from michalkvasnicak/babel-plugin-css-modules-transform via the GitHub API.Last fetched: 6/28/2026