@@ -33,19 +33,24 @@ export type LoadableBaseOptions<P = {}> = LoadableGeneratedOptions & {
3333 ssr ?: boolean
3434}
3535
36+ export type LoadableSuspenseOptions < P = { } > = {
37+ loader : Loader < P >
38+ suspense ?: boolean
39+ }
40+
3641export type LoadableOptions < P = { } > = LoadableBaseOptions < P >
3742
3843export type DynamicOptions < P = { } > = LoadableBaseOptions < P >
3944
4045export type LoadableFn < P = { } > = (
41- opts : LoadableOptions < P >
46+ opts : LoadableOptions < P > | LoadableSuspenseOptions < P >
4247) => React . ComponentType < P >
4348
4449export type LoadableComponent < P = { } > = React . ComponentType < P >
4550
4651export function noSSR < P = { } > (
4752 LoadableInitializer : LoadableFn < P > ,
48- loadableOptions : LoadableOptions < P >
53+ loadableOptions : LoadableBaseOptions < P >
4954) : React . ComponentType < P > {
5055 // Removing webpack and modules means react-loadable won't try preloading
5156 delete loadableOptions . webpack
@@ -63,8 +68,6 @@ export function noSSR<P = {}>(
6368 )
6469}
6570
66- // function dynamic<P = {}, O extends DynamicOptions>(options: O):
67-
6871export default function dynamic < P = { } > (
6972 dynamicOptions : DynamicOptions < P > | Loader < P > ,
7073 options ?: DynamicOptions < P >
@@ -110,6 +113,21 @@ export default function dynamic<P = {}>(
110113 // Support for passing options, eg: dynamic(import('../hello-world'), {loading: () => <p>Loading something</p>})
111114 loadableOptions = { ...loadableOptions , ...options }
112115
116+ const suspenseOptions = loadableOptions as LoadableSuspenseOptions < P >
117+ if ( ! process . env . __NEXT_CONCURRENT_FEATURES ) {
118+ // Error if react root is not enabled and `suspense` option is set to true
119+ if ( ! process . env . __NEXT_REACT_ROOT && suspenseOptions . suspense ) {
120+ // TODO: add error doc when this feature is stable
121+ throw new Error (
122+ `Disallowed suspense option usage with next/dynamic in blocking mode`
123+ )
124+ }
125+ suspenseOptions . suspense = false
126+ }
127+ if ( suspenseOptions . suspense ) {
128+ return loadableFn ( suspenseOptions )
129+ }
130+
113131 // coming from build/babel/plugins/react-loadable-plugin.js
114132 if ( loadableOptions . loadableGenerated ) {
115133 loadableOptions = {
0 commit comments