Reputation: 5596
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.
Upvotes: 5
Views: 6859
Reputation: 1
Bug in pattern-replace-loader. It uses String.proototype.replace() method and it only replaces first entry of the pattern.
Use of flags: 'g' forces it to use RegEx and replace all entries in the file. See: https://www.w3schools.com/jsref/jsref_replace.asp
Upvotes: 0
Reputation: 2356
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()
]
}
Upvotes: 2
Reputation: 12011
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.$'
}
}
}]
}
Upvotes: 1
Reputation: 429
Have you tried adding flags: 'g'
to the query option:
query: {
search: 'jQuery',
replace: 'window.$'
flags: 'g'
}
Upvotes: 3