perf: improve retrieving versionInfo
on Turbo HMR (#67309)
### Why? Identified the bottleneck of Turbopack HMR, one of the reason is that we run `execSync` to get user's package manager and fetch their registry to get the latest & canary version of Next.js. This process was located at the initial of HMR, which could have been delayed to the initial of the error handling. ### How? - Remove getting user's package manager and just fetch from NPM regardless the user uses Yarn. - Used an async IIFE to await the promise of `getVerionInfo` value inside the synchronous `ws.handleUpgrade`. ### Benchmark > Benchmarked with console inside try-finally #### Webpack -- no cache | Version | Ready | |-------------------------------------|---------| | Canary | 1185ms | | Delta | 896ms | | Delta Webpack vs Canary Webpack | -24.39% | #### Turbopack | Version | Ready | |-------------------------------------|---------| | Canary | 1002ms | | Delta (Turbopack) | 509ms | | Delta Turbopack vs Canary Turbopack | -49.20% | --------- Co-authored-by: Jiachi Liu <inbox@huozhi.im> Co-authored-by: Tobias Koppers <tobias.koppers@googlemail.com>
This commit is contained in:
parent
0e6e83c33d
commit
ef83433c3e
2 changed files with 15 additions and 13 deletions
|
@ -41,7 +41,6 @@ import {
|
|||
} from '../lib/render-server'
|
||||
import { denormalizePagePath } from '../../shared/lib/page-path/denormalize-page-path'
|
||||
import { trace } from '../../trace'
|
||||
import type { VersionInfo } from './parse-version-info'
|
||||
import {
|
||||
AssetMapper,
|
||||
type ChangeSubscriptions,
|
||||
|
@ -504,7 +503,7 @@ export async function createHotReloaderTurbopack(
|
|||
)
|
||||
)
|
||||
const overlayMiddleware = getOverlayMiddleware(project)
|
||||
const versionInfo: VersionInfo = await getVersionInfo(
|
||||
const versionInfoPromise = getVersionInfo(
|
||||
isTestMode || opts.telemetry.isEnabled
|
||||
)
|
||||
|
||||
|
@ -666,15 +665,19 @@ export async function createHotReloaderTurbopack(
|
|||
}
|
||||
}
|
||||
|
||||
const sync: SyncAction = {
|
||||
action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC,
|
||||
errors,
|
||||
warnings: [],
|
||||
hash: '',
|
||||
versionInfo,
|
||||
}
|
||||
;(async function () {
|
||||
const versionInfo = await versionInfoPromise
|
||||
|
||||
sendToClient(client, sync)
|
||||
const sync: SyncAction = {
|
||||
action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC,
|
||||
errors,
|
||||
warnings: [],
|
||||
hash: '',
|
||||
versionInfo,
|
||||
}
|
||||
|
||||
sendToClient(client, sync)
|
||||
})()
|
||||
})
|
||||
},
|
||||
|
||||
|
|
|
@ -62,7 +62,6 @@ import { getProperError } from '../../lib/is-error'
|
|||
import ws from 'next/dist/compiled/ws'
|
||||
import { existsSync, promises as fs } from 'fs'
|
||||
import type { UnwrapPromise } from '../../lib/coalesced-function'
|
||||
import { getRegistry } from '../../lib/helpers/get-registry'
|
||||
import { parseVersionInfo } from './parse-version-info'
|
||||
import type { VersionInfo } from './parse-version-info'
|
||||
import { isAPIRoute } from '../../lib/is-api-route'
|
||||
|
@ -202,11 +201,11 @@ export async function getVersionInfo(enabled: boolean): Promise<VersionInfo> {
|
|||
try {
|
||||
installed = require('next/package.json').version
|
||||
|
||||
const registry = getRegistry()
|
||||
let res
|
||||
|
||||
try {
|
||||
res = await fetch(`${registry}-/package/next/dist-tags`)
|
||||
// use NPM registry regardless user using Yarn
|
||||
res = await fetch('https://registry.npmjs.org/-/package/next/dist-tags')
|
||||
} catch {
|
||||
// ignore fetch errors
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue