Merge pull request #7487 from webpack/bugfix/no-wasm-import-mangle

allow to disable wasm import mangle
This commit is contained in:
Tobias Koppers 2018-06-06 08:34:42 +02:00 committed by GitHub
commit 5fee19d687
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 239 additions and 139 deletions

View File

@ -87,7 +87,9 @@ class WebpackOptionsApply extends OptionsApply {
FetchCompileWasmTemplatePlugin = require("./web/FetchCompileWasmTemplatePlugin");
NodeSourcePlugin = require("./node/NodeSourcePlugin");
new JsonpTemplatePlugin().apply(compiler);
new FetchCompileWasmTemplatePlugin().apply(compiler);
new FetchCompileWasmTemplatePlugin({
mangleImports: options.optimization.mangleWasmImports
}).apply(compiler);
new FunctionModulePlugin().apply(compiler);
new NodeSourcePlugin(options.node).apply(compiler);
new LoaderTargetPlugin(options.target).apply(compiler);
@ -97,7 +99,9 @@ class WebpackOptionsApply extends OptionsApply {
FetchCompileWasmTemplatePlugin = require("./web/FetchCompileWasmTemplatePlugin");
NodeSourcePlugin = require("./node/NodeSourcePlugin");
new WebWorkerTemplatePlugin().apply(compiler);
new FetchCompileWasmTemplatePlugin().apply(compiler);
new FetchCompileWasmTemplatePlugin({
mangleImports: options.optimization.mangleWasmImports
}).apply(compiler);
new FunctionModulePlugin().apply(compiler);
new NodeSourcePlugin(options.node).apply(compiler);
new LoaderTargetPlugin(options.target).apply(compiler);
@ -111,7 +115,9 @@ class WebpackOptionsApply extends OptionsApply {
new NodeTemplatePlugin({
asyncChunkLoading: options.target === "async-node"
}).apply(compiler);
new ReadFileCompileWasmTemplatePlugin().apply(compiler);
new ReadFileCompileWasmTemplatePlugin({
mangleImports: options.optimization.mangleWasmImports
}).apply(compiler);
new FunctionModulePlugin().apply(compiler);
new NodeTargetPlugin().apply(compiler);
new LoaderTargetPlugin("node").apply(compiler);
@ -274,7 +280,9 @@ class WebpackOptionsApply extends OptionsApply {
new JavascriptModulesPlugin().apply(compiler);
new JsonModulesPlugin().apply(compiler);
new WebAssemblyModulesPlugin().apply(compiler);
new WebAssemblyModulesPlugin({
mangleImports: options.optimization.mangleWasmImports
}).apply(compiler);
new EntryOptionPlugin().apply(compiler);
compiler.hooks.entryOption.call(options.context, options.entry);

View File

@ -257,6 +257,7 @@ class WebpackOptionsDefaulter extends OptionsDefaulter {
this.set("optimization.checkWasmTypes", "make", options =>
isProductionLikeMode(options)
);
this.set("optimization.mangleWasmImports", false);
this.set(
"optimization.namedModules",
"make",

View File

@ -8,6 +8,10 @@ const Template = require("../Template");
const WasmMainTemplatePlugin = require("../wasm/WasmMainTemplatePlugin");
class ReadFileCompileWasmTemplatePlugin {
constructor(options) {
this.options = options || {};
}
apply(compiler) {
compiler.hooks.thisCompilation.tap(
"ReadFileCompileWasmTemplatePlugin",
@ -40,8 +44,13 @@ class ReadFileCompileWasmTemplatePlugin {
]);
const plugin = new WasmMainTemplatePlugin(
generateLoadBinaryCode,
false
Object.assign(
{
generateLoadBinaryCode,
supportsStreaming: false
},
this.options
)
);
plugin.apply(compilation.mainTemplate);
}

View File

@ -27,12 +27,16 @@ function getAllWasmModules(chunk) {
/**
* generates the import object function for a module
* @param {Module} module the module
* @param {boolean} mangle mangle imports
* @returns {string} source code
*/
function generateImportObject(module) {
function generateImportObject(module, mangle) {
const waitForInstances = new Map();
const properties = [];
const usedWasmDependencies = WebAssemblyUtils.getUsedDependencies(module);
const usedWasmDependencies = WebAssemblyUtils.getUsedDependencies(
module,
mangle
);
for (const usedDep of usedWasmDependencies) {
const dep = usedDep.dependency;
const importedModule = dep.module;
@ -41,15 +45,17 @@ function generateImportObject(module) {
const description = dep.description;
const direct = dep.onlyDirectImport;
const propertyName = usedDep.name;
const module = usedDep.module;
const name = usedDep.name;
if (direct) {
const instanceVar = `m${waitForInstances.size}`;
waitForInstances.set(instanceVar, importedModule.id);
properties.push(
`${JSON.stringify(propertyName)}: ${instanceVar}` +
`[${JSON.stringify(usedName)}]`
);
properties.push({
module,
name,
value: `${instanceVar}[${JSON.stringify(usedName)}]`
});
} else {
const params = description.signature.params.map(
(param, k) => "p" + k + param.valtype
@ -58,20 +64,55 @@ function generateImportObject(module) {
const mod = `installedModules[${JSON.stringify(importedModule.id)}]`;
const func = `${mod}.exports[${JSON.stringify(usedName)}]`;
properties.push(
Template.asString([
`${JSON.stringify(propertyName)}: ` +
(importedModule.type.startsWith("webassembly")
? `${mod} ? ${func} : `
: "") +
`function(${params}) {`,
properties.push({
module,
name,
value: Template.asString([
(importedModule.type.startsWith("webassembly")
? `${mod} ? ${func} : `
: "") + `function(${params}) {`,
Template.indent([`return ${func}(${params});`]),
"}"
])
);
});
}
}
let importObject;
if (mangle) {
importObject = [
"return {",
Template.indent([
properties.map(p => `${JSON.stringify(p.name)}: ${p.value}`).join(",\n")
]),
"};"
];
} else {
const propertiesByModule = new Map();
for (const p of properties) {
let list = propertiesByModule.get(p.module);
if (list === undefined) {
propertiesByModule.set(p.module, (list = []));
}
list.push(p);
}
importObject = [
"return {",
Template.indent([
Array.from(propertiesByModule, ([module, list]) => {
return Template.asString([
`${JSON.stringify(module)}: {`,
Template.indent([
list.map(p => `${JSON.stringify(p.name)}: ${p.value}`).join(",\n")
]),
"}"
]);
}).join(",\n")
]),
"};"
];
}
if (waitForInstances.size === 1) {
const moduleId = Array.from(waitForInstances.values())[0];
const promise = `installedWasmModules[${JSON.stringify(moduleId)}]`;
@ -80,11 +121,7 @@ function generateImportObject(module) {
`${JSON.stringify(module.id)}: function() {`,
Template.indent([
`return promiseResolve().then(function() { return ${promise}; }).then(function(${variable}) {`,
Template.indent([
"return {",
Template.indent([properties.join(",\n")]),
"};"
]),
Template.indent(importObject),
"});"
]),
"},"
@ -102,12 +139,7 @@ function generateImportObject(module) {
`${JSON.stringify(module.id)}: function() {`,
Template.indent([
`return promiseResolve().then(function() { return Promise.all([${promises}]); }).then(function(array) {`,
Template.indent([
`var ${variables};`,
"return {",
Template.indent([properties.join(",\n")]),
"};"
]),
Template.indent([`var ${variables};`, ...importObject]),
"});"
]),
"},"
@ -115,20 +147,17 @@ function generateImportObject(module) {
} else {
return Template.asString([
`${JSON.stringify(module.id)}: function() {`,
Template.indent([
"return {",
Template.indent([properties.join(",\n")]),
"};"
]),
Template.indent(importObject),
"},"
]);
}
}
class WasmMainTemplatePlugin {
constructor(generateLoadBinaryCode, supportsStreaming) {
constructor({ generateLoadBinaryCode, supportsStreaming, mangleImports }) {
this.generateLoadBinaryCode = generateLoadBinaryCode;
this.supportsStreaming = supportsStreaming;
this.mangleImports = mangleImports;
}
apply(mainTemplate) {
mainTemplate.hooks.localVars.tap(
@ -136,7 +165,9 @@ class WasmMainTemplatePlugin {
(source, chunk) => {
const wasmModules = getAllWasmModules(chunk);
if (wasmModules.length === 0) return source;
const importObjects = wasmModules.map(generateImportObject);
const importObjects = wasmModules.map(module => {
return generateImportObject(module, this.mangleImports);
});
return Template.asString([
source,
"",
@ -192,6 +223,12 @@ class WasmMainTemplatePlugin {
}
}
);
const createImportObject = content =>
this.mangleImports
? `{ ${JSON.stringify(
WebAssemblyUtils.MANGLED_MODULE
)}: ${content} }`
: content;
return Template.asString([
source,
"",
@ -219,15 +256,17 @@ class WasmMainTemplatePlugin {
Template.indent([
"promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {",
Template.indent([
"return WebAssembly.instantiate(items[0], " +
`{ ${WebAssemblyUtils.MANGLED_MODULE}: items[1] });`
`return WebAssembly.instantiate(items[0], ${createImportObject(
"items[1]"
)});`
]),
"});"
]),
"} else if(typeof WebAssembly.instantiateStreaming === 'function') {",
Template.indent([
"promise = WebAssembly.instantiateStreaming(req, " +
`{ ${WebAssemblyUtils.MANGLED_MODULE}: importObject });`
`promise = WebAssembly.instantiateStreaming(req, ${createImportObject(
"importObject"
)});`
])
])
: Template.asString([
@ -241,8 +280,9 @@ class WasmMainTemplatePlugin {
]),
"]).then(function(items) {",
Template.indent([
"return WebAssembly.instantiate(items[0], " +
`{ ${WebAssemblyUtils.MANGLED_MODULE}: items[1] });`
`return WebAssembly.instantiate(items[0], ${createImportObject(
"items[1]"
)});`
]),
"});"
])
@ -252,8 +292,9 @@ class WasmMainTemplatePlugin {
"var bytesPromise = req.then(function(x) { return x.arrayBuffer(); });",
"promise = bytesPromise.then(function(bytes) {",
Template.indent([
"return WebAssembly.instantiate(bytes, " +
`{ ${WebAssemblyUtils.MANGLED_MODULE}: importObject });`
`return WebAssembly.instantiate(bytes, ${createImportObject(
"importObject"
)});`
]),
"});"
]),
@ -290,6 +331,7 @@ class WasmMainTemplatePlugin {
hash.update("WasmMainTemplatePlugin");
hash.update("1");
hash.update(`${mainTemplate.outputOptions.webassemblyModuleFilename}`);
hash.update(`${this.mangleImports}`);
});
mainTemplate.hooks.hashForChunk.tap(
"WasmMainTemplatePlugin",

View File

@ -294,7 +294,7 @@ const rewriteImports = ({ ast, usedDependencyMap }) => bin => {
);
if (typeof result !== "undefined") {
path.node.module = WebAssemblyUtils.MANGLED_MODULE;
path.node.module = result.module;
path.node.name = result.name;
}
}
@ -374,12 +374,13 @@ const addInitFunction = ({
/**
* Extract mangle mappings from module
* @param {Module} module current module
* @param {boolean} mangle mangle imports
* @returns {Map<string, UsedWasmDependency>} mappings to mangled names
*/
const getUsedDependencyMap = module => {
const getUsedDependencyMap = (module, mangle) => {
/** @type {Map<string, UsedWasmDependency>} */
const map = new Map();
for (const usedDep of WebAssemblyUtils.getUsedDependencies(module)) {
for (const usedDep of WebAssemblyUtils.getUsedDependencies(module, mangle)) {
const dep = usedDep.dependency;
const request = dep.request;
const exportName = dep.name;
@ -389,6 +390,11 @@ const getUsedDependencyMap = module => {
};
class WebAssemblyGenerator extends Generator {
constructor(options) {
super();
this.options = options;
}
generate(module) {
let bin = module.originalSource().source();
bin = preprocess(bin);
@ -411,7 +417,10 @@ class WebAssemblyGenerator extends Generator {
const nextFuncIndex = getNextFuncIndex(ast, countImportedFunc);
const nextTypeIndex = getNextTypeIndex(ast);
const usedDependencyMap = getUsedDependencyMap(module);
const usedDependencyMap = getUsedDependencyMap(
module,
this.options.mangleImports
);
const externalExports = new Set(
module.dependencies
.filter(d => d instanceof WebAssemblyExportImportedDependency)

View File

@ -12,6 +12,10 @@ const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDe
const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency");
class WebAssemblyModulesPlugin {
constructor(options) {
this.options = options;
}
apply(compiler) {
compiler.hooks.compilation.tap(
"WebAssemblyModulesPlugin",
@ -37,7 +41,7 @@ class WebAssemblyModulesPlugin {
.tap("WebAssemblyModulesPlugin", () => {
return Generator.byType({
javascript: new WebAssemblyJavascriptGenerator(),
webassembly: new WebAssemblyGenerator()
webassembly: new WebAssemblyGenerator(this.options)
});
});

View File

@ -12,15 +12,17 @@ const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDe
/** @typedef {Object} UsedWasmDependency
* @property {WebAssemblyImportDependency} dependency the dependency
* @property {string} name the export name
* @property {string} module the module name
*/
const MANGLED_MODULE = "a";
/**
* @param {Module} module the module
* @returns {UsedWasmDependency[]} used dependencies and mangled name
* @param {boolean} mangle mangle module and export names
* @returns {UsedWasmDependency[]} used dependencies and (mangled) name
*/
const getUsedDependencies = module => {
const getUsedDependencies = (module, mangle) => {
/** @type {UsedWasmDependency[]} */
const array = [];
let importIndex = 0;
@ -30,13 +32,22 @@ const getUsedDependencies = module => {
continue;
}
const importedModule = dep.module;
const exportName = dep.name;
const usedName = importedModule && importedModule.isUsed(exportName);
if (usedName !== false) {
// TODO add the following 3 lines when removing of ModuleExport is possible
// const importedModule = dep.module;
// const usedName = importedModule && importedModule.isUsed(exportName);
// if (usedName !== false) {
if (mangle) {
array.push({
dependency: dep,
name: Template.numberToIdentifer(importIndex++)
name: Template.numberToIdentifer(importIndex++),
module: MANGLED_MODULE
});
} else {
array.push({
dependency: dep,
name: exportName,
module: dep.request
});
}
}

View File

@ -7,6 +7,10 @@
const WasmMainTemplatePlugin = require("../wasm/WasmMainTemplatePlugin");
class FetchCompileWasmTemplatePlugin {
constructor(options) {
this.options = options || {};
}
apply(compiler) {
compiler.hooks.thisCompilation.tap(
"FetchCompileWasmTemplatePlugin",
@ -15,7 +19,15 @@ class FetchCompileWasmTemplatePlugin {
const generateLoadBinaryCode = path =>
`fetch(${mainTemplate.requireFn}.p + ${path})`;
const plugin = new WasmMainTemplatePlugin(generateLoadBinaryCode, true);
const plugin = new WasmMainTemplatePlugin(
Object.assign(
{
generateLoadBinaryCode,
supportsStreaming: true
},
this.options
)
);
plugin.apply(mainTemplate);
}
);

View File

@ -1546,6 +1546,10 @@
"description": "Check for incompatible wasm types when importing/exporting from/to ESM",
"type": "boolean"
},
"mangleWasmImports": {
"description": "Reduce size of WASM by changing imports to shorter strings.",
"type": "boolean"
},
"namedModules": {
"description": "Use readable module identifiers for better debugging",
"type": "boolean"

View File

@ -1,21 +1,21 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`StatsTestCases should print correct stats for aggressive-splitting-entry 1`] = `
"Hash: 4fe9463156cb2a99f4a94fe9463156cb2a99f4a9
"Hash: 4aa5beb3bbe987f505a74aa5beb3bbe987f505a7
Child fitting:
Hash: 4fe9463156cb2a99f4a9
Hash: 4aa5beb3bbe987f505a7
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
9ac13fb7087e9ff1b93e.js 1.05 KiB 0 [emitted]
f2e891598128a57b072c.js 11.1 KiB 1 [emitted]
2b4c8b62a524452d2de1.js 11.1 KiB 1 [emitted]
d1ba53816ff760e185b0.js 1.94 KiB 2 [emitted]
7b5b0a943e9362bc88c6.js 1.94 KiB 3 [emitted]
Entrypoint main = d1ba53816ff760e185b0.js 7b5b0a943e9362bc88c6.js f2e891598128a57b072c.js
Entrypoint main = d1ba53816ff760e185b0.js 7b5b0a943e9362bc88c6.js 2b4c8b62a524452d2de1.js
chunk {0} 9ac13fb7087e9ff1b93e.js 916 bytes <{1}> <{2}> <{3}>
> ./g [4] ./index.js 7:0-13
[7] ./g.js 916 bytes {0} [built]
chunk {1} f2e891598128a57b072c.js 1.87 KiB ={2}= ={3}= >{0}< [entry] [rendered]
chunk {1} 2b4c8b62a524452d2de1.js 1.87 KiB ={2}= ={3}= >{0}< [entry] [rendered]
> ./index main
[3] ./e.js 899 bytes {1} [built]
[4] ./index.js 111 bytes {1} [built]
@ -29,19 +29,19 @@ Child fitting:
[1] ./c.js 899 bytes {3} [built]
[2] ./d.js 899 bytes {3} [built]
Child content-change:
Hash: 4fe9463156cb2a99f4a9
Hash: 4aa5beb3bbe987f505a7
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
9ac13fb7087e9ff1b93e.js 1.05 KiB 0 [emitted]
f2e891598128a57b072c.js 11.1 KiB 1 [emitted]
2b4c8b62a524452d2de1.js 11.1 KiB 1 [emitted]
d1ba53816ff760e185b0.js 1.94 KiB 2 [emitted]
7b5b0a943e9362bc88c6.js 1.94 KiB 3 [emitted]
Entrypoint main = d1ba53816ff760e185b0.js 7b5b0a943e9362bc88c6.js f2e891598128a57b072c.js
Entrypoint main = d1ba53816ff760e185b0.js 7b5b0a943e9362bc88c6.js 2b4c8b62a524452d2de1.js
chunk {0} 9ac13fb7087e9ff1b93e.js 916 bytes <{1}> <{2}> <{3}>
> ./g [4] ./index.js 7:0-13
[7] ./g.js 916 bytes {0} [built]
chunk {1} f2e891598128a57b072c.js 1.87 KiB ={2}= ={3}= >{0}< [entry] [rendered]
chunk {1} 2b4c8b62a524452d2de1.js 1.87 KiB ={2}= ={3}= >{0}< [entry] [rendered]
> ./index main
[3] ./e.js 899 bytes {1} [built]
[4] ./index.js 111 bytes {1} [built]
@ -57,7 +57,7 @@ Child content-change:
`;
exports[`StatsTestCases should print correct stats for aggressive-splitting-on-demand 1`] = `
"Hash: 84ad1d7e4c9cdd4b13e4
"Hash: 2e21ab9d4836a0caedb1
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -71,9 +71,9 @@ d6418937dfae4b3ee922.js 1 KiB 1 [emitted]
685acdc95ff4af957f47.js 1 KiB 7 [emitted]
606f48c13070850338b1.js 1.94 KiB 8 [emitted]
c5a8eae840969538f450.js 1.94 KiB 9 [emitted]
c69b2f79fdf6e98907c4.js 9.7 KiB 10 [emitted] main
7bf22146f3e40919bde5.js 9.7 KiB 10 [emitted] main
fcdf398c8972e4dcf788.js 1.94 KiB 11 [emitted]
Entrypoint main = c69b2f79fdf6e98907c4.js
Entrypoint main = 7bf22146f3e40919bde5.js
chunk {0} fd868baa40dab4fc30fd.js 1.76 KiB <{10}> ={1}= ={2}= ={3}= ={7}= ={9}= [recorded] aggressive splitted
> ./b ./d ./e ./f ./g [11] ./index.js 5:0-44
> ./b ./d ./e ./f ./g ./h ./i ./j ./k [11] ./index.js 6:0-72
@ -115,7 +115,7 @@ chunk {9} c5a8eae840969538f450.js 1.76 KiB <{10}> ={0}= ={2}= ={3}= ={7}= [re
> ./b ./d ./e ./f ./g ./h ./i ./j ./k [11] ./index.js 6:0-72
[7] ./i.js 899 bytes {9} {11} [built]
[8] ./j.js 901 bytes {6} {9} [built]
chunk {10} c69b2f79fdf6e98907c4.js (main) 248 bytes >{0}< >{1}< >{11}< >{2}< >{3}< >{4}< >{5}< >{6}< >{7}< >{8}< >{9}< [entry] [rendered]
chunk {10} 7bf22146f3e40919bde5.js (main) 248 bytes >{0}< >{1}< >{11}< >{2}< >{3}< >{4}< >{5}< >{6}< >{7}< >{8}< >{9}< [entry] [rendered]
> ./index main
[11] ./index.js 248 bytes {10} [built]
chunk {11} fcdf398c8972e4dcf788.js 1.76 KiB <{10}> ={2}= ={6}= [rendered] [recorded] aggressive splitted
@ -467,7 +467,7 @@ Child all:
`;
exports[`StatsTestCases should print correct stats for chunk-module-id-range 1`] = `
"Hash: bc5067cf597a5fece180
"Hash: 7d8eb8b4418c6ae6a262
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -492,7 +492,7 @@ chunk {1} main1.js (main1) 136 bytes [entry] [rendered]
`;
exports[`StatsTestCases should print correct stats for chunks 1`] = `
"Hash: 329edf3a78275c679fe4
"Hash: 7762656cf5adce7c4f04
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -530,7 +530,7 @@ chunk {3} 3.bundle.js 44 bytes <{1}> [rendered]
`;
exports[`StatsTestCases should print correct stats for chunks-development 1`] = `
"Hash: d9a9db28b39a3075bdb3
"Hash: e9e5a35c80318dd22050
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -581,7 +581,7 @@ chunk {3} 3.bundle.js (c) 98 bytes <{0}> <{1}> >{0}< >{1}< [rendered]
`;
exports[`StatsTestCases should print correct stats for color-disabled 1`] = `
"Hash: 259c9ad9aa282b7b9017
"Hash: c5ad40363e9aee54c089
Time: Xms
Built at: Thu Jan 01 1970 <CLR=BOLD>00:00:00</CLR> GMT
Asset Size Chunks Chunk Names
@ -591,7 +591,7 @@ Entrypoint main = main.js
`;
exports[`StatsTestCases should print correct stats for color-enabled 1`] = `
"Hash: <CLR=BOLD>259c9ad9aa282b7b9017</CLR>
"Hash: <CLR=BOLD>c5ad40363e9aee54c089</CLR>
Time: <CLR=BOLD>X</CLR>ms
Built at: Thu Jan 01 1970 <CLR=BOLD>00:00:00</CLR> GMT
<CLR=BOLD>Asset</CLR> <CLR=BOLD>Size</CLR> <CLR=BOLD>Chunks</CLR> <CLR=39,BOLD><CLR=22> <CLR=39,BOLD><CLR=22><CLR=BOLD>Chunk Names</CLR>
@ -601,7 +601,7 @@ Entrypoint <CLR=BOLD>main</CLR> = <CLR=32,BOLD>main.js</CLR>
`;
exports[`StatsTestCases should print correct stats for color-enabled-custom 1`] = `
"Hash: <CLR=BOLD>259c9ad9aa282b7b9017</CLR>
"Hash: <CLR=BOLD>c5ad40363e9aee54c089</CLR>
Time: <CLR=BOLD>X</CLR>ms
Built at: Thu Jan 01 1970 <CLR=BOLD>00:00:00</CLR> GMT
<CLR=BOLD>Asset</CLR> <CLR=BOLD>Size</CLR> <CLR=BOLD>Chunks</CLR> <CLR=39,BOLD><CLR=22> <CLR=39,BOLD><CLR=22><CLR=BOLD>Chunk Names</CLR>
@ -611,7 +611,7 @@ Entrypoint <CLR=BOLD>main</CLR> = <CLR=32>main.js</CLR>
`;
exports[`StatsTestCases should print correct stats for commons-chunk-min-size-0 1`] = `
"Hash: ba7c69f3acc19ed72f3f
"Hash: bace8077f1ed02050b2f
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -628,7 +628,7 @@ Entrypoint entry-1 = vendor-1~entry-1.js entry-1.js
`;
exports[`StatsTestCases should print correct stats for commons-chunk-min-size-Infinity 1`] = `
"Hash: f8b8bebc8cf37cf02f7f
"Hash: cb8c4bb6c365b0a67d67
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -645,9 +645,9 @@ Entrypoint entry-1 = vendor-1.js entry-1.js
`;
exports[`StatsTestCases should print correct stats for commons-plugin-issue-4980 1`] = `
"Hash: b7026c887b1a4d42c4c08b5ecbff0d004a138881
"Hash: 707868320b2a03412b3fe3b00ef4ecd794b284d6
Child
Hash: b7026c887b1a4d42c4c0
Hash: 707868320b2a03412b3f
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -660,7 +660,7 @@ Child
| ./submodule-a.js 59 bytes [built]
| ./submodule-b.js 59 bytes [built]
Child
Hash: 8b5ecbff0d004a138881
Hash: e3b00ef4ecd794b284d6
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -693,9 +693,9 @@ exports[`StatsTestCases should print correct stats for concat-and-sideeffects 1`
`;
exports[`StatsTestCases should print correct stats for define-plugin 1`] = `
"Hash: efa53b4a8c763381d4296ac4ef4ab386e0e18a8c
"Hash: cfe08d4450db77f81610f4228fcb997ec81e2aa6
Child
Hash: efa53b4a8c763381d429
Hash: cfe08d4450db77f81610
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -703,7 +703,7 @@ Child
Entrypoint main = main.js
[0] ./index.js 24 bytes {0} [built]
Child
Hash: 6ac4ef4ab386e0e18a8c
Hash: f4228fcb997ec81e2aa6
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -713,7 +713,7 @@ Child
`;
exports[`StatsTestCases should print correct stats for exclude-with-loader 1`] = `
"Hash: 82110ff5e7d166cc4117
"Hash: 52eadc5de721f000106b
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -726,7 +726,7 @@ Entrypoint main = bundle.js
`;
exports[`StatsTestCases should print correct stats for external 1`] = `
"Hash: 447b77fa7bc9bbdfcf31
"Hash: 7a4bb5500ee0eddeee44
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -737,9 +737,9 @@ Entrypoint main = main.js
`;
exports[`StatsTestCases should print correct stats for filter-warnings 1`] = `
"Hash: a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25a128fafbc2b7d659de25
"Hash: 4269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b44269d427a8c1110386b4
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -759,49 +759,49 @@ Child
Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0]
Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0]
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
bundle.js 2.89 KiB 0 [emitted] main
Entrypoint main = bundle.js
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
bundle.js 2.89 KiB 0 [emitted] main
Entrypoint main = bundle.js
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
bundle.js 2.89 KiB 0 [emitted] main
Entrypoint main = bundle.js
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
bundle.js 2.89 KiB 0 [emitted] main
Entrypoint main = bundle.js
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
bundle.js 2.89 KiB 0 [emitted] main
Entrypoint main = bundle.js
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
bundle.js 2.89 KiB 0 [emitted] main
Entrypoint main = bundle.js
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -821,7 +821,7 @@ Child
Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0]
Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0]
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -841,7 +841,7 @@ Child
Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0]
Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0]
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -861,7 +861,7 @@ Child
Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0]
Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0]
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -881,7 +881,7 @@ Child
Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0]
Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0]
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -901,7 +901,7 @@ Child
Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0]
Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0]
Child
Hash: a128fafbc2b7d659de25
Hash: 4269d427a8c1110386b4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -978,7 +978,7 @@ chunk {5} b.js (b) 179 bytes <{2}> >{1}< [rendered]
`;
exports[`StatsTestCases should print correct stats for import-context-filter 1`] = `
"Hash: f249efcc0232c180bf68
"Hash: 2a0d654db3e185182232
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -995,7 +995,7 @@ Entrypoint entry = entry.js
`;
exports[`StatsTestCases should print correct stats for import-weak 1`] = `
"Hash: 9cccc27b7625bd171c12
"Hash: 34cdd6c85db0facc427a
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1030,9 +1030,9 @@ Compilation error while processing magic comment(-s): /* webpackPrefetch: true,
`;
exports[`StatsTestCases should print correct stats for limit-chunk-count-plugin 1`] = `
"Hash: 3c127dca42ce1c13b8eae6c0ceac1aa3be512946a5969fc94d792cce5364503bf42779f704747e2d
"Hash: 3f682d19df3a78cc355b84831557db9bd7a90e1a059dbb5576e98cee97e4f44eff82b7d35dbb5021
Child 1 chunks:
Hash: 3c127dca42ce1c13b8ea
Hash: 3f682d19df3a78cc355b
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1046,7 +1046,7 @@ Child 1 chunks:
[4] ./d.js 22 bytes {0} [built]
[5] ./e.js 22 bytes {0} [built]
Child 2 chunks:
Hash: e6c0ceac1aa3be512946
Hash: 84831557db9bd7a90e1a
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1062,7 +1062,7 @@ Child 2 chunks:
chunk {1} bundle.js (main) 73 bytes >{0}< [entry] [rendered]
[5] ./index.js 73 bytes {1} [built]
Child 3 chunks:
Hash: a5969fc94d792cce5364
Hash: 059dbb5576e98cee97e4
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1080,7 +1080,7 @@ Child 3 chunks:
chunk {2} bundle.js (main) 73 bytes >{0}< >{1}< [entry] [rendered]
[5] ./index.js 73 bytes {2} [built]
Child 4 chunks:
Hash: 503bf42779f704747e2d
Hash: f44eff82b7d35dbb5021
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1102,7 +1102,7 @@ Child 4 chunks:
`;
exports[`StatsTestCases should print correct stats for max-modules 1`] = `
"Hash: 528955f6d280625ce14d
"Hash: 8e1f6d7b7886c5f4617d
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1132,7 +1132,7 @@ Entrypoint main = main.js
`;
exports[`StatsTestCases should print correct stats for max-modules-default 1`] = `
"Hash: 528955f6d280625ce14d
"Hash: 8e1f6d7b7886c5f4617d
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1157,7 +1157,7 @@ Entrypoint main = main.js
`;
exports[`StatsTestCases should print correct stats for module-assets 1`] = `
"Hash: f544bcf110bd1cf43d65
"Hash: e1ecf80df7148b69327b
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Entrypoint main = main.js
@ -1339,7 +1339,7 @@ Child
`;
exports[`StatsTestCases should print correct stats for named-chunks-plugin 1`] = `
"Hash: 4d266c3680a506e31e7e
"Hash: ae58e4539a3d3b521cc7
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1353,7 +1353,7 @@ Entrypoint entry = vendor.js entry.js
`;
exports[`StatsTestCases should print correct stats for named-chunks-plugin-async 1`] = `
"Hash: b54cb3a3bc63561b46b3
"Hash: b6aa15eeabc33e889828
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1367,7 +1367,7 @@ Entrypoint entry = entry.js
`;
exports[`StatsTestCases should print correct stats for no-emit-on-errors-plugin-with-child-error 1`] = `
"Hash: 6c219bd2ffa7d0ba8efb
"Hash: 6a246e5dec75240f30bf
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1389,7 +1389,7 @@ Child child:
`;
exports[`StatsTestCases should print correct stats for optimize-chunks 1`] = `
"Hash: 5d3814f1fdaba61ed71c
"Hash: c52867ded6f77bcf50cc
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1460,9 +1460,9 @@ You may need an appropriate loader to handle this file type.
`;
exports[`StatsTestCases should print correct stats for performance-different-mode-and-target 1`] = `
"Hash: 36ef9589e3f3c206907d131fd32b3ce1bbf1fb07e0ec393717b117b253ba7bd80de90c69fbe1699ff5afc47fa7eaf1e7303afe2ff2a34c467b43c85c513ab90423c98ca17f51
"Hash: b27a7019f90a13ead012bb84b396eb1e98365d94fb930f6aa3329ab03a278deb0030bfebe86abb37a1cddcae25eb52f3112b62c8b61bc84829d26b13ae06efe5f0099a11af36
Child
Hash: 36ef9589e3f3c206907d
Hash: b27a7019f90a13ead012
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1485,7 +1485,7 @@ Child
You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application.
For more info visit https://webpack.js.org/guides/code-splitting/
Child
Hash: 131fd32b3ce1bbf1fb07
Hash: bb84b396eb1e98365d94
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1508,7 +1508,7 @@ Child
You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application.
For more info visit https://webpack.js.org/guides/code-splitting/
Child
Hash: e0ec393717b117b253ba
Hash: fb930f6aa3329ab03a27
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1516,7 +1516,7 @@ Child
Entrypoint main = no-warning.pro-node.js
[0] ./index.js 293 KiB {0} [built]
Child
Hash: 7bd80de90c69fbe1699f
Hash: 8deb0030bfebe86abb37
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1524,7 +1524,7 @@ Child
Entrypoint main = no-warning.dev-web.js
[./index.js] 293 KiB {main} [built]
Child
Hash: f5afc47fa7eaf1e7303a
Hash: a1cddcae25eb52f3112b
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1532,7 +1532,7 @@ Child
Entrypoint main = no-warning.dev-node.js
[./index.js] 293 KiB {main} [built]
Child
Hash: fe2ff2a34c467b43c85c
Hash: 62c8b61bc84829d26b13
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1540,7 +1540,7 @@ Child
Entrypoint main [big] = no-warning.dev-web-with-limit-set.js
[./index.js] 293 KiB {main} [built]
Child
Hash: 513ab90423c98ca17f51
Hash: ae06efe5f0099a11af36
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1741,7 +1741,7 @@ chunk {6} inner2.js (inner2) 0 bytes <{0}> [rendered]"
`;
exports[`StatsTestCases should print correct stats for preset-detailed 1`] = `
"Hash: 8abc26856f4ca9b61679
"Hash: 2eb3274d0272da6a7a14
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1800,7 +1800,7 @@ exports[`StatsTestCases should print correct stats for preset-none-array 1`] = `
exports[`StatsTestCases should print correct stats for preset-none-error 1`] = `""`;
exports[`StatsTestCases should print correct stats for preset-normal 1`] = `
"Hash: 8abc26856f4ca9b61679
"Hash: 2eb3274d0272da6a7a14
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1878,7 +1878,7 @@ Entrypoints:
`;
exports[`StatsTestCases should print correct stats for preset-verbose 1`] = `
"Hash: 8abc26856f4ca9b61679
"Hash: 2eb3274d0272da6a7a14
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1922,7 +1922,7 @@ chunk {3} 3.js 44 bytes <{1}> [rendered]
`;
exports[`StatsTestCases should print correct stats for resolve-plugin-context 1`] = `
"Hash: 11a1659e0148f10e3a15
"Hash: f866085f4874b382c7c6
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -1936,7 +1936,7 @@ Entrypoint main = bundle.js
`;
exports[`StatsTestCases should print correct stats for reverse-sort-modules 1`] = `
"Hash: 528955f6d280625ce14d
"Hash: 8e1f6d7b7886c5f4617d
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -2006,7 +2006,7 @@ Entrypoint e2 = runtime.js e2.js"
`;
exports[`StatsTestCases should print correct stats for scope-hoisting-bailouts 1`] = `
"Hash: 6c000e1efebf892a7639
"Hash: df49e15bdf57c432360e
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Entrypoint index = index.js
@ -2038,9 +2038,9 @@ Entrypoint entry = entry.js
`;
exports[`StatsTestCases should print correct stats for scope-hoisting-multi 1`] = `
"Hash: 3354b6776c2bb6b558f4c9101316bd6316bf5251
"Hash: f47bea8ea571296b32b82a4cd6b69820dd6e8c36
Child
Hash: 3354b6776c2bb6b558f4
Hash: f47bea8ea571296b32b8
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Entrypoint first = vendor.js first.js
@ -2057,7 +2057,7 @@ Child
[9] ./module_first.js 31 bytes {4} [built]
[10] ./second.js 177 bytes {5} [built]
Child
Hash: c9101316bd6316bf5251
Hash: 2a4cd6b69820dd6e8c36
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Entrypoint first = vendor.js first.js
@ -2085,7 +2085,7 @@ Child
`;
exports[`StatsTestCases should print correct stats for side-effects-issue-7428 1`] = `
"Hash: 9d82ff1a0201e9c2ffa4
"Hash: b1ef68bcfacb3ad18417
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -2134,7 +2134,7 @@ Entrypoint main = main.js
`;
exports[`StatsTestCases should print correct stats for side-effects-simple-unused 1`] = `
"Hash: 0cb74fac5f3c1b7f2150
"Hash: 98f9f698f299e2fa69de
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -2153,7 +2153,7 @@ Entrypoint main = main.js
`;
exports[`StatsTestCases should print correct stats for simple 1`] = `
"Hash: 1843cc9aed8366594774
"Hash: 06cc914b885215f96c5a
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -2163,7 +2163,7 @@ Entrypoint main = bundle.js
`;
exports[`StatsTestCases should print correct stats for simple-more-info 1`] = `
"Hash: c4097b5edb272ec4b73c
"Hash: c8c226a954f967e61630
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -2686,7 +2686,7 @@ chunk {4} default/main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< [entry] [r
`;
exports[`StatsTestCases should print correct stats for tree-shaking 1`] = `
"Hash: 9470b99b4586c4006572
"Hash: 7664ceef8f3f695c9688
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names
@ -2723,7 +2723,7 @@ Entrypoint main = bundle.js
`;
exports[`StatsTestCases should print correct stats for warnings-uglifyjs 1`] = `
"Hash: c0402129c5c14a0d4a19
"Hash: 1325fb5a846745d7ae89
Time: Xms
Built at: Thu Jan 01 1970 00:00:00 GMT
Asset Size Chunks Chunk Names