mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
Make sure to invalidate only once before webpack complete the build. (#1297)
* Make sure to invalidate only once before webpack complete the build. * Increase the touch timeout to 1 sec.
This commit is contained in:
parent
ebb397975d
commit
ee56636660
|
@ -17,9 +17,12 @@ export default function onDemandEntryHandler (devMiddleware, compiler, {
|
||||||
const entries = {}
|
const entries = {}
|
||||||
const lastAccessPages = ['']
|
const lastAccessPages = ['']
|
||||||
const doneCallbacks = new EventEmitter()
|
const doneCallbacks = new EventEmitter()
|
||||||
|
const invalidator = new Invalidator(devMiddleware)
|
||||||
let touchedAPage = false
|
let touchedAPage = false
|
||||||
|
|
||||||
compiler.plugin('make', function (compilation, done) {
|
compiler.plugin('make', function (compilation, done) {
|
||||||
|
invalidator.startBuilding()
|
||||||
|
|
||||||
const allEntries = Object.keys(entries).map((page) => {
|
const allEntries = Object.keys(entries).map((page) => {
|
||||||
const { name, entry } = entries[page]
|
const { name, entry } = entries[page]
|
||||||
entries[page].status = BUILDING
|
entries[page].status = BUILDING
|
||||||
|
@ -44,7 +47,7 @@ export default function onDemandEntryHandler (devMiddleware, compiler, {
|
||||||
if (!touchedAPage) {
|
if (!touchedAPage) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
touch.sync(entryInfo.pathname)
|
touch.sync(entryInfo.pathname)
|
||||||
}, 0)
|
}, 1000)
|
||||||
touchedAPage = true
|
touchedAPage = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,6 +55,8 @@ export default function onDemandEntryHandler (devMiddleware, compiler, {
|
||||||
entries[page].lastActiveTime = Date.now()
|
entries[page].lastActiveTime = Date.now()
|
||||||
doneCallbacks.emit(page)
|
doneCallbacks.emit(page)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
invalidator.doneBuilding()
|
||||||
})
|
})
|
||||||
|
|
||||||
setInterval(function () {
|
setInterval(function () {
|
||||||
|
@ -92,7 +97,7 @@ export default function onDemandEntryHandler (devMiddleware, compiler, {
|
||||||
entries[page] = { name, entry, pathname, status: ADDED }
|
entries[page] = { name, entry, pathname, status: ADDED }
|
||||||
doneCallbacks.on(page, processCallback)
|
doneCallbacks.on(page, processCallback)
|
||||||
|
|
||||||
devMiddleware.invalidate()
|
invalidator.invalidate()
|
||||||
|
|
||||||
function processCallback (err) {
|
function processCallback (err) {
|
||||||
if (err) return reject(err)
|
if (err) return reject(err)
|
||||||
|
@ -182,3 +187,39 @@ function sendJson (res, payload) {
|
||||||
res.status = 200
|
res.status = 200
|
||||||
res.end(JSON.stringify(payload))
|
res.end(JSON.stringify(payload))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure only one invalidation happens at a time
|
||||||
|
// Otherwise, webpack hash gets changed and it'll force the client to reload.
|
||||||
|
class Invalidator {
|
||||||
|
constructor (devMiddleware) {
|
||||||
|
this.devMiddleware = devMiddleware
|
||||||
|
this.building = false
|
||||||
|
this.rebuildAgain = false
|
||||||
|
}
|
||||||
|
|
||||||
|
invalidate () {
|
||||||
|
// If there's a current build is processing, we won't abort it by invalidating.
|
||||||
|
// (If aborted, it'll cause a client side hard reload)
|
||||||
|
// But let it to invalidate just after the completion.
|
||||||
|
// So, it can re-build the queued pages at once.
|
||||||
|
if (this.building) {
|
||||||
|
this.rebuildAgain = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.building = true
|
||||||
|
this.devMiddleware.invalidate()
|
||||||
|
}
|
||||||
|
|
||||||
|
startBuilding () {
|
||||||
|
this.building = true
|
||||||
|
}
|
||||||
|
|
||||||
|
doneBuilding () {
|
||||||
|
this.building = false
|
||||||
|
if (this.rebuildAgain) {
|
||||||
|
this.rebuildAgain = false
|
||||||
|
this.invalidate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue