diff --git a/packages/core/core/src/BundleGraph.js b/packages/core/core/src/BundleGraph.js index 04dfabbd4bc..8f1d15d375f 100644 --- a/packages/core/core/src/BundleGraph.js +++ b/packages/core/core/src/BundleGraph.js @@ -181,7 +181,11 @@ export default class BundleGraph { walkVisited.add(nodeId); let node = nullthrows(assetGraph.getNode(nodeId)); - if (node.type === 'dependency' && node.value.symbols != null) { + if ( + node.type === 'dependency' && + node.value.symbols != null && + node.value.env.shouldScopeHoist + ) { // asset -> symbols that should be imported directly from that asset let targets = new DefaultMap>( () => new Map(), diff --git a/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/Icon.js b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/Icon.js new file mode 100644 index 00000000000..68b1975cee7 --- /dev/null +++ b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/Icon.js @@ -0,0 +1,3 @@ +export function Icon() { + return 'Icon'; +} \ No newline at end of file diff --git a/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/UIIcon.js b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/UIIcon.js new file mode 100644 index 00000000000..753fbf277c1 --- /dev/null +++ b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/UIIcon.js @@ -0,0 +1,3 @@ +export function UIIcon() { + return 'UIIcon'; +} \ No newline at end of file diff --git a/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/index.js b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/index.js new file mode 100644 index 00000000000..a2a6f6417a5 --- /dev/null +++ b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/index.js @@ -0,0 +1,2 @@ +export {Icon} from './Icon'; +export {UIIcon} from './UIIcon'; diff --git a/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/package.json b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/package.json new file mode 100644 index 00000000000..98f24c71ae8 --- /dev/null +++ b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/node_modules/icon/package.json @@ -0,0 +1,5 @@ +{ + "name": "icon", + "version": "1.0.0", + "sideEffects": false +} \ No newline at end of file diff --git a/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/package.json b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/package.json new file mode 100644 index 00000000000..33850b7bb1f --- /dev/null +++ b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/package.json @@ -0,0 +1,15 @@ +{ + "source": "test.js", + "scope-hoist": "dist/scope-hoist.js", + "no-scope-hoist": "dist/no-scope-hoist.js", + "targets": { + "scope-hoist": { + "scopeHoist": true, + "optimize": false + }, + "no-scope-hoist": { + "scopeHoist": false, + "optimize": false + } + } +} diff --git a/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/test.js b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/test.js new file mode 100644 index 00000000000..92bac02a024 --- /dev/null +++ b/packages/core/integration-tests/test/integration/re-export-no-scope-hoist/test.js @@ -0,0 +1,3 @@ +import {UIIcon, Icon} from 'icon'; + +output(UIIcon(), Icon()); diff --git a/packages/core/integration-tests/test/javascript.js b/packages/core/integration-tests/test/javascript.js index 7d4ae18e117..02fc012c84d 100644 --- a/packages/core/integration-tests/test/javascript.js +++ b/packages/core/integration-tests/test/javascript.js @@ -6219,6 +6219,30 @@ describe('javascript', function () { assert.strictEqual(output.default, '4returned from bar'); }); + it('should produce working output with both scope hoisting and non scope hoisting targets', async function () { + let b = await bundle( + path.join(__dirname, '/integration/re-export-no-scope-hoist'), + { + defaultTargetOptions: { + shouldScopeHoist: true, + }, + }, + ); + let bundles = b.getBundles(); + + let o1, o2; + await runBundle(b, bundles[0], { + output: (...o) => (o1 = o), + }); + + await runBundle(b, bundles[1], { + output: (...o) => (o2 = o), + }); + + assert.deepEqual(o1, ['UIIcon', 'Icon']); + assert.deepEqual(o2, ['UIIcon', 'Icon']); + }); + for (let shouldScopeHoist of [false, true]) { let options = { defaultTargetOptions: {