diff --git a/src/Chunk.ts b/src/Chunk.ts index b15af569872..c9da107d1df 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -820,21 +820,23 @@ export default class Chunk { } const importsAsArray = Array.from(this.imports); + const renderedImports = new Set(); const dependencies: ChunkDependencies = []; for (const dep of this.dependencies) { const imports: ImportSpecifier[] = []; for (const variable of importsAsArray) { + const renderedVariable = + variable instanceof ExportDefaultVariable && variable.referencesOriginal() + ? variable.getOriginalVariable() + : variable; if ( (variable.module instanceof Module ? variable.module.chunk === dep : variable.module === dep) && - !( - variable instanceof ExportDefaultVariable && - variable.referencesOriginal() && - this.imports.has(variable.getOriginalVariable()) - ) + !renderedImports.has(renderedVariable) ) { + renderedImports.add(renderedVariable); const local = variable.getName(); const imported = variable.module instanceof ExternalModule diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_config.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_config.js new file mode 100644 index 00000000000..a393eccd704 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: + 'do not import variables that reference an original if another variable referencing it is already imported', + options: { + input: ['main1', 'main2'] + } +}; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/generated-chunk.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/generated-chunk.js new file mode 100644 index 00000000000..a142f34df0d --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/generated-chunk.js @@ -0,0 +1,8 @@ +define(['exports'], function (exports) { 'use strict'; + + const foo = {}; + + exports.foo = foo; + exports.bar = foo; + +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main1.js new file mode 100644 index 00000000000..302e4c4da46 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main1.js @@ -0,0 +1,5 @@ +define(['./generated-chunk.js'], function (__chunk_1) { 'use strict'; + + console.log(__chunk_1.bar, __chunk_1.bar); + +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main2.js new file mode 100644 index 00000000000..302e4c4da46 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main2.js @@ -0,0 +1,5 @@ +define(['./generated-chunk.js'], function (__chunk_1) { 'use strict'; + + console.log(__chunk_1.bar, __chunk_1.bar); + +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/generated-chunk.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/generated-chunk.js new file mode 100644 index 00000000000..a76e69f06f0 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/generated-chunk.js @@ -0,0 +1,6 @@ +'use strict'; + +const foo = {}; + +exports.foo = foo; +exports.bar = foo; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main1.js new file mode 100644 index 00000000000..b3cc08fc4d9 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main1.js @@ -0,0 +1,5 @@ +'use strict'; + +var __chunk_1 = require('./generated-chunk.js'); + +console.log(__chunk_1.bar, __chunk_1.bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main2.js new file mode 100644 index 00000000000..b3cc08fc4d9 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main2.js @@ -0,0 +1,5 @@ +'use strict'; + +var __chunk_1 = require('./generated-chunk.js'); + +console.log(__chunk_1.bar, __chunk_1.bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/generated-chunk.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/generated-chunk.js new file mode 100644 index 00000000000..1127b4cd6fa --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/generated-chunk.js @@ -0,0 +1,3 @@ +const foo = {}; + +export { foo as a, foo as b }; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main1.js new file mode 100644 index 00000000000..9b81ff8ea20 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main1.js @@ -0,0 +1,3 @@ +import { a as bar } from './generated-chunk.js'; + +console.log(bar, bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main2.js new file mode 100644 index 00000000000..9b81ff8ea20 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main2.js @@ -0,0 +1,3 @@ +import { a as bar } from './generated-chunk.js'; + +console.log(bar, bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/generated-chunk.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/generated-chunk.js new file mode 100644 index 00000000000..ef91eda0278 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/generated-chunk.js @@ -0,0 +1,14 @@ +System.register([], function (exports, module) { + 'use strict'; + return { + execute: function () { + + const foo = {}; + + exports('a', foo); + + exports('b', foo); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main1.js new file mode 100644 index 00000000000..01df6b33d3c --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main1.js @@ -0,0 +1,14 @@ +System.register(['./generated-chunk.js'], function (exports, module) { + 'use strict'; + var bar; + return { + setters: [function (module) { + bar = module.a; + }], + execute: function () { + + console.log(bar, bar); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main2.js new file mode 100644 index 00000000000..01df6b33d3c --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main2.js @@ -0,0 +1,14 @@ +System.register(['./generated-chunk.js'], function (exports, module) { + 'use strict'; + var bar; + return { + setters: [function (module) { + bar = module.a; + }], + execute: function () { + + console.log(bar, bar); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/foo.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/foo.js new file mode 100644 index 00000000000..71658c1342b --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/foo.js @@ -0,0 +1 @@ +export const foo = {}; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main1.js new file mode 100644 index 00000000000..59f67869aef --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main1.js @@ -0,0 +1,4 @@ +import foo from './proxy1'; +import bar from './proxy2'; + +console.log(foo, bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main2.js new file mode 100644 index 00000000000..59f67869aef --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main2.js @@ -0,0 +1,4 @@ +import foo from './proxy1'; +import bar from './proxy2'; + +console.log(foo, bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy1.js new file mode 100644 index 00000000000..f57be3ed80e --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy1.js @@ -0,0 +1,3 @@ +import { foo } from './foo'; + +export default foo; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy2.js new file mode 100644 index 00000000000..f57be3ed80e --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy2.js @@ -0,0 +1,3 @@ +import { foo } from './foo'; + +export default foo;