11import { createElement } from 'react'
22import ReactDOM from 'react-dom'
3+ import { EventEmitter } from 'events'
34import HeadManager from './head-manager'
45import { rehydrate } from '../lib/css'
56import { createRouter } from '../lib/router'
@@ -33,13 +34,16 @@ const headManager = new HeadManager()
3334const container = document . getElementById ( '__next' )
3435
3536export default ( onError ) => {
37+ const emitter = new EventEmitter ( )
3638 if ( ids && ids . length ) rehydrate ( ids )
3739
3840 router . subscribe ( ( { Component, props, err } ) => {
39- render ( { Component, props, err } , onError )
41+ render ( { Component, props, err, emitter } , onError )
4042 } )
4143
42- render ( { Component, props, err } , onError )
44+ render ( { Component, props, err, emitter } , onError )
45+
46+ return emitter
4347}
4448
4549export async function render ( props , onError = renderErrorComponent ) {
@@ -56,7 +60,7 @@ async function renderErrorComponent (err) {
5660 await doRender ( { Component : ErrorComponent , props, err } )
5761}
5862
59- async function doRender ( { Component, props, err } ) {
63+ async function doRender ( { Component, props, err, emitter } ) {
6064 if ( ! props && Component &&
6165 Component !== ErrorComponent &&
6266 lastAppProps . Component === ErrorComponent ) {
@@ -65,10 +69,19 @@ async function doRender ({ Component, props, err }) {
6569 props = await loadGetInitialProps ( Component , { err, pathname, query } )
6670 }
6771
72+ if ( emitter ) {
73+ emitter . emit ( 'before-reactdom-render' , { Component } )
74+ }
75+
6876 Component = Component || lastAppProps . Component
6977 props = props || lastAppProps . props
7078
7179 const appProps = { Component, props, err, router, headManager }
72- lastAppProps = appProps
7380 ReactDOM . render ( createElement ( App , appProps ) , container )
81+
82+ if ( emitter ) {
83+ emitter . emit ( 'after-reactdom-render' , { Component } )
84+ }
85+
86+ lastAppProps = appProps
7487}
0 commit comments