Skip to content

Commit 7b948ef

Browse files
neoGenevaprivatenumber
andauthoredMar 8, 2024··
feat: enable dynamic-imports by default (#361)
Co-authored-by: Hiroki Osame <hiroki.osame@gmail.com>
1 parent 58d5573 commit 7b948ef

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed
 

‎src/loader.ts

+8
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,14 @@ async function ESBuildLoader(
9090
}
9191
}
9292

93+
/**
94+
* Enable dynamic import by default to support code splitting in Webpack
95+
*/
96+
transformOptions.supported = {
97+
'dynamic-import': true,
98+
...transformOptions.supported,
99+
};
100+
93101
try {
94102
const { code, map } = await transform(source, transformOptions);
95103
done(null, code, map && JSON.parse(map));

‎tests/specs/loader.ts

+51
Original file line numberDiff line numberDiff line change
@@ -407,5 +407,56 @@ export default testSuite(({ describe }, webpack: typeof webpack4 | typeof webpac
407407
const code = built.fs.readFileSync('/dist/index.js', 'utf8');
408408
expect(code).toContain('div{color:red}');
409409
});
410+
411+
test('Keeps dynamic imports by default', async () => {
412+
const built = await build(
413+
{
414+
'/src/index.js': 'export default async () => (await import("./test2.js")).default',
415+
'/src/test2.js': 'export default "test2"',
416+
},
417+
(config) => {
418+
configureEsbuildLoader(config, { options: { target: 'chrome52' } });
419+
},
420+
webpack,
421+
);
422+
423+
expect(built.stats.hasWarnings()).toBe(false);
424+
expect(built.stats.hasErrors()).toBe(false);
425+
426+
const { assets } = built.stats.compilation;
427+
expect(assets).toHaveProperty(['index.js']);
428+
429+
// Chunk split because esbuild preserved the dynamic import
430+
expect(Object.keys(assets).length).toBe(2);
431+
expect(await built.require('/dist')()).toBe('test2');
432+
});
433+
434+
test('Dynamic imports can be disabled', async () => {
435+
const built = await build(
436+
{
437+
'/src/index.js': 'export default async () => (await import("./test2.js")).default',
438+
'/src/test2.js': 'export default "test2"',
439+
},
440+
(config) => {
441+
configureEsbuildLoader(config, {
442+
options: {
443+
target: 'chrome52',
444+
supported: { 'dynamic-import': false },
445+
},
446+
});
447+
},
448+
webpack,
449+
);
450+
451+
expect(built.stats.hasWarnings()).toBe(false);
452+
expect(built.stats.hasErrors()).toBe(false);
453+
454+
const { assets } = built.stats.compilation;
455+
expect(assets).toHaveProperty(['index.js']);
456+
457+
// No chunk split because esbuild removed the dynamic import
458+
expect(Object.keys(assets).length).toBe(1);
459+
expect(await built.require('/dist')()).toBe('test2');
460+
});
410461
});
411462
});

0 commit comments

Comments
 (0)
Please sign in to comment.