How to configure CSS module in webpack without create-react-app?

In the base assembly create-react-app, you can encapsulate CSS by adding .module.

Plus, after the build, the BEM methodology is applied to them, what modules or other things are needed for this in webpack?

Author: Vasily, 2020-09-03

1 answers

The option below assumes the use of both modular and non-modular style loading.

Loaders:

style-loader
css-loader
sass-loader    
// для autoprefixer и т.п
postcss-loader 

Config:

const cssRegex = /\.css$/
const cssModuleRegex = /\.module\.css$/
const sassRegex = /\.(scss|sass)$/
const sassModuleRegex = /\.module\.(scss|sass)$/
const postcssConfigPath = "postcss.config.js"

module.exports = {
  module: {
    rules: [
      {
        test: sassRegex,
        use: [
          require.resolve("style-loader"),
          {
            loader: require.resolve("css-loader"),
            options: {
              importLoaders: 1
            }
          },
          {
            loader: require.resolve("postcss-loader"),
            options: {
              config: {
                path: postcssConfigPath
              }
            }
          },
          {
            loader: require.resolve("sass-loader")
          }
        ],
        include: sassModuleRegex
      },
      {
        test: sassRegex,
        use: [
          require.resolve("style-loader"),
          {
            loader: require.resolve("css-loader"),
            options: {
              importLoaders: 1
            }
          },
          {
            loader: require.resolve("postcss-loader"),
            options: {
              config: {
                path: postcssConfigPath
              }
            }
          },
          {
            loader: require.resolve("sass-loader")
          }
        ],
        exclude: sassModuleRegex
      },
      {
        test: cssRegex,
        use: [
          require.resolve("style-loader"),
          {
            loader: require.resolve("css-loader")
          },
          {
            loader: require.resolve("postcss-loader"),
            options: {
              config: {
                path: postcssConfigPath
              }
            }
          }
        ],
        include: cssModuleRegex
      },
      {
        test: cssRegex,
        use: [
          require.resolve("style-loader"),
          {
            loader: require.resolve("css-loader")
          },
          {
            loader: require.resolve("postcss-loader"),
            options: {
              config: {
                path: postcssConfigPath
              }
            }
          }
        ],
        exclude: cssModuleRegex
      }
    ]
  }
}

You can also add source-maps for each loader and configure depersonalization of class names.:

{
  loader: require.resolve("css-loader"),
  options: {
    sourceMap: true,
    importLoaders: 1,
    modules: {
      localIdentName: "z[hash:base64]"
    }
  }
}

The names of which will be "collected" from what will be specified:

localIdentName: "[path][name]__[local]--[hash:base64:5]"
 5
Author: Vasily, 2020-09-06 19:00:53