5

I am using webpack 3 & trying to use 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.

OpenStack
  • 3,045
  • 6
  • 23
  • 44

3 Answers3

3

Have you tried adding flags: 'g' to the query option:

query: {
    search: 'jQuery',
    replace: 'window.$'
    flags: 'g'
}
harshes53
  • 409
  • 1
  • 4
  • 17
2

In Webpack 3 and Webpack 4 you can use the 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()
   ]
}
Alex Walker
  • 2,132
  • 1
  • 14
  • 27
  • 1
    I wasted almost 1h trying to figure it out why `string-replace-loader` didn't work with RegExp on my end before finding this solution..webpack is a nightmare – alfredopacino Feb 27 '20 at 15:55
1

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.$'
      }
    }
  }]
}
Michael
  • 9,761
  • 3
  • 57
  • 56