86

In some Webpack examples, you see reference to a "rules" array:

module.exports = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          //resolve-url-loader may be chained before sass-loader if necessary
          use: ['css-loader', 'sass-loader']
        })
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin('style.css')
    //if you want to pass in options, you can do so:
    //new ExtractTextPlugin({
    //  filename: 'style.css'
    //})
  ]
}

(https://github.com/webpack-contrib/extract-text-webpack-plugin)

And in other, a loaders array:

var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
    module: {
        loaders: [
            {
                test: /\.css$/,
                loader: ExtractTextPlugin.extract({
                    loader: "css-loader"
                })
            },
            { test: /\.png$/, loader: "file-loader" }
        ]
    },
    plugins: [
        new ExtractTextPlugin({
            filename: "style.css",
            allChunks: true
        })
    ]
};

(https://github.com/webpack/webpack/tree/master/examples/css-bundle)

What is the difference? Which should be used?

Ivan
  • 5,803
  • 2
  • 29
  • 46
Code Whisperer
  • 22,959
  • 20
  • 67
  • 85

1 Answers1

96

Loaders are used in Webpack 1
Rules are used in Webpack 2+

According to the migrating docs at the official Webpack site.

module.loaders is now module.rules

The old loader configuration was superseded by a more powerful rules system, which allows configuration of loaders and more. For compatibility reasons, the old module.loaders syntax is still valid and the old names are parsed. The new naming conventions are easier to understand and are a good reason to upgrade the configuration to using module.rules.

Example of Delta

  module: {
-   loaders: [
+   rules: [
      {
        test: /\.css$/,
-       loaders: [
-         "style-loader",
-         "css-loader?modules=true"
+       use: [
+         {
+           loader: "style-loader"
+         },
+         {
+           loader: "css-loader",
+           options: {
+             modules: true
+           }
+         }
        ]
      },
      {
        test: /\.jsx$/,
        loader: "babel-loader", // Do not use "use" here
        options: {
          // ...
        }
      }
    ]
  }
KyleMit
  • 30,350
  • 66
  • 462
  • 664
Rasmus Rajje Josefsson
  • 1,564
  • 2
  • 15
  • 33
  • Any official reference? –  Oct 07 '17 at 21:46
  • 1
    https://webpack.js.org/guides/migrating/#module-loaders-is-now-module-rules –  Oct 07 '17 at 21:48
  • 3
    When I added babel integration I've used loaders section from an example without paying attention to this aspect, but my project used rules, which went after loaders section. I spent few hours investigating why babel is not working!!! because rules just silently overrides loaders section :( – Daniil Iaitskov Dec 25 '17 at 19:26