Skip to content

Commit 4f5c0a8

Browse files
authored
fix: mark asset module as side-effect-free when futureDefaults (#20535)
1 parent 87987ca commit 4f5c0a8

File tree

9 files changed

+29
-26
lines changed

9 files changed

+29
-26
lines changed

.changeset/eighty-vans-tie.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"webpack": patch
3+
---
4+
5+
Only mark asset modules as side-effect-free when `experimental.futureDefaults` is set to true, so asset-copying use cases (e.g. `import "./x.png"`) won’t break unless the option is enabled.

lib/WebpackOptionsApply.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,9 @@ class WebpackOptionsApply extends OptionsApply {
372372

373373
new JavascriptModulesPlugin().apply(compiler);
374374
new JsonModulesPlugin().apply(compiler);
375-
new AssetModulesPlugin().apply(compiler);
375+
new AssetModulesPlugin({
376+
sideEffectFree: options.experiments.futureDefaults
377+
}).apply(compiler);
376378

377379
if (!options.experiments.outputModule) {
378380
if (options.output.module) {

lib/asset/AssetModulesPlugin.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,19 @@ const getNormalModule = memoize(() => require("../NormalModule"));
8686
const type = ASSET_MODULE_TYPE;
8787
const PLUGIN_NAME = "AssetModulesPlugin";
8888

89+
/**
90+
* @typedef {object} AssetModulesPluginOptions
91+
* @property {boolean=} sideEffectFree
92+
*/
93+
8994
class AssetModulesPlugin {
95+
/**
96+
* @param {AssetModulesPluginOptions} options options
97+
*/
98+
constructor(options) {
99+
this.options = options;
100+
}
101+
90102
/**
91103
* Apply the plugin
92104
* @param {Compiler} compiler the compiler instance
@@ -112,7 +124,10 @@ class AssetModulesPlugin {
112124
/** @type {NormalModuleCreateData} */
113125
(createData)
114126
);
115-
module.factoryMeta = { sideEffectFree: true };
127+
if (this.options.sideEffectFree) {
128+
module.factoryMeta = { sideEffectFree: true };
129+
}
130+
116131
return module;
117132
});
118133
}

test/__snapshots__/StatsTestCases.basictest.js.snap

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,7 @@ chunk {main} (runtime: main) bundle.js (main) X bytes (javascript) X bytes (runt
136136
data:text/plain;base64,szsaAAdsadasdfaf.. X bytes {main} [depth 1] [dependent] [built] [code generated]
137137
[no exports]
138138
[used exports unknown]
139-
[inactive] harmony side effect evaluation data:text/plain;base64,szsaAAdsadasdfaf.. [./index.js] 1:0-82
140-
harmony import specifier data:text/plain;base64,szsaAAdsadasdfaf.. [./index.js] 4:8-13
139+
harmony side effect evaluation data:text/plain;base64,szsaAAdsadasdfaf.. [./index.js] 1:0-82
141140
webpack/runtime/make namespace object X bytes {main} [code generated]
142141
[no exports]
143142
[used exports unknown]
@@ -148,8 +147,7 @@ chunk {main} (runtime: main) bundle.js (main) X bytes (javascript) X bytes (runt
148147
data:text/plain;base64,szsaAAdsadasdfaf.. X bytes {main} [depth 1] [built] [code generated]
149148
[no exports]
150149
[used exports unknown]
151-
[inactive] harmony side effect evaluation data:text/plain;base64,szsaAAdsadasdfaf.. [./index.js] 1:0-82
152-
harmony import specifier data:text/plain;base64,szsaAAdsadasdfaf.. [./index.js] 4:8-13
150+
harmony side effect evaluation data:text/plain;base64,szsaAAdsadasdfaf.. [./index.js] 1:0-82
153151
webpack/runtime/make namespace object X bytes {main} [code generated]
154152
[no exports]
155153
[used exports unknown]

test/configCases/side-effects/asset-module/webpack.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,8 @@ module.exports = {
3636
sideEffects: true,
3737
moduleIds: "named",
3838
concatenateModules: false
39+
},
40+
experiments: {
41+
futureDefaults: true
3942
}
4043
};

test/fixtures/uses-asset.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1 @@
11
import SVG from "./file.svg";
2-
3-
const call = () => SVG;
4-
5-
call();

test/statsCases/all-stats/index.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1 @@
11
import text1 from "data:text/plain;base64,szsaAAdsadasdfafasfasAADas123aasdasd==";
2-
3-
const call = () => {
4-
return text1;
5-
};
6-
7-
call();

test/statsCases/asset-concat/index.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,3 @@ import text2 from "data:text/plain,asd=";
77
import text3 from "data:text/plain,XXXXXXXXXXXXXXXXX"; // 17 chars
88
import css from "./a.css";
99
import source from "./a.source";
10-
11-
const call = () =>
12-
png + svg + jpg + html + text1 + text2 + text3 + css + source;
13-
14-
call();

test/statsCases/asset/index.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,3 @@ import text2 from "data:text/plain,asd=";
77
import text3 from "data:text/plain,XXXXXXXXXXXXXXXXX"; // 17 chars
88
import css from "./a.css";
99
import source from "./a.source";
10-
11-
const call = () =>
12-
png + svg + jpg + html + text1 + text2 + text3 + css + source;
13-
14-
call();

0 commit comments

Comments
 (0)