webpackでのcssファイルの設定

webpackでCSSをインラインのstyleではなく、CSSファイルとして出力する場合の設定。 extract-text-webpack-pluginを使ってCSSを別ファイルに出力する。

extract-text-webpack-plugin

Extract text from a bundle, or bundles, into a separate file.

バンドルからテキストを抽出して別のファイルに切り出すwebpackのプラグインCSSはこれで別ファイルにわける。

github.com

npmインストールして、webpack.config.babel.jsでimportする。

$ yarn add --dev extract-text-webpack-plugin
import ExtractTextPlugin from 'extract-text-webpack-plugin'

CSSのloaderの設定を入れる。 Sassを使う場合は以下のようにloaderを指定する。

  module: {
    rules: [
      {
        test: /\.scss$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: ['css-loader', 'sass-loader'],
        }),
      },
    ],
  },

app.jsでscssファイルをimportする。

import styles from './../scss/app.scss'

HTML側では生成されるCSSファイルとJSファイルを読み込むようにする。

  <link rel="stylesheet" href="./css/app.css">
  <script src="./js/app.js"></script>

最終的なwebpack.config.babel.js

JSまわりの設定とかを追加したwebpack.config.babel.jsは以下のような感じ。

import webpack from 'webpack'
import path from 'path'
import HtmlWebpackPlguin from 'html-webpack-plugin'
import ExtractTextPlugin from 'extract-text-webpack-plugin'

export default {
  entry: {
    app: [
      './src/js/app.js',
    ],
  },
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'js/[name].js',
    publicPath: '/',
  },
  resolve: {
    modules: [
      'node_modules',
      path.join(__dirname, 'src'),
    ],
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /(node_modules)/,
        include: [
          path.resolve(__dirname, 'src/js'),
        ],
        use: [
          {
            loader: 'babel-loader',
            options: {
              cacheDirectory: false,
            },
          },
        ],
      },
      {
        test: /\.(js|jsx)$/,
        exclude: /(node_modules)/,
        include: [
          path.resolve(__dirname, 'src/js'),
        ],
        use: [
          {
            loader: 'eslint-loader',
            options: {
            },
          },
        ],
      },
      {
        test: /\.scss$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: ['css-loader', 'sass-loader'],
        }),
      },
    ],
  },
  devServer: {
    contentBase: './dist',
    publicPath: '/',
    port: 8080,
  },
  plugins: [
    new HtmlWebpackPlguin({
      filename: 'index.html',
      inject: false,
      template: './src/templates/index.ejs',
    }),
    new ExtractTextPlugin('css/app.css'),
  ],
}