@@ -415,6 +415,12 @@ export default async (opts: { webpackHMR?: any } = {}) => {
415415 }
416416}
417417
418+ function requireEnsureAsync ( dep : string ) : Promise < any > {
419+ return new Promise ( ( resolve , reject ) => {
420+ return require . ensure ( [ dep ] , ( require ) => resolve ( require ( dep ) ) , reject )
421+ } )
422+ }
423+
418424export async function render ( renderingProps : RenderRouteInfo ) : Promise < void > {
419425 if ( renderingProps . err ) {
420426 await renderError ( renderingProps )
@@ -466,13 +472,17 @@ export function renderError(renderErrorProps: RenderErrorProps): Promise<any> {
466472 console . error ( err )
467473 return pageLoader
468474 . loadPage ( '/_error' )
469- . then ( ( { page : ErrorComponent , styleSheets } ) => {
470- return lastAppProps ?. Component === ErrorComponent
471- ? import ( 'next/dist/pages/_error' ) . then ( ( m ) => ( {
472- ErrorComponent : m . default as React . ComponentType < { } > ,
473- styleSheets : [ ] ,
474- } ) )
475- : { ErrorComponent, styleSheets }
475+ . then ( async ( { page : ErrorComponent , styleSheets } ) => {
476+ if ( lastAppProps ?. Component === ErrorComponent ) {
477+ // Error loop detected on rerender
478+ const DefaultError = ( await requireEnsureAsync ( '../pages/_error' ) )
479+ . default as React . ComponentType < { } >
480+ return {
481+ ErrorComponent : DefaultError ,
482+ styleSheets : [ ] ,
483+ }
484+ }
485+ return { ErrorComponent, styleSheets }
476486 } )
477487 . then ( ( { ErrorComponent, styleSheets } ) => {
478488 // In production we do a normal render with the `ErrorComponent` as component.
0 commit comments