Skip to content

Commit c881971

Browse files
authoredMar 27, 2023
perf(optimizer): bulk optimizer delay (#12609)
1 parent 420782c commit c881971

File tree

1 file changed

+44
-28
lines changed

1 file changed

+44
-28
lines changed
 

‎packages/vite/src/node/optimizer/optimizer.ts

+44-28
Original file line numberDiff line numberDiff line change
@@ -675,14 +675,14 @@ async function createDepsOptimizer(
675675
let registeredIds: { id: string; done: () => Promise<any> }[] = []
676676
let seenIds = new Set<string>()
677677
let workersSources = new Set<string>()
678-
let waitingOn: string | undefined
678+
const waitingOn = new Set<string>()
679679
let firstRunEnsured = false
680680

681681
function resetRegisteredIds() {
682682
registeredIds = []
683683
seenIds = new Set<string>()
684684
workersSources = new Set<string>()
685-
waitingOn = undefined
685+
waitingOn.clear()
686686
firstRunEnsured = false
687687
}
688688

@@ -705,8 +705,8 @@ async function createDepsOptimizer(
705705
// Avoid waiting for this id, as it may be blocked by the rollup
706706
// bundling process of the worker that also depends on the optimizer
707707
registeredIds = registeredIds.filter((registered) => registered.id !== id)
708-
if (waitingOn === id) {
709-
waitingOn = undefined
708+
if (waitingOn.has(id)) {
709+
waitingOn.delete(id)
710710
runOptimizerWhenIdle()
711711
}
712712
}
@@ -719,32 +719,48 @@ async function createDepsOptimizer(
719719
}
720720
}
721721

722-
function runOptimizerWhenIdle() {
723-
if (!waitingOn) {
724-
const next = registeredIds.pop()
725-
if (next) {
726-
waitingOn = next.id
727-
const afterLoad = () => {
728-
waitingOn = undefined
729-
if (!closed && !workersSources.has(next.id)) {
730-
if (registeredIds.length > 0) {
731-
runOptimizerWhenIdle()
732-
} else {
733-
onCrawlEnd()
734-
}
735-
}
736-
}
737-
next
738-
.done()
739-
.then(() => {
740-
setTimeout(
741-
afterLoad,
742-
registeredIds.length > 0 ? 0 : runOptimizerIfIdleAfterMs,
743-
)
744-
})
745-
.catch(afterLoad)
722+
async function runOptimizerWhenIdle() {
723+
if (waitingOn.size > 0) return
724+
725+
const processingRegisteredIds = registeredIds
726+
registeredIds = []
727+
728+
const donePromises = processingRegisteredIds.map(async (registeredId) => {
729+
waitingOn.add(registeredId.id)
730+
try {
731+
await registeredId.done()
732+
} finally {
733+
waitingOn.delete(registeredId.id)
734+
}
735+
})
736+
737+
const afterLoad = () => {
738+
if (closed) return
739+
if (
740+
registeredIds.length > 0 &&
741+
registeredIds.every((registeredId) =>
742+
workersSources.has(registeredId.id),
743+
)
744+
) {
745+
return
746+
}
747+
748+
if (registeredIds.length > 0) {
749+
runOptimizerWhenIdle()
750+
} else {
751+
onCrawlEnd()
746752
}
747753
}
754+
755+
const results = await Promise.allSettled(donePromises)
756+
if (
757+
registeredIds.length > 0 ||
758+
results.some((result) => result.status === 'rejected')
759+
) {
760+
afterLoad()
761+
} else {
762+
setTimeout(afterLoad, runOptimizerIfIdleAfterMs)
763+
}
748764
}
749765
}
750766

0 commit comments

Comments
 (0)
Please sign in to comment.