diff --git a/src/utils/chunkAssignment.ts b/src/utils/chunkAssignment.ts index 74097de0553..ad3ab13474e 100644 --- a/src/utils/chunkAssignment.ts +++ b/src/utils/chunkAssignment.ts @@ -5,6 +5,7 @@ import { concatLazy } from './iterators'; import { timeEnd, timeStart } from './timers'; type DependentModuleMap = Map>; +type ReadonlyDependentModuleMap = ReadonlyMap>; type ChunkDefinitions = { alias: string | null; modules: Module[] }[]; export function getChunkAssignments( @@ -25,38 +26,27 @@ export function getChunkAssignments( for (const [alias, modules] of Object.entries(manualChunkModulesByAlias)) { chunkDefinitions.push({ alias, modules }); } - const alreadyLoadedModulesByDynamicEntry = getAlreadyLoadedModulesByDynamicEntry(entries); - const assignedEntryPointsByModule: DependentModuleMap = new Map(); - for (const entry of entries) { - if (!modulesInManualChunks.has(entry)) { - assignEntryToStaticDependencies( - entry, - undefined, - assignedEntryPointsByModule, - modulesInManualChunks - ); - } - } + const { allEntries, dependentEntriesByModule, dynamicallyDependentEntriesByDynamicEntry } = + analyzeModuleGraph(entries); - for (const entry of alreadyLoadedModulesByDynamicEntry.keys()) { + const staticEntries = new Set(entries); + const assignedEntriesByModule: DependentModuleMap = new Map(); + + for (const entry of allEntries) { if (!modulesInManualChunks.has(entry)) { assignEntryToStaticDependencies( entry, - alreadyLoadedModulesByDynamicEntry.get(entry), - assignedEntryPointsByModule, - modulesInManualChunks + dependentEntriesByModule, + assignedEntriesByModule, + modulesInManualChunks, + staticEntries, + dynamicallyDependentEntriesByDynamicEntry ); } } - chunkDefinitions.push( - ...createChunks( - [...entries, ...alreadyLoadedModulesByDynamicEntry.keys()], - assignedEntryPointsByModule, - minChunkSize - ) - ); + chunkDefinitions.push(...createChunks(allEntries, assignedEntriesByModule, minChunkSize)); return chunkDefinitions; } @@ -77,110 +67,98 @@ function addStaticDependenciesToManualChunk( } } -function getAlreadyLoadedModulesByDynamicEntry( - entryModules: readonly Module[] -): DependentModuleMap { - const allModules = new Set(entryModules); - const dependentEntryPointsByModule: DependentModuleMap = new Map(); - const dynamicImportsByEntry: DependentModuleMap = new Map(); - const dynamicallyDependentEntryPointsByDynamicEntry: DependentModuleMap = new Map(); - const entriesToHandle = new Set(entryModules); - for (const currentEntry of entriesToHandle) { +function analyzeModuleGraph(entries: Iterable): { + allEntries: Iterable; + dependentEntriesByModule: DependentModuleMap; + dynamicallyDependentEntriesByDynamicEntry: DependentModuleMap; +} { + const dynamicEntries = new Set(); + const dependentEntriesByModule: DependentModuleMap = new Map(); + const allEntries = new Set(entries); + for (const currentEntry of allEntries) { const modulesToHandle = new Set([currentEntry]); - const dynamicImports = new Set(); - dynamicImportsByEntry.set(currentEntry, dynamicImports); for (const module of modulesToHandle) { - getOrCreate(dependentEntryPointsByModule, module, () => new Set()).add(currentEntry); + getOrCreate(dependentEntriesByModule, module, () => new Set()).add(currentEntry); for (const dependency of module.getDependenciesToBeIncluded()) { if (!(dependency instanceof ExternalModule)) { modulesToHandle.add(dependency); - allModules.add(dependency); } } for (const { resolution } of module.dynamicImports) { - if (resolution instanceof Module && resolution.includedDynamicImporters.length > 0) { - dynamicImports.add(resolution); - getOrCreate( - dynamicallyDependentEntryPointsByDynamicEntry, - resolution, - () => new Set() - ).add(currentEntry); - entriesToHandle.add(resolution); - allModules.add(resolution); + if ( + resolution instanceof Module && + resolution.includedDynamicImporters.length > 0 && + !allEntries.has(resolution) + ) { + dynamicEntries.add(resolution); + allEntries.add(resolution); } } for (const dependency of module.implicitlyLoadedBefore) { - dynamicImports.add(dependency); - getOrCreate(dynamicallyDependentEntryPointsByDynamicEntry, dependency, () => new Set()).add( - currentEntry - ); - entriesToHandle.add(dependency); - allModules.add(dependency); + if (!allEntries.has(dependency)) { + dynamicEntries.add(dependency); + allEntries.add(dependency); + } } } } - return buildAlreadyLoadedModulesByDynamicEntry( - allModules, - dependentEntryPointsByModule, - dynamicImportsByEntry, - dynamicallyDependentEntryPointsByDynamicEntry - ); + return { + allEntries, + dependentEntriesByModule, + dynamicallyDependentEntriesByDynamicEntry: getDynamicallyDependentEntriesByDynamicEntry( + dependentEntriesByModule, + dynamicEntries + ) + }; } -function buildAlreadyLoadedModulesByDynamicEntry( - allModules: Set, - dependentEntryPointsByModule: DependentModuleMap, - dynamicImportsByEntry: DependentModuleMap, - dynamicallyDependentEntryPointsByDynamicEntry: DependentModuleMap +function getDynamicallyDependentEntriesByDynamicEntry( + dependentEntriesByModule: ReadonlyDependentModuleMap, + dynamicEntries: ReadonlySet ): DependentModuleMap { - const alreadyLoadedModulesByDynamicEntry: DependentModuleMap = new Map(); - for (const dynamicEntry of dynamicallyDependentEntryPointsByDynamicEntry.keys()) { - alreadyLoadedModulesByDynamicEntry.set(dynamicEntry, new Set()); - } - for (const module of allModules) { - const dependentEntryPoints = dependentEntryPointsByModule.get(module)!; - for (const entry of dependentEntryPoints) { - const dynamicEntriesToHandle = [...dynamicImportsByEntry.get(entry)!]; - nextDynamicEntry: for (const dynamicEntry of dynamicEntriesToHandle) { - const alreadyLoadedModules = alreadyLoadedModulesByDynamicEntry.get(dynamicEntry)!; - if (alreadyLoadedModules.has(module)) { - continue; - } - for (const siblingDependentEntry of dynamicallyDependentEntryPointsByDynamicEntry.get( - dynamicEntry - )!) { - if ( - !( - dependentEntryPoints.has(siblingDependentEntry) || - alreadyLoadedModulesByDynamicEntry.get(siblingDependentEntry)?.has(module) - ) - ) { - continue nextDynamicEntry; - } - } - alreadyLoadedModules.add(module); - dynamicEntriesToHandle.push(...dynamicImportsByEntry.get(dynamicEntry)!); + const dynamicallyDependentEntriesByDynamicEntry: DependentModuleMap = new Map(); + for (const dynamicEntry of dynamicEntries) { + const dynamicallyDependentEntries = getOrCreate( + dynamicallyDependentEntriesByDynamicEntry, + dynamicEntry, + () => new Set() + ); + for (const importer of [ + ...dynamicEntry.includedDynamicImporters, + ...dynamicEntry.implicitlyLoadedAfter + ]) { + for (const entry of dependentEntriesByModule.get(importer)!) { + dynamicallyDependentEntries.add(entry); } } } - return alreadyLoadedModulesByDynamicEntry; + return dynamicallyDependentEntriesByDynamicEntry; } function assignEntryToStaticDependencies( entry: Module, - alreadyLoadedModules: ReadonlySet | undefined, - assignedEntryPointsByModule: DependentModuleMap, - modulesInManualChunks: Set + dependentEntriesByModule: ReadonlyDependentModuleMap, + assignedEntriesByModule: DependentModuleMap, + modulesInManualChunks: ReadonlySet, + staticEntries: ReadonlySet, + dynamicallyDependentEntriesByDynamicEntry: ReadonlyDependentModuleMap ) { + const dynamicallyDependentEntries = dynamicallyDependentEntriesByDynamicEntry.get(entry); const modulesToHandle = new Set([entry]); for (const module of modulesToHandle) { - const assignedEntryPoints = getOrCreate(assignedEntryPointsByModule, module, () => new Set()); - // If the module is "already loaded" for this dynamic entry, we do not need - // to mark it for this dynamic entry - if (alreadyLoadedModules?.has(module)) { + const assignedEntries = getOrCreate(assignedEntriesByModule, module, () => new Set()); + if ( + dynamicallyDependentEntries && + isModuleAlreadyLoaded( + dynamicallyDependentEntries, + dependentEntriesByModule.get(module)!, + staticEntries, + dynamicallyDependentEntriesByDynamicEntry + ) + ) { continue; } else { - assignedEntryPoints.add(entry); + assignedEntries.add(entry); } for (const dependency of module.getDependenciesToBeIncluded()) { if (!(dependency instanceof ExternalModule || modulesInManualChunks.has(dependency))) { @@ -190,6 +168,39 @@ function assignEntryToStaticDependencies( } } +const MAX_ENTRIES_TO_CHECK_FOR_SHARED_DEPENDENCIES = 3; + +// An approach to further speed this up might be +// - first, create chunks without looking for modules already in memory +// - all modules that are in the same chunk after this will behave the same +// -> Do not iterate by module but by equivalence group and merge chunks +function isModuleAlreadyLoaded( + dynamicallyDependentEntries: ReadonlySet, + containedIn: ReadonlySet, + staticEntries: ReadonlySet, + dynamicallyDependentEntriesByDynamicEntry: ReadonlyDependentModuleMap +): boolean { + if (dynamicallyDependentEntries.size > MAX_ENTRIES_TO_CHECK_FOR_SHARED_DEPENDENCIES) { + return false; + } + const entriesToCheck = new Set(dynamicallyDependentEntries); + for (const entry of entriesToCheck) { + if (!containedIn.has(entry)) { + if (staticEntries.has(entry)) { + return false; + } + const dynamicallyDependentEntries = dynamicallyDependentEntriesByDynamicEntry.get(entry)!; + if (dynamicallyDependentEntries.size > MAX_ENTRIES_TO_CHECK_FOR_SHARED_DEPENDENCIES) { + return false; + } + for (const dependentEntry of dynamicallyDependentEntries) { + entriesToCheck.add(dependentEntry); + } + } + } + return true; +} + interface ChunkDescription { alias: null; modules: Module[]; @@ -202,14 +213,11 @@ interface MergeableChunkDescription extends ChunkDescription { } function createChunks( - allEntryPoints: readonly Module[], - assignedEntryPointsByModule: DependentModuleMap, + allEntries: Iterable, + assignedEntriesByModule: DependentModuleMap, minChunkSize: number ): ChunkDefinitions { - const chunkModulesBySignature = getChunkModulesBySignature( - assignedEntryPointsByModule, - allEntryPoints - ); + const chunkModulesBySignature = getChunkModulesBySignature(assignedEntriesByModule, allEntries); return minChunkSize === 0 ? Object.values(chunkModulesBySignature).map(modules => ({ alias: null, @@ -269,14 +277,14 @@ const CHAR_INDEPENDENT = '_'; const CHAR_CODE_DEPENDENT = CHAR_DEPENDENT.charCodeAt(0); function getChunkModulesBySignature( - assignedEntryPointsByModule: Map>, - allEntryPoints: readonly Module[] + assignedEntriesByModule: ReadonlyDependentModuleMap, + allEntries: Iterable ) { const chunkModules: { [chunkSignature: string]: Module[] } = Object.create(null); - for (const [module, assignedEntryPoints] of assignedEntryPointsByModule) { + for (const [module, assignedEntries] of assignedEntriesByModule) { let chunkSignature = ''; - for (const entry of allEntryPoints) { - chunkSignature += assignedEntryPoints.has(entry) ? CHAR_DEPENDENT : CHAR_INDEPENDENT; + for (const entry of allEntries) { + chunkSignature += assignedEntries.has(entry) ? CHAR_DEPENDENT : CHAR_INDEPENDENT; } const chunk = chunkModules[chunkSignature]; if (chunk) { diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_config.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_config.js new file mode 100644 index 00000000000..c576b1c3250 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: + 'does not avoid separate chunks if too many modules dynamically import the same chunk', + options: { + input: ['main1', 'main2', 'main3', 'main4'] + } +}; diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dep.js new file mode 100644 index 00000000000..2338648d763 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dep.js @@ -0,0 +1,7 @@ +define(['exports'], (function (exports) { 'use strict'; + + const value = 'shared'; + + exports.value = value; + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic1.js new file mode 100644 index 00000000000..0521001fece --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic1.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('dynamic1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic2'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic2.js new file mode 100644 index 00000000000..7e1d9ca3c22 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic2.js @@ -0,0 +1,5 @@ +define(['./generated-dep'], (function (dep) { 'use strict'; + + console.log('dynamic2', dep.value); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main1.js new file mode 100644 index 00000000000..eed65cfcb79 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main1.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('main1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic1'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main2.js new file mode 100644 index 00000000000..eed65cfcb79 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main2.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('main1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic1'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main3.js new file mode 100644 index 00000000000..eed65cfcb79 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main3.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('main1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic1'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main4.js new file mode 100644 index 00000000000..eed65cfcb79 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main4.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('main1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic1'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dep.js new file mode 100644 index 00000000000..31a412b6dc4 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dep.js @@ -0,0 +1,5 @@ +'use strict'; + +const value = 'shared'; + +exports.value = value; diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic1.js new file mode 100644 index 00000000000..bc0ad9f1c2a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic1.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('dynamic1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic2.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic2.js new file mode 100644 index 00000000000..af07a8e556a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic2.js @@ -0,0 +1,5 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('dynamic2', dep.value); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main1.js new file mode 100644 index 00000000000..5d139ba4b8d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main1.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('main1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic1.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main2.js new file mode 100644 index 00000000000..5d139ba4b8d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main2.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('main1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic1.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main3.js new file mode 100644 index 00000000000..5d139ba4b8d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main3.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('main1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic1.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main4.js new file mode 100644 index 00000000000..5d139ba4b8d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main4.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('main1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic1.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dep.js new file mode 100644 index 00000000000..27b7b7de159 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dep.js @@ -0,0 +1,3 @@ +const value = 'shared'; + +export { value as v }; diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic1.js new file mode 100644 index 00000000000..67428789ad0 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic1.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('dynamic1', value); +import('./generated-dynamic2.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic2.js new file mode 100644 index 00000000000..0c2d81a045a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic2.js @@ -0,0 +1,3 @@ +import { v as value } from './generated-dep.js'; + +console.log('dynamic2', value); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main1.js new file mode 100644 index 00000000000..40e11af6e3d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main1.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('main1', value); +import('./generated-dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main2.js new file mode 100644 index 00000000000..40e11af6e3d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main2.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('main1', value); +import('./generated-dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main3.js new file mode 100644 index 00000000000..40e11af6e3d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main3.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('main1', value); +import('./generated-dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main4.js new file mode 100644 index 00000000000..40e11af6e3d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main4.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('main1', value); +import('./generated-dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dep.js new file mode 100644 index 00000000000..a8d6d67aa46 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dep.js @@ -0,0 +1,10 @@ +System.register([], (function (exports) { + 'use strict'; + return { + execute: (function () { + + const value = exports('v', 'shared'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic1.js new file mode 100644 index 00000000000..57cef271845 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic1.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('dynamic1', value); + module.import('./generated-dynamic2.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic2.js new file mode 100644 index 00000000000..ba93f808068 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic2.js @@ -0,0 +1,14 @@ +System.register(['./generated-dep.js'], (function () { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('dynamic2', value); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main1.js new file mode 100644 index 00000000000..a469eaf5724 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main1.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('main1', value); + module.import('./generated-dynamic1.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main2.js new file mode 100644 index 00000000000..a469eaf5724 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main2.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('main1', value); + module.import('./generated-dynamic1.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main3.js new file mode 100644 index 00000000000..a469eaf5724 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main3.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('main1', value); + module.import('./generated-dynamic1.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main4.js new file mode 100644 index 00000000000..a469eaf5724 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main4.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('main1', value); + module.import('./generated-dynamic1.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dep.js new file mode 100644 index 00000000000..1d4be9c15d0 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dep.js @@ -0,0 +1 @@ +export const value = 'shared'; diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic1.js new file mode 100644 index 00000000000..58d0327fc60 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic1.js @@ -0,0 +1,4 @@ +import { value } from './dep.js'; +console.log('dynamic1', value); +import('./dynamic2.js'); + diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic2.js new file mode 100644 index 00000000000..daf24d9c4d3 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic2.js @@ -0,0 +1,2 @@ +import { value } from './dep.js'; +console.log('dynamic2', value); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main1.js new file mode 100644 index 00000000000..170c4e5d89a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main1.js @@ -0,0 +1,3 @@ +import { value } from './dep.js'; +console.log('main1', value); +import('./dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main2.js new file mode 100644 index 00000000000..170c4e5d89a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main2.js @@ -0,0 +1,3 @@ +import { value } from './dep.js'; +console.log('main1', value); +import('./dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main3.js new file mode 100644 index 00000000000..170c4e5d89a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main3.js @@ -0,0 +1,3 @@ +import { value } from './dep.js'; +console.log('main1', value); +import('./dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main4.js new file mode 100644 index 00000000000..170c4e5d89a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main4.js @@ -0,0 +1,3 @@ +import { value } from './dep.js'; +console.log('main1', value); +import('./dynamic1.js');