最近は Browserify より webpack が人気なんて話もあるみたいなので CSS Modules を webpack で試してみました。

インストールと設定

npm コマンドで。CSS のために css-loaderstyle-loader というモジュールもインストールします。

$ npm install -g webpack
$ npm install -D css-loader style-loader

設定は webpack.config.js に書きます。

// webpack.config.js

const path = require('path');

const ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
    module: {
        loaders: [
            {
                loader: ExtractTextPlugin.extract('style', 'css?modules&impoerLoaders=1'),
                test: /\.css$/
            }
        ]
    },
    plugins: [
        new ExtractTextPlugin('styles.css')
    ]
};

変換

変換する JavaScript と CSS を用意します。

// a.js

const x = require('./x.css');
const y = require('./y.css');

console.log(x);
console.log(y);
/* a.css */

.nice-style {
    transition: all 1s linear;
}
/* b.css */

.good-class {
    color: red;
}

webpack コマンドにソースと変換後のファイル名を指定すると変換できます。

$ webpack a.js bundle.js

これで bundle.jsstyles.css が生成されます。

bundle.js をみると require('...'){"nice-style":"ax-tGlA1ZJoEWHoO0Svxx"} のような JSON になっています。

styles.css はクラス名が ax-tGlA1ZJoEWHoO0Svxx のように変換された後まとめられたスタイルシートです。

細かい設定

PostCSS を使ったり、その他設定は loader に指定すればできるみたいです。

$ npm install -D postcss-loader autoprefixer
// webpack.config.js

const path = require('path');

const ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
    module: {
        loaders: [
            {
                loader: ExtractTextPlugin.extract('style', [
                    'css?modules&camelCase&impoerLoaders=1',
                    'postcss'
                ]),
            }
        ]
    },
    plugins: [
        new ExtractTextPlugin('styles.css')
    ],
    postcss: [
        require('autoprefixer')()
    ]
};

さっきと比べて camelCasepostcss の記述が増えています。

camelCase を指定すると {"nice-style":"ax-tGlA1ZJoEWHoO0Svxx","niceStyle":"ax-tGlA1ZJoEWHoO0Svxx"} のように JavaScript で受け取れる JSON にキャメルケースのプロパティが増えます。

postcss では autoprefixer を使ってベンダープレフィックスをつけています。生成された styles.css を見ると -webkit-transition の指定が増えているのがわかります。

まとめ

こんな感じで webpack を試してみました。設定ファイルが JavaScript なのでいろいろできますし、もとから複数の変換を噛ませることも考えられているみたいです。 Browserify よりも細かく制御できるのがメリットで、設定が複雑になりやすいのがデメリットといった感じでしょうか。

本体とプラグインをインストールしたらすぐに使えるという感じではないですが、個々のプロジェクトごとに細かくビルドのフローを作るのには向いている印象です。