allow to set sideEffects from rules

This commit is contained in:
Tobias Koppers 2017-12-06 12:09:34 +01:00
parent 44209f6db9
commit 5cbd6b20dd
18 changed files with 121 additions and 1 deletions

View File

@ -249,6 +249,7 @@ class NormalModuleFactory extends Tapable {
loaders, loaders,
resource, resource,
resourceResolveData, resourceResolveData,
settings,
type, type,
parser: this.getParser(type, settings.parser), parser: this.getParser(type, settings.parser),
resolveOptions resolveOptions

View File

@ -24,6 +24,12 @@ class SideEffectsFlagPlugin {
return module; return module;
}); });
nmf.hooks.module.tap("SideEffectsFlagPlugin", (module, data) => {
if(data.settings.sideEffects === false)
module.factoryMeta.sideEffectFree = true;
else if(data.settings.sideEffects === true)
module.factoryMeta.sideEffectFree = false;
});
}); });
compiler.hooks.compilation.tap("SideEffectsFlagPlugin", (compilation) => { compiler.hooks.compilation.tap("SideEffectsFlagPlugin", (compilation) => {
compilation.hooks.optimizeDependencies.tap("SideEffectsFlagPlugin", (modules) => { compilation.hooks.optimizeDependencies.tap("SideEffectsFlagPlugin", (modules) => {

View File

@ -872,6 +872,10 @@
} }
] ]
}, },
"sideEffects": {
"description": "Flags a module as with or without side effects",
"type": "boolean"
},
"query": { "query": {
"description": "Shortcut for use.query", "description": "Shortcut for use.query",
"anyOf": [ "anyOf": [

View File

@ -174,7 +174,7 @@ describe("Validation", () => {
}, },
message: [ message: [
" - configuration.module.rules[0].oneOf[0] has an unknown property 'paser'. These properties are valid:", " - configuration.module.rules[0].oneOf[0] has an unknown property 'paser'. These properties are valid:",
" object { enforce?, exclude?, include?, issuer?, loader?, loaders?, oneOf?, options?, parser?, resolve?, query?, type?, resource?, resourceQuery?, compiler?, rules?, test?, use? }", " object { enforce?, exclude?, include?, issuer?, loader?, loaders?, oneOf?, options?, parser?, resolve?, sideEffects?, query?, type?, resource?, resourceQuery?, compiler?, rules?, test?, use? }",
" -> A rule" " -> A rule"
] ]
}, { }, {

View File

@ -0,0 +1,11 @@
import { log as plog } from "pmodule/tracker";
import { log as nlog } from "nmodule/tracker";
import p from "pmodule";
import n from "nmodule";
it("should be able to override side effects", function() {
p.should.be.eql("def");
n.should.be.eql("def");
plog.should.be.eql(["a.js", "b.js", "c.js", "index.js"]);
nlog.should.be.eql(["index.js"]);
});

View File

@ -0,0 +1,8 @@
var a = "a";
var b = "b";
var c = "c";
export { a, b, c };
import { track } from "./tracker";
track("a.js");

View File

@ -0,0 +1,8 @@
var x = "x";
var y = "y";
export { x, y };
export { z } from "./c";
import { track } from "./tracker";
track("b.js");

View File

@ -0,0 +1,6 @@
var z = "z";
export { z };
import { track } from "./tracker";
track("c.js");

View File

@ -0,0 +1,7 @@
export * from "./a";
export { x, y, z } from "./b";
import { track } from "./tracker";
track("index.js");
export default "def";

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,10 @@
export function track(file) {
log.push(file);
log.sort();
}
export var log = [];
export function reset() {
log.length = 0;
}

View File

@ -0,0 +1,8 @@
var a = "a";
var b = "b";
var c = "c";
export { a, b, c };
import { track } from "./tracker";
track("a.js");

View File

@ -0,0 +1,8 @@
var x = "x";
var y = "y";
export { x, y };
export { z } from "./c";
import { track } from "./tracker";
track("b.js");

View File

@ -0,0 +1,6 @@
var z = "z";
export { z };
import { track } from "./tracker";
track("c.js");

View File

@ -0,0 +1,7 @@
export * from "./a";
export { x, y, z } from "./b";
import { track } from "./tracker";
track("index.js");
export default "def";

View File

@ -0,0 +1,3 @@
{
"sideEffects": false
}

View File

@ -0,0 +1,10 @@
export function track(file) {
log.push(file);
log.sort();
}
export var log = [];
export function reset() {
log.length = 0;
}

View File

@ -0,0 +1,16 @@
const path = require("path");
module.exports = {
mode: "production",
module: {
rules: [
{
test: path.resolve(__dirname, "node_modules/pmodule"),
sideEffects: true
},
{
test: path.resolve(__dirname, "node_modules/nmodule"),
sideEffects: false
}
]
}
};