Merge pull request #6143 from ooflorent/module_id_bailout

Bail out concatenation if module uses module.id or module.loaded
This commit is contained in:
Tobias Koppers 2017-12-19 13:06:30 +01:00 committed by GitHub
commit 5edc7efb1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 67 additions and 9 deletions

View File

@ -70,8 +70,14 @@ class NodeStuffPlugin {
"expression require.extensions",
ParserHelpers.expressionIsUnsupported(parser, "require.extensions is not supported by webpack. Use a loader instead.")
);
parser.plugin("expression module.loaded", ParserHelpers.toConstantDependency(parser, "module.l"));
parser.plugin("expression module.id", ParserHelpers.toConstantDependency(parser, "module.i"));
parser.plugin("expression module.loaded", expr => {
parser.state.module.buildMeta.moduleConcatenationBailout = "module.loaded";
return ParserHelpers.toConstantDependency(parser, "module.l")(expr);
});
parser.plugin("expression module.id", expr => {
parser.state.module.buildMeta.moduleConcatenationBailout = "module.id";
return ParserHelpers.toConstantDependency(parser, "module.i")(expr);
});
parser.plugin("expression module.exports", () => {
const module = parser.state.module;
const isHarmony = module.buildMeta && module.buildMeta.harmonyModule;

View File

@ -27,7 +27,8 @@ class ModuleConcatenationPlugin {
}) => {
const handler = (parser, parserOptions) => {
parser.plugin("call eval", () => {
parser.state.module.buildMeta.hasEval = true;
// Because of variable renaming we can't use modules with eval.
parser.state.module.buildMeta.moduleConcatenationBailout = "eval()";
});
};
@ -58,9 +59,11 @@ class ModuleConcatenationPlugin {
continue;
}
// Because of variable renaming we can't use modules with eval
if(module.buildMeta && module.buildMeta.hasEval) {
setBailoutReason(module, "Module uses eval()");
// Some expressions are not compatible with module concatenation
// because they may produce unexpected results. The plugin bails out
// if some were detected upfront.
if(module.buildMeta && module.buildMeta.moduleConcatenationBailout) {
setBailoutReason(module, `Module uses ${module.buildMeta.moduleConcatenationBailout}`);
continue;
}

View File

@ -0,0 +1,3 @@
require("./ref-from-cjs");
module.exports = "cjs module";

View File

@ -0,0 +1 @@
export default "another entry";

View File

@ -0,0 +1 @@
export default eval("using eval");

View File

@ -0,0 +1,18 @@
Hash: 841dd2f7e2da346f7bf1
Time: Xms
[0] ./entry.js 32 bytes {0} {1} [built]
ModuleConcatenation bailout: Module is an entry point
[1] ./ref-from-cjs.js 45 bytes {0} [built]
ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./cjs.js (referenced with cjs require)
[2] ./index.js 150 bytes {0} [built]
ModuleConcatenation bailout: Module is an entry point
[3] ./cjs.js 59 bytes {0} [built]
ModuleConcatenation bailout: Module is not an ECMAScript module
[4] ./eval.js 35 bytes {0} [built]
ModuleConcatenation bailout: Module uses eval()
[5] ./injected-vars.js 40 bytes {0} [built]
ModuleConcatenation bailout: Module uses injected variables (__dirname, __filename)
[6] ./module-id.js 26 bytes {0} [built]
ModuleConcatenation bailout: Module uses module.id
[7] ./module-loaded.js 30 bytes {0} [built]
ModuleConcatenation bailout: Module uses module.loaded

View File

@ -0,0 +1,7 @@
import "./cjs";
import "./entry";
import "./eval";
import "./injected-vars";
import "./module-id";
import "./module-loaded";
import "./ref-from-cjs";

View File

@ -0,0 +1 @@
export default [__dirname, __filename];

View File

@ -0,0 +1 @@
export default module.id;

View File

@ -0,0 +1 @@
export default module.loaded;

View File

@ -0,0 +1 @@
export default "referenced by a CJS module";

View File

@ -0,0 +1,15 @@
module.exports = {
mode: "production",
entry: {
index: "./index.js",
entry: "./entry.js"
},
target: "web",
output: {
filename: "[name].js"
},
stats: {
assets: false,
optimizationBailout: true
}
};

View File

@ -1,6 +1,6 @@
Hash: aa1b352e571b0ba5e7f5d37c33df2ddf3d79c4f9
Hash: 6324063243d1151e39ba483784dda778b9890e57
Child
Hash: aa1b352e571b0ba5e7f5
Hash: 6324063243d1151e39ba
Time: Xms
Asset Size Chunks Chunk Names
d6c1b876fc64139d8324.js 2.74 KiB 0 [emitted] main
@ -15,7 +15,7 @@ Child
[0] (webpack)/node_modules/css-loader!./a/file.css 199 bytes {0} [built]
[1] (webpack)/node_modules/css-loader/lib/css-base.js 2.21 KiB {0} [built]
Child
Hash: d37c33df2ddf3d79c4f9
Hash: 483784dda778b9890e57
Time: Xms
Asset Size Chunks Chunk Names
d6c1b876fc64139d8324.js 2.74 KiB 0 [emitted] main