From 417da4b48f871cefb799e48294126f02ec3fb3b6 Mon Sep 17 00:00:00 2001 From: PeachScript Date: Thu, 8 Aug 2024 09:50:36 +0800 Subject: [PATCH 1/2] feat(bundler-mako): generate dynamicImportToRequire from babel and webpack config --- packages/bundler-mako/index.js | 36 +++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/bundler-mako/index.js b/packages/bundler-mako/index.js index 854f7e1f3..0c847d006 100644 --- a/packages/bundler-mako/index.js +++ b/packages/bundler-mako/index.js @@ -388,7 +388,10 @@ function checkConfig(opts) { .some((p) => { const isImportPlugin = /^import$|babel-plugin-import/.test(p[0]); const isEmotionPlugin = p === '@emotion' || p === '@emotion/babel-plugin'; - if (!isImportPlugin && !isEmotionPlugin) { + const isDynamicImportNode = /^(babel-plugin-)?dynamic-import-node$/.test( + p, + ); + if (!isImportPlugin && !isEmotionPlugin && !isDynamicImportNode) { warningKeys.push('extraBabelPlugins'); return true; } @@ -446,12 +449,20 @@ async function getMakoConfig(opts) { } const webpackConfig = webpackChainConfig.toConfig(); let umd = false; - if ( - webpackConfig.output && - webpackConfig.output.libraryTarget === 'umd' && - webpackConfig.output.library - ) { - umd = webpackConfig.output.library; + let { dynamicImportToRequire } = opts.config; + if (webpackConfig.output) { + // handle asyncChunks config + if (webpackConfig.output.asyncChunks === false) { + dynamicImportToRequire = true; + } + + // handle umd output config + if ( + webpackConfig.output.libraryTarget === 'umd' && + webpackConfig.output.library + ) { + umd = webpackConfig.output.library; + } } let platform = 'browser'; @@ -466,7 +477,6 @@ async function getMakoConfig(opts) { mdx, devtool, cjs, - dynamicImportToRequire, jsMinifier, externals, copy = [], @@ -516,11 +526,19 @@ async function getMakoConfig(opts) { if (process.env.COMPRESS === 'none') { minify = false; } - // transform babel-plugin-import plugins to transformImport const extraBabelPlugins = [ ...(opts.extraBabelPlugins || []), ...(opts.config.extraBabelPlugins || []), ]; + + // transform babel-plugin-dynamic-import-node to dynamicImportToRequire + dynamicImportToRequire ??= Boolean( + extraBabelPlugins.find((p) => + /^(babel-plugin-)?dynamic-import-node$/.test(p), + ), + ); + + // transform babel-plugin-import plugins to transformImport const transformImport = extraBabelPlugins .filter((p) => /^import$|babel-plugin-import/.test(p[0])) .map(([_, v]) => { From ceb0ceaf6917cd504fab007000ceabb1b7336525 Mon Sep 17 00:00:00 2001 From: PeachScript Date: Thu, 8 Aug 2024 09:56:04 +0800 Subject: [PATCH 2/2] test: add case for umi babel-plugin-dynamic-import-node --- .../config.babel-plugin-dynamic-import-node/.umirc.ts | 4 ++++ .../config.babel-plugin-dynamic-import-node/async.ts | 1 + .../config.babel-plugin-dynamic-import-node/expect.js | 11 +++++++++++ .../pages/index.tsx | 3 +++ 4 files changed, 19 insertions(+) create mode 100644 e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/.umirc.ts create mode 100644 e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/async.ts create mode 100644 e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/expect.js create mode 100644 e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/pages/index.tsx diff --git a/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/.umirc.ts b/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/.umirc.ts new file mode 100644 index 000000000..1b5f2c55f --- /dev/null +++ b/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/.umirc.ts @@ -0,0 +1,4 @@ +export default { + mako: {}, + extraBabelPlugins: ['babel-plugin-dynamic-import-node'], +}; diff --git a/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/async.ts b/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/async.ts new file mode 100644 index 000000000..0ed5c3008 --- /dev/null +++ b/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/async.ts @@ -0,0 +1 @@ +export default 'a'; diff --git a/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/expect.js b/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/expect.js new file mode 100644 index 000000000..aef0595ae --- /dev/null +++ b/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/expect.js @@ -0,0 +1,11 @@ +const assert = require("assert"); +const { parseBuildResult } = require("../../../scripts/test-utils"); +const { files } = parseBuildResult(__dirname); + +const jsFilesCount = Object.keys(files).filter(f => f.endsWith('.js')).length; + +assert.equal( + jsFilesCount, + 1, + 'should output one js file', +); diff --git a/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/pages/index.tsx b/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/pages/index.tsx new file mode 100644 index 000000000..3591c56de --- /dev/null +++ b/e2e/fixtures.umi/config.babel-plugin-dynamic-import-node/pages/index.tsx @@ -0,0 +1,3 @@ +console.log('single file'); + +import('../async');