From 9315ce29aa41d05252a43036cc9f2ff15cad59ef Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 20 Aug 2018 10:34:58 +0200 Subject: [PATCH] fix exporting globals in scope-hoisted modules fixes #7905 --- lib/optimize/ConcatenatedModule.js | 17 +++++++++++++++++ .../scope-hoisting/export-global/index.js | 7 +++++++ .../scope-hoisting/export-global/module.js | 2 ++ .../scope-hoisting/export-global/module2.js | 1 + .../export-global/webpack.config.js | 5 +++++ 5 files changed, 32 insertions(+) create mode 100644 test/configCases/scope-hoisting/export-global/index.js create mode 100644 test/configCases/scope-hoisting/export-global/module.js create mode 100644 test/configCases/scope-hoisting/export-global/module2.js create mode 100644 test/configCases/scope-hoisting/export-global/webpack.config.js diff --git a/lib/optimize/ConcatenatedModule.js b/lib/optimize/ConcatenatedModule.js index a4e1ae4d8a7..be8dcc84114 100644 --- a/lib/optimize/ConcatenatedModule.js +++ b/lib/optimize/ConcatenatedModule.js @@ -136,6 +136,9 @@ const getFinalName = ( } else if (!info.module.isUsed(exportName)) { return "/* unused export */ undefined"; } + if (info.globalExports.has(directExport)) { + return directExport; + } const name = info.internalNames.get(directExport); if (!name) { throw new Error( @@ -562,6 +565,7 @@ class ConcatenatedModule extends Module { globalScope: undefined, moduleScope: undefined, internalNames: new Map(), + globalExports: new Set(), exportMap: exportMap, reexportMap: reexportMap, hasNamespaceObject: false, @@ -941,6 +945,19 @@ class ConcatenatedModule extends Module { } } } + + // add exported globals + if (info.type === "concatenated") { + const variables = new Set(); + for (const variable of info.moduleScope.variables) { + variables.add(variable.name); + } + for (const [, variable] of info.exportMap) { + if (!variables.has(variable)) { + info.globalExports.add(variable); + } + } + } } // generate names for symbols diff --git a/test/configCases/scope-hoisting/export-global/index.js b/test/configCases/scope-hoisting/export-global/index.js new file mode 100644 index 00000000000..54650d45fd3 --- /dev/null +++ b/test/configCases/scope-hoisting/export-global/index.js @@ -0,0 +1,7 @@ +import { process as p } from "./module"; +import { process as p2 } from "./module2"; + +it("should export globals correctly", () => { + expect(p).toBe(42); + expect(p2).toBe(process); +}); diff --git a/test/configCases/scope-hoisting/export-global/module.js b/test/configCases/scope-hoisting/export-global/module.js new file mode 100644 index 00000000000..f57b982f308 --- /dev/null +++ b/test/configCases/scope-hoisting/export-global/module.js @@ -0,0 +1,2 @@ +const process = 42; +export { process }; diff --git a/test/configCases/scope-hoisting/export-global/module2.js b/test/configCases/scope-hoisting/export-global/module2.js new file mode 100644 index 00000000000..78c685a2591 --- /dev/null +++ b/test/configCases/scope-hoisting/export-global/module2.js @@ -0,0 +1 @@ +export { process }; diff --git a/test/configCases/scope-hoisting/export-global/webpack.config.js b/test/configCases/scope-hoisting/export-global/webpack.config.js new file mode 100644 index 00000000000..59e948b1212 --- /dev/null +++ b/test/configCases/scope-hoisting/export-global/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = { + optimization: { + concatenateModules: true + } +};