From 0de3c06fedb06be6db549f2208cc4036125770e2 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Wed, 11 May 2022 13:57:26 +0800 Subject: [PATCH] Fix SWC dynamic transform with suspense but without ssr --- .../next-swc/crates/core/src/next_dynamic.rs | 18 +++++++++++++----- .../fixture/next-dynamic/with-options/input.js | 5 +++++ .../next-dynamic/with-options/output-dev.js | 10 ++++++++++ .../next-dynamic/with-options/output-prod.js | 10 ++++++++++ .../next-dynamic/with-options/output-server.js | 10 ++++++++++ 5 files changed, 48 insertions(+), 5 deletions(-) diff --git a/packages/next-swc/crates/core/src/next_dynamic.rs b/packages/next-swc/crates/core/src/next_dynamic.rs index 4d45798a20a6..aec2eda4f163 100644 --- a/packages/next-swc/crates/core/src/next_dynamic.rs +++ b/packages/next-swc/crates/core/src/next_dynamic.rs @@ -226,6 +226,7 @@ impl Fold for NextDynamicPatcher { })))]; let mut has_ssr_false = false; + let mut has_suspense = false; if expr.args.len() == 2 { if let Expr::Object(ObjectLit { @@ -253,13 +254,20 @@ impl Fold for NextDynamicPatcher { if let Some(Lit::Bool(Bool { value: false, span: _, - })) = match &**value { - Expr::Lit(lit) => Some(lit), - _ => None, - } { + })) = value.as_lit() + { has_ssr_false = true } } + if sym == "suspense" { + if let Some(Lit::Bool(Bool { + value: true, + span: _, + })) = value.as_lit() + { + has_suspense = true + } + } } } } @@ -267,7 +275,7 @@ impl Fold for NextDynamicPatcher { } } - if has_ssr_false && self.is_server { + if has_ssr_false && !has_suspense && self.is_server { expr.args[0] = Lit::Null(Null { span: DUMMY_SP }).as_arg(); } diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/input.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/input.js index 82cb14f53566..c258d8fade56 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/input.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/input.js @@ -9,3 +9,8 @@ const DynamicClientOnlyComponent = dynamic( () => import('../components/hello'), { ssr: false } ) + +const DynamicClientOnlyComponentWithSuspense = dynamic( + () => import('../components/hello'), + { ssr: false, suspense: true } +) diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-dev.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-dev.js index b0aba0caa23a..d4d144e1e364 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-dev.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-dev.js @@ -17,3 +17,13 @@ const DynamicClientOnlyComponent = dynamic(()=>import('../components/hello') }, ssr: false }); +const DynamicClientOnlyComponentWithSuspense = dynamic(()=>import('../components/hello') +, { + loadableGenerated: { + modules: [ + "some-file.js -> " + "../components/hello" + ] + }, + ssr: false, + suspense: true +}); diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-prod.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-prod.js index 6ba8d24a9b45..d7e8a3ae55f2 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-prod.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-prod.js @@ -17,3 +17,13 @@ const DynamicClientOnlyComponent = dynamic(()=>import('../components/hello') }, ssr: false }); +const DynamicClientOnlyComponentWithSuspense = dynamic(()=>import('../components/hello') +, { + loadableGenerated: { + webpack: ()=>[ + require.resolveWeak("../components/hello") + ] + }, + ssr: false, + suspense: true +}); diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-server.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-server.js index 453c19d3af24..fbaab8c10c03 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-server.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/with-options/output-server.js @@ -16,3 +16,13 @@ const DynamicClientOnlyComponent = dynamic(null, { }, ssr: false }); +const DynamicClientOnlyComponentWithSuspense = dynamic(()=>import('../components/hello') +, { + loadableGenerated: { + modules: [ + "some-file.js -> " + "../components/hello" + ] + }, + ssr: false, + suspense: true +});