mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
Move webpack idle wait code to the page-loader.
Because that's the place to do it.
This commit is contained in:
parent
751d2e9853
commit
4f26e84ff2
|
@ -1,6 +1,8 @@
|
||||||
/* global window, document */
|
/* global window, document */
|
||||||
import mitt from 'mitt'
|
import mitt from 'mitt'
|
||||||
|
|
||||||
|
const webpackModule = module
|
||||||
|
|
||||||
export default class PageLoader {
|
export default class PageLoader {
|
||||||
constructor (buildId) {
|
constructor (buildId) {
|
||||||
this.buildId = buildId
|
this.buildId = buildId
|
||||||
|
@ -18,19 +20,6 @@ export default class PageLoader {
|
||||||
return route.replace(/index$/, '')
|
return route.replace(/index$/, '')
|
||||||
}
|
}
|
||||||
|
|
||||||
loadPageSync (route) {
|
|
||||||
route = this.normalizeRoute(route)
|
|
||||||
const cachedPage = this.pageCache[route]
|
|
||||||
|
|
||||||
if (!cachedPage) {
|
|
||||||
return null
|
|
||||||
} else if (cachedPage.error) {
|
|
||||||
throw cachedPage.error
|
|
||||||
} else {
|
|
||||||
return cachedPage.page
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
loadPage (route) {
|
loadPage (route) {
|
||||||
route = this.normalizeRoute(route)
|
route = this.normalizeRoute(route)
|
||||||
|
|
||||||
|
@ -79,12 +68,32 @@ export default class PageLoader {
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method if called by the route code.
|
// This method if called by the route code.
|
||||||
registerPage (route, error, page) {
|
registerPage (route, regFn) {
|
||||||
|
const register = () => {
|
||||||
|
regFn((error, page) => {
|
||||||
route = this.normalizeRoute(route)
|
route = this.normalizeRoute(route)
|
||||||
|
|
||||||
// add the page to the cache
|
// add the page to the cache
|
||||||
this.pageCache[route] = { error, page }
|
this.pageCache[route] = { error, page }
|
||||||
this.registerEvents.emit(route, { error, page })
|
this.registerEvents.emit(route, { error, page })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for webpack to became idle if it's not.
|
||||||
|
// More info: https://github.com/zeit/next.js/pull/1511
|
||||||
|
if (webpackModule && webpackModule.hot && webpackModule.hot.status() !== 'idle') {
|
||||||
|
console.log(`Waiting webpack to became "idle" to initialize the page: "${route}"`)
|
||||||
|
|
||||||
|
const check = (status) => {
|
||||||
|
if (status === 'idle') {
|
||||||
|
webpackModule.hot.removeStatusHandler(check)
|
||||||
|
register()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
webpackModule.hot.status(check)
|
||||||
|
} else {
|
||||||
|
register()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clearCache (route) {
|
clearCache (route) {
|
||||||
|
|
|
@ -5,8 +5,6 @@ import PQueue from '../p-queue'
|
||||||
import { loadGetInitialProps, getURL } from '../utils'
|
import { loadGetInitialProps, getURL } from '../utils'
|
||||||
import { _notifyBuildIdMismatch } from './'
|
import { _notifyBuildIdMismatch } from './'
|
||||||
|
|
||||||
const webpackModule = module
|
|
||||||
|
|
||||||
export default class Router {
|
export default class Router {
|
||||||
constructor (pathname, query, as, { pageLoader, Component, ErrorComponent, err } = {}) {
|
constructor (pathname, query, as, { pageLoader, Component, ErrorComponent, err } = {}) {
|
||||||
// represents the current component key
|
// represents the current component key
|
||||||
|
@ -320,20 +318,6 @@ export default class Router {
|
||||||
}
|
}
|
||||||
|
|
||||||
async fetchRoute (route) {
|
async fetchRoute (route) {
|
||||||
// Wait for webpack to became idle if it's not.
|
|
||||||
// More info: https://github.com/zeit/next.js/pull/1511
|
|
||||||
if (webpackModule && webpackModule.hot && webpackModule.hot.status() !== 'idle') {
|
|
||||||
await new Promise((resolve) => {
|
|
||||||
const check = (status) => {
|
|
||||||
if (status === 'idle') {
|
|
||||||
webpackModule.hot.removeStatusHandler(check)
|
|
||||||
resolve()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
webpackModule.hot.status(check)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return await this.pageLoader.loadPage(route)
|
return await this.pageLoader.loadPage(route)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,10 @@ export default class PagesPlugin {
|
||||||
const content = page.source()
|
const content = page.source()
|
||||||
const newContent = `
|
const newContent = `
|
||||||
function loadPage () {
|
function loadPage () {
|
||||||
|
window.__NEXT_PAGE_LOADER__.registerPage('${routeName}', function(cb) {
|
||||||
var comp = ${content}
|
var comp = ${content}
|
||||||
window.__NEXT_PAGE_LOADER__.registerPage('${routeName}', null, comp.default)
|
cb(null, comp.default)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window.__NEXT_PAGE_LOADER__) {
|
if (window.__NEXT_PAGE_LOADER__) {
|
||||||
|
|
|
@ -123,7 +123,9 @@ export async function renderScriptError (req, res, page, error, customFields, op
|
||||||
var error = new Error('Page not exists: ${page}')
|
var error = new Error('Page not exists: ${page}')
|
||||||
error.pageNotFound = true
|
error.pageNotFound = true
|
||||||
error.statusCode = 404
|
error.statusCode = 404
|
||||||
__NEXT_PAGE_LOADER__.registerPage('${page}', error)
|
__NEXT_PAGE_LOADER__.registerPage('${page}', function(cb) {
|
||||||
|
cb(error)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window.__NEXT_PAGE_LOADER__) {
|
if (window.__NEXT_PAGE_LOADER__) {
|
||||||
|
@ -145,7 +147,9 @@ export async function renderScriptError (req, res, page, error, customFields, op
|
||||||
res.end(`
|
res.end(`
|
||||||
function loadPage () {
|
function loadPage () {
|
||||||
var error = ${JSON.stringify(errorJson)}
|
var error = ${JSON.stringify(errorJson)}
|
||||||
__NEXT_PAGE_LOADER__.registerPage('${page}', error)
|
__NEXT_PAGE_LOADER__.registerPage('${page}', function(cb) {
|
||||||
|
cb(error)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window.__NEXT_PAGE_LOADER__) {
|
if (window.__NEXT_PAGE_LOADER__) {
|
||||||
|
|
Loading…
Reference in a new issue