Skip to content

Commit e3f4fcd

Browse files
authored
Merge pull request webpack#6129 from webpack/feature/side-effects-rules
allow to set sideEffects from rules
2 parents 50da3f0 + 5cbd6b2 commit e3f4fcd

File tree

18 files changed

+121
-1
lines changed

18 files changed

+121
-1
lines changed

lib/NormalModuleFactory.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ class NormalModuleFactory extends Tapable {
249249
loaders,
250250
resource,
251251
resourceResolveData,
252+
settings,
252253
type,
253254
parser: this.getParser(type, settings.parser),
254255
resolveOptions

lib/optimize/SideEffectsFlagPlugin.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ class SideEffectsFlagPlugin {
2424

2525
return module;
2626
});
27+
nmf.hooks.module.tap("SideEffectsFlagPlugin", (module, data) => {
28+
if(data.settings.sideEffects === false)
29+
module.factoryMeta.sideEffectFree = true;
30+
else if(data.settings.sideEffects === true)
31+
module.factoryMeta.sideEffectFree = false;
32+
});
2733
});
2834
compiler.hooks.compilation.tap("SideEffectsFlagPlugin", (compilation) => {
2935
compilation.hooks.optimizeDependencies.tap("SideEffectsFlagPlugin", (modules) => {

schemas/WebpackOptions.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,10 @@
872872
}
873873
]
874874
},
875+
"sideEffects": {
876+
"description": "Flags a module as with or without side effects",
877+
"type": "boolean"
878+
},
875879
"query": {
876880
"description": "Shortcut for use.query",
877881
"anyOf": [

test/Validation.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ describe("Validation", () => {
174174
},
175175
message: [
176176
" - configuration.module.rules[0].oneOf[0] has an unknown property 'paser'. These properties are valid:",
177-
" object { enforce?, exclude?, include?, issuer?, loader?, loaders?, oneOf?, options?, parser?, resolve?, query?, type?, resource?, resourceQuery?, compiler?, rules?, test?, use? }",
177+
" object { enforce?, exclude?, include?, issuer?, loader?, loaders?, oneOf?, options?, parser?, resolve?, sideEffects?, query?, type?, resource?, resourceQuery?, compiler?, rules?, test?, use? }",
178178
" -> A rule"
179179
]
180180
}, {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { log as plog } from "pmodule/tracker";
2+
import { log as nlog } from "nmodule/tracker";
3+
import p from "pmodule";
4+
import n from "nmodule";
5+
6+
it("should be able to override side effects", function() {
7+
p.should.be.eql("def");
8+
n.should.be.eql("def");
9+
plog.should.be.eql(["a.js", "b.js", "c.js", "index.js"]);
10+
nlog.should.be.eql(["index.js"]);
11+
});

test/configCases/side-effects/side-effects-override/node_modules/nmodule/a.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/nmodule/b.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/nmodule/c.js

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/nmodule/index.js

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/nmodule/package.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/nmodule/tracker.js

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/pmodule/a.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/pmodule/b.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/pmodule/c.js

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/pmodule/index.js

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/pmodule/package.json

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/side-effects/side-effects-override/node_modules/pmodule/tracker.js

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const path = require("path");
2+
module.exports = {
3+
mode: "production",
4+
module: {
5+
rules: [
6+
{
7+
test: path.resolve(__dirname, "node_modules/pmodule"),
8+
sideEffects: true
9+
},
10+
{
11+
test: path.resolve(__dirname, "node_modules/nmodule"),
12+
sideEffects: false
13+
}
14+
]
15+
}
16+
};

0 commit comments

Comments
 (0)