Skip to content

Commit 840496a

Browse files
committed
Ensure "[Fast Refresh] rebuilding" logs have a matching "[Fast Refresh] done" log
1 parent eeff555 commit 840496a

File tree

2 files changed

+31
-28
lines changed

2 files changed

+31
-28
lines changed

packages/next/src/client/components/react-dev-overlay/app/hot-reloader-client.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ function onFastRefresh(
5959
updatedModules: ReadonlyArray<string>
6060
) {
6161
dispatcher.onBuildOk()
62-
6362
reportHmrLatency(sendMessage, updatedModules)
6463

6564
dispatcher.onRefresh()
@@ -161,6 +160,7 @@ function tryApplyUpdates(
161160
) {
162161
if (!isUpdateAvailable() || !canApplyUpdates()) {
163162
dispatcher.onBuildOk()
163+
reportHmrLatency(sendMessage, [])
164164
return
165165
}
166166

@@ -430,7 +430,6 @@ function processMessage(
430430
router.hmrRefresh()
431431
dispatcher.onRefresh()
432432
})
433-
reportHmrLatency(sendMessage, [])
434433

435434
if (process.env.__NEXT_TEST_MODE) {
436435
if (self.__NEXT_HMR_CB) {

test/development/app-hmr/hmr.test.ts

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -92,39 +92,43 @@ describe(`app-dir-hmr`, () => {
9292
} else {
9393
await retry(
9494
async () => {
95-
const fastRefreshLogs = logs.filter((log) => {
96-
return log.message.startsWith('[Fast Refresh]')
95+
const envValue = await browser.elementByCss('p').text()
96+
const mpa = await browser.eval(
97+
'window.__TEST_NO_RELOAD === undefined'
98+
)
99+
// Used to be flaky but presumably no longer is.
100+
// If this flakes again, please add the received value as a commnet.
101+
expect({ envValue, mpa }).toEqual({
102+
envValue: 'ipad',
103+
mpa: false,
97104
})
98-
// FIXME: Should be either a single "rebuilding"+"done" or the last "rebuilding" should be followed by "done"
99-
expect(fastRefreshLogs).toEqual([
100-
{ source: 'log', message: '[Fast Refresh] rebuilding' },
101-
{ source: 'log', message: '[Fast Refresh] rebuilding' },
102-
{
103-
source: 'log',
104-
message: expect.stringContaining('[Fast Refresh] done in '),
105-
},
106-
{ source: 'log', message: '[Fast Refresh] rebuilding' },
107-
])
108105
},
109106
// Very slow Hot Update for some reason.
110107
// May be related to receiving 3 rebuild events but only one finish event
111108
5000
112109
)
110+
111+
const fastRefreshLogs = logs.filter((log) => {
112+
return log.message.startsWith('[Fast Refresh]')
113+
})
114+
expect(fastRefreshLogs).toEqual([
115+
{ source: 'log', message: '[Fast Refresh] rebuilding' },
116+
{
117+
source: 'log',
118+
message: expect.stringContaining('[Fast Refresh] done in '),
119+
},
120+
{ source: 'log', message: '[Fast Refresh] rebuilding' },
121+
{ source: 'log', message: '[Fast Refresh] rebuilding' },
122+
{
123+
source: 'log',
124+
message: expect.stringContaining('[Fast Refresh] done in '),
125+
},
126+
{
127+
source: 'log',
128+
message: expect.stringContaining('[Fast Refresh] done in '),
129+
},
130+
])
113131
}
114-
const envValue = await browser.elementByCss('p').text()
115-
const mpa = await browser.eval('window.__TEST_NO_RELOAD === undefined')
116-
// Flaky sometimes in Webpack:
117-
// A. misses update and just receives `{ envValue: 'mac', mpa: false }`
118-
// B. triggers error on server resulting in MPA: `{ envValue: 'ipad', mpa: true }` and server logs: ⨯ [TypeError: Cannot read properties of undefined (reading 'polyfillFiles')] ⨯ [TypeError: Cannot read properties of null (reading 'default')]
119-
// A is more common than B.
120-
expect({ envValue, mpa }).toEqual({
121-
envValue:
122-
isPPREnabledByDefault && !process.env.TURBOPACK
123-
? // FIXME: Should be 'ipad' but PPR+Webpack swallows the update reliably
124-
'mac'
125-
: 'ipad',
126-
mpa: false,
127-
})
128132
} finally {
129133
await next.patchFile(envFile, envContent)
130134
}

0 commit comments

Comments
 (0)