diff --git a/packages/bundlers/experimental/src/ExperimentalBundler.js b/packages/bundlers/experimental/src/ExperimentalBundler.js index 79a59bf444e..d39fc39a99c 100644 --- a/packages/bundlers/experimental/src/ExperimentalBundler.js +++ b/packages/bundlers/experimental/src/ExperimentalBundler.js @@ -949,7 +949,7 @@ function createIdealGraph( } // Create shared bundles for splittable bundles. - if (reachable.length > 0) { + if (reachable.length > config.minBundles) { let sourceBundles = reachable.map(a => nullthrows(bundles.get(a.id))); let key = reachable.map(a => a.id).join(','); let bundleId = bundles.get(key); @@ -998,6 +998,15 @@ function createIdealGraph( value: bundle, type: 'bundle', }); + } else if (reachable.length <= config.minBundles) { + for (let root of reachable) { + let bundle = nullthrows( + bundleGraph.getNode(nullthrows(bundles.get(root.id))), + ); + invariant(bundle !== 'root'); + bundle.assets.add(asset); + bundle.size += asset.stats.size; + } } } // Step Merge Share Bundles: Merge any shared bundles under the minimum bundle size back into diff --git a/packages/core/integration-tests/test/bundler.js b/packages/core/integration-tests/test/bundler.js index df06f46ea08..498ec7a80fe 100644 --- a/packages/core/integration-tests/test/bundler.js +++ b/packages/core/integration-tests/test/bundler.js @@ -3,6 +3,53 @@ import assert from 'assert'; import {bundle, assertBundles, findAsset} from '@parcel/test-utils'; describe('bundler', function () { + it('should not create a shared bundle from an asset if that asset is shared by less than minBundles bundles', async function () { + let b = await bundle( + path.join(__dirname, 'integration/min-bundles/index.js'), + { + mode: 'production', + defaultTargetOptions: { + shouldScopeHoist: false, + }, + }, + ); + + assertBundles(b, [ + { + name: 'index.js', + assets: [ + 'index.js', + 'bundle-url.js', + 'cacheLoader.js', + 'css-loader.js', + 'esmodule-helpers.js', + 'js-loader.js', + 'bundle-manifest.js', + ], + }, + { + // a and b are shared between only 2 bundles so they are kept in each bundle + assets: ['bar.js', 'a.js', 'b.js'], + }, + { + assets: ['buzz.js'], + }, + { + assets: ['a.js', 'b.js', 'foo.js'], + }, + { + // c is shared between 3 different bundles, so it stays + assets: ['c.js'], + }, + { + assets: ['styles.css'], + }, + { + assets: ['local.html'], + }, + ]); + }); + it('should remove reused bundle (over shared bundles based on size) if the bundlegroup hit the parallel request limit', async function () { if (process.env.PARCEL_TEST_EXPERIMENTAL_BUNDLER) { let b = await bundle( @@ -53,7 +100,7 @@ describe('bundler', function () { } }); - //This test case is the sdame as previous except we remove the shared bundle since it is smaller + //This test case is the same as previous except we remove the shared bundle since it is smaller it('should remove shared bundle (over reused bundles based on size) if the bundlegroup hit the parallel request limit', async function () { let b = await bundle( path.join( diff --git a/packages/core/integration-tests/test/integration/min-bundles/a.js b/packages/core/integration-tests/test/integration/min-bundles/a.js new file mode 100644 index 00000000000..475e2ef8632 --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/a.js @@ -0,0 +1,7 @@ +let str = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras euismod massa sit amet tellus porta consectetur. Etiam aliquam pellentesque lorem id semper. Vestibulum ut rhoncus lacus, a blandit risus. Sed eget volutpat risus, eu molestie mi. Curabitur felis lacus, hendrerit id sollicitudin nec, sollicitudin in quam. Nunc pellentesque elit ac sapien tempor feugiat. Nunc ex urna, commodo in viverra a, tempus quis purus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; +Pellentesque pharetra mauris luctus felis cursus, id tempor sem viverra. Aenean fringilla, felis ut feugiat pretium, sapien lectus ornare enim, vel tempus mi tortor vitae lectus. Sed egestas mollis massa in dignissim. Sed placerat tellus id ligula molestie, id tincidunt sem rutrum. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam est purus, maximus ut mi id, pharetra dictum lacus. Praesent ullamcorper libero metus, id ornare ex posuere ac. Ut tempor varius molestie. Sed a turpis lobortis, pretium leo ut, tempus turpis. Curabitur blandit ligula in mi pretium, sed varius libero tempus. Nunc pellentesque odio metus, vitae commodo neque eleifend ac. +Cras et est suscipit, suscipit dolor nec, blandit leo. Donec purus neque, rhoncus ac ullamcorper eget, placerat vel magna. Donec eu augue turpis. Fusce mattis nulla ante. Proin sit amet sem maximus, pharetra tortor et, sollicitudin eros. Curabitur elementum dolor ac metus vulputate ornare. Ut arcu libero, lobortis ac urna ut, ornare laoreet tortor. Vivamus sollicitudin suscipit efficitur. Ut nec nisi sed metus blandit bibendum. Nullam dictum accumsan sem, ac aliquam purus vestibulum sed. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut et ligula eget magna tempus interdum. Aliquam malesuada tempus imperdiet. Proin et elementum tellus, non aliquam magna. Sed id felis ut arcu aliquam aliquam eu nec nisi. +Donec dictum consequat quam nec malesuada. Nunc mattis iaculis vestibulum. Vestibulum erat lacus, mollis et tincidunt sit amet, tristique vitae massa. Phasellus ac vulputate dolor. Pellentesque ac auctor metus, nec faucibus erat. Donec tortor neque, convallis non felis vel, posuere ornare nunc. Fusce magna risus, interdum at pretium vel, finibus ut dolor. Vivamus congue ipsum non cursus tristique. Suspendisse in nulla accumsan, volutpat turpis eu, gravida sapien. Nam commodo velit vel tellus ultricies, ut consectetur neque molestie. Praesent tincidunt, libero ac elementum luctus, ex nisi volutpat leo, a hendrerit lacus leo eget tortor. Suspendisse viverra ante sit amet accumsan facilisis. Pellentesque velit nisl, luctus bibendum vulputate eget, dapibus at elit. Nam ac molestie turpis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce cursus, magna non viverra rutrum, magna metus blandit tortor, sed elementum tellus lectus at velit. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Morbi sollicitudin scelerisque sagittis. Cras mattis dictum sollicitudin. Donec tincidunt ullamcorper elit, non dignissim nulla ornare ac. Nulla at interdum nisl. Cras eget tincidunt neque. Etiam lobortis sem iaculis, accumsan augue vel, condimentum sem. Mauris porta congue nulla, id congue eros. Nullam nec arcu in ante elementum blandit sit amet ac nibh. Fusce eget risus tincidunt, viverra neque quis, pellentesque est. Sed et nisi nec massa consequat commodo pretium nec risus. Maecenas vestibulum diam ex, sit amet maximus lacus luctus scelerisque. Mauris eget ante sollicitudin, commodo purus eu, molestie tellus. Aliquam finibus eros nisi, eu cursus sapien pellentesque in. Cras eget justo tincidunt, congue lorem eu, dignissim metus.`; + +export default 'a'; diff --git a/packages/core/integration-tests/test/integration/min-bundles/b.js b/packages/core/integration-tests/test/integration/min-bundles/b.js new file mode 100644 index 00000000000..c2f27c9f6ff --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/b.js @@ -0,0 +1,7 @@ +let str = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras euismod massa sit amet tellus porta consectetur. Etiam aliquam pellentesque lorem id semper. Vestibulum ut rhoncus lacus, a blandit risus. Sed eget volutpat risus, eu molestie mi. Curabitur felis lacus, hendrerit id sollicitudin nec, sollicitudin in quam. Nunc pellentesque elit ac sapien tempor feugiat. Nunc ex urna, commodo in viverra a, tempus quis purus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; +Pellentesque pharetra mauris luctus felis cursus, id tempor sem viverra. Aenean fringilla, felis ut feugiat pretium, sapien lectus ornare enim, vel tempus mi tortor vitae lectus. Sed egestas mollis massa in dignissim. Sed placerat tellus id ligula molestie, id tincidunt sem rutrum. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam est purus, maximus ut mi id, pharetra dictum lacus. Praesent ullamcorper libero metus, id ornare ex posuere ac. Ut tempor varius molestie. Sed a turpis lobortis, pretium leo ut, tempus turpis. Curabitur blandit ligula in mi pretium, sed varius libero tempus. Nunc pellentesque odio metus, vitae commodo neque eleifend ac. +Cras et est suscipit, suscipit dolor nec, blandit leo. Donec purus neque, rhoncus ac ullamcorper eget, placerat vel magna. Donec eu augue turpis. Fusce mattis nulla ante. Proin sit amet sem maximus, pharetra tortor et, sollicitudin eros. Curabitur elementum dolor ac metus vulputate ornare. Ut arcu libero, lobortis ac urna ut, ornare laoreet tortor. Vivamus sollicitudin suscipit efficitur. Ut nec nisi sed metus blandit bibendum. Nullam dictum accumsan sem, ac aliquam purus vestibulum sed. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut et ligula eget magna tempus interdum. Aliquam malesuada tempus imperdiet. Proin et elementum tellus, non aliquam magna. Sed id felis ut arcu aliquam aliquam eu nec nisi. +Donec dictum consequat quam nec malesuada. Nunc mattis iaculis vestibulum. Vestibulum erat lacus, mollis et tincidunt sit amet, tristique vitae massa. Phasellus ac vulputate dolor. Pellentesque ac auctor metus, nec faucibus erat. Donec tortor neque, convallis non felis vel, posuere ornare nunc. Fusce magna risus, interdum at pretium vel, finibus ut dolor. Vivamus congue ipsum non cursus tristique. Suspendisse in nulla accumsan, volutpat turpis eu, gravida sapien. Nam commodo velit vel tellus ultricies, ut consectetur neque molestie. Praesent tincidunt, libero ac elementum luctus, ex nisi volutpat leo, a hendrerit lacus leo eget tortor. Suspendisse viverra ante sit amet accumsan facilisis. Pellentesque velit nisl, luctus bibendum vulputate eget, dapibus at elit. Nam ac molestie turpis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce cursus, magna non viverra rutrum, magna metus blandit tortor, sed elementum tellus lectus at velit. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Morbi sollicitudin scelerisque sagittis. Cras mattis dictum sollicitudin. Donec tincidunt ullamcorper elit, non dignissim nulla ornare ac. Nulla at interdum nisl. Cras eget tincidunt neque. Etiam lobortis sem iaculis, accumsan augue vel, condimentum sem. Mauris porta congue nulla, id congue eros. Nullam nec arcu in ante elementum blandit sit amet ac nibh. Fusce eget risus tincidunt, viverra neque quis, pellentesque est. Sed et nisi nec massa consequat commodo pretium nec risus. Maecenas vestibulum diam ex, sit amet maximus lacus luctus scelerisque. Mauris eget ante sollicitudin, commodo purus eu, molestie tellus. Aliquam finibus eros nisi, eu cursus sapien pellentesque in. Cras eget justo tincidunt, congue lorem eu, dignissim metus.`; + +export default 5; diff --git a/packages/core/integration-tests/test/integration/min-bundles/bar.js b/packages/core/integration-tests/test/integration/min-bundles/bar.js new file mode 100644 index 00000000000..401829543ad --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/bar.js @@ -0,0 +1,7 @@ +import a from './a'; +import b from './b'; +import styles from './styles.css'; +import html from './local.html'; +import c from './c'; + +export default 4; diff --git a/packages/core/integration-tests/test/integration/min-bundles/buzz.js b/packages/core/integration-tests/test/integration/min-bundles/buzz.js new file mode 100644 index 00000000000..150df2b16bc --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/buzz.js @@ -0,0 +1 @@ +import c from './c'; diff --git a/packages/core/integration-tests/test/integration/min-bundles/c.js b/packages/core/integration-tests/test/integration/min-bundles/c.js new file mode 100644 index 00000000000..e15fcf78ebd --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/c.js @@ -0,0 +1,7 @@ +let str = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras euismod massa sit amet tellus porta consectetur. Etiam aliquam pellentesque lorem id semper. Vestibulum ut rhoncus lacus, a blandit risus. Sed eget volutpat risus, eu molestie mi. Curabitur felis lacus, hendrerit id sollicitudin nec, sollicitudin in quam. Nunc pellentesque elit ac sapien tempor feugiat. Nunc ex urna, commodo in viverra a, tempus quis purus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; +Pellentesque pharetra mauris luctus felis cursus, id tempor sem viverra. Aenean fringilla, felis ut feugiat pretium, sapien lectus ornare enim, vel tempus mi tortor vitae lectus. Sed egestas mollis massa in dignissim. Sed placerat tellus id ligula molestie, id tincidunt sem rutrum. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam est purus, maximus ut mi id, pharetra dictum lacus. Praesent ullamcorper libero metus, id ornare ex posuere ac. Ut tempor varius molestie. Sed a turpis lobortis, pretium leo ut, tempus turpis. Curabitur blandit ligula in mi pretium, sed varius libero tempus. Nunc pellentesque odio metus, vitae commodo neque eleifend ac. +Cras et est suscipit, suscipit dolor nec, blandit leo. Donec purus neque, rhoncus ac ullamcorper eget, placerat vel magna. Donec eu augue turpis. Fusce mattis nulla ante. Proin sit amet sem maximus, pharetra tortor et, sollicitudin eros. Curabitur elementum dolor ac metus vulputate ornare. Ut arcu libero, lobortis ac urna ut, ornare laoreet tortor. Vivamus sollicitudin suscipit efficitur. Ut nec nisi sed metus blandit bibendum. Nullam dictum accumsan sem, ac aliquam purus vestibulum sed. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut et ligula eget magna tempus interdum. Aliquam malesuada tempus imperdiet. Proin et elementum tellus, non aliquam magna. Sed id felis ut arcu aliquam aliquam eu nec nisi. +Donec dictum consequat quam nec malesuada. Nunc mattis iaculis vestibulum. Vestibulum erat lacus, mollis et tincidunt sit amet, tristique vitae massa. Phasellus ac vulputate dolor. Pellentesque ac auctor metus, nec faucibus erat. Donec tortor neque, convallis non felis vel, posuere ornare nunc. Fusce magna risus, interdum at pretium vel, finibus ut dolor. Vivamus congue ipsum non cursus tristique. Suspendisse in nulla accumsan, volutpat turpis eu, gravida sapien. Nam commodo velit vel tellus ultricies, ut consectetur neque molestie. Praesent tincidunt, libero ac elementum luctus, ex nisi volutpat leo, a hendrerit lacus leo eget tortor. Suspendisse viverra ante sit amet accumsan facilisis. Pellentesque velit nisl, luctus bibendum vulputate eget, dapibus at elit. Nam ac molestie turpis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce cursus, magna non viverra rutrum, magna metus blandit tortor, sed elementum tellus lectus at velit. +Pellentesque morbi tristique senectus et netus et malesuada fames ac turpis egestas. Morbi sollicitudin scelerisque sagittis. Cras mattis dictum sollicitudin. Donec tincidunt ullamcorper elit, non dignissim nulla ornare ac. Nulla at interdum nisl. Cras eget tincidunt neque. Etiam lobortis sem iaculis, accumsan augue vel, condimentum sem. Mauris porta congue nulla, id congue eros. Nullam nec arcu in ante elementum blandit sit amet ac nibh. Fusce eget risus tincidunt, viverra neque quis, pellentesque est. Sed et nisi nec massa consequat commodo pretium nec risus. Maecenas vestibulum diam ex, sit amet maximus lacus luctus scelerisque. Mauris eget ante sollicitudin, commodo purus eu, molestie tellus. Aliquam finibus eros nisi, eu cursus sapien pellentesque in. Cras eget justo tincidunt, congue lorem eu, dignissim metus.`; + +export default 'c'; diff --git a/packages/core/integration-tests/test/integration/min-bundles/foo.js b/packages/core/integration-tests/test/integration/min-bundles/foo.js new file mode 100644 index 00000000000..6966e112385 --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/foo.js @@ -0,0 +1,5 @@ +import a from './a'; +import b from './b'; +import c from './c'; + +export default a; diff --git a/packages/core/integration-tests/test/integration/min-bundles/index.js b/packages/core/integration-tests/test/integration/min-bundles/index.js new file mode 100644 index 00000000000..14be3f87ce4 --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/index.js @@ -0,0 +1,5 @@ +import('./foo'); +import('./bar'); +import('./buzz'); + +export default 1; diff --git a/packages/core/integration-tests/test/integration/min-bundles/local.html b/packages/core/integration-tests/test/integration/min-bundles/local.html new file mode 100644 index 00000000000..e1fd3f4ed29 --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/local.html @@ -0,0 +1,6 @@ + + + + Hello World + + diff --git a/packages/core/integration-tests/test/integration/min-bundles/package.json b/packages/core/integration-tests/test/integration/min-bundles/package.json new file mode 100644 index 00000000000..c4fc29f0248 --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/package.json @@ -0,0 +1,7 @@ +{ + "@parcel/bundler-default": { + "minBundles": 2, + "minBundleSize": 200, + "maxParallelRequests":3 + } +} diff --git a/packages/core/integration-tests/test/integration/min-bundles/styles.css b/packages/core/integration-tests/test/integration/min-bundles/styles.css new file mode 100644 index 00000000000..c423315142e --- /dev/null +++ b/packages/core/integration-tests/test/integration/min-bundles/styles.css @@ -0,0 +1 @@ +p.groove {outline-style: groove;} diff --git a/packages/core/integration-tests/test/integration/min-bundles/yarn.lock b/packages/core/integration-tests/test/integration/min-bundles/yarn.lock new file mode 100644 index 00000000000..e69de29bb2d