Question: I am using `webpack 3` & trying to use [string replace loader](https://www.npmjs.com/package/string-replace-loader). 

This code use to work in webpack1.X

```
module: {
    loaders: [
      {
        test: /fileName\.js$/,
        loader: 'string-replace',
        query: {
          search: 'jQuery',
          replace: 'window.$'
        }
      }
    ]
  }

```

I have tried this as well:

```
module: {
        loaders: [
          {
            test: /fileName\.js$/,
            loader: 'string-replace-loader',
            query: {
              search: 'jQuery',
              replace: 'window.$'
            }
          }
        ]
      }

```

What do I need to do to ensure this loader works in webpack 3. There are no errors but string is not getting replaced in the target file.

Answer: 
In Webpack 3 and Webpack 4 you can use the [string-replace-webpack-plugin](https://www.npmjs.com/package/string-replace-webpack-plugin) to perform string replacement by pattern at compile time.

For Webpack 3, add the following code to your `webpack.config.js`:

```
var StringReplacePlugin = require("string-replace-webpack-plugin");
module.exports = {
   module: {
      loaders: [
         // configure replacements for file patterns
         { 
            test: /fileName\.js$/,
            loader: StringReplacePlugin.replace({
                replacements: [
                    {
                        pattern: /jQuery/g,
                        replacement: function (_match, _p1, _offset, _string) {
                            return "window.$";
                        }
                    }
                ]})
            }
      ]
   },
   plugins: [
      // an instance of the plugin must be present
      new StringReplacePlugin()
   ]
}

```

For Webpack 4, the syntax is as follows:

```
var StringReplacePlugin = require("string-replace-webpack-plugin");
module.exports = {
   module: {
      rules: [{ 
         test: /fileName\.js$/,
         use: [{
            loader: StringReplacePlugin.replace({
               replacements: [{
                  pattern: /jQuery/g,
                  replacement: function (_match, _p1, _offset, _string) { return "window.$"; }
                  }]
            })
         }]
      }]
   },
   plugins: [
      new StringReplacePlugin()
   ]
}

```
WebPack 2 changed how configuration must be passed to a loader. So you can try (I've not tested this):

```
module: {
  rules: [{
    test: /fileName\.js$/,
    use: {
      loader: 'string-replace',
      options: {
        query: {
          search: 'jQuery',
          replace: 'window.$'
        }
      }
    }
  }]
}

```

**Or** you can try this string replace loader as it seems to be have been written for WebPack 2.
<https://github.com/dmitrySheshko/replace-string-loader>

**Or** you can write your own:
<https://webpack.js.org/contribute/writing-a-loader/>

string-replace-loader.js

```
const { getOptions } = require('loader-utils');

module.exports = function(source) {
  const options = getOptions(this);
  return source.replace(options.replace, options.with);
};

```

webpack.config.js

```
module: {
  rules: [{
    test: /fileName\.js$/,
    use: {
      loader: resolve(__dirname, './string-replace-loader.js'),
      options: {
        replace: /jQuery/gi,
        with: 'window.$'
      }
    }
  }]
}

```