From a7372079817fb1a1e69b2632405d759f9c5e913d Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Sun, 16 Mar 2025 21:17:31 +0000
Subject: [PATCH] perf: incremental rebuild (--fastRebuild v2 but default) (#1841)
---
quartz/processors/parse.ts | 46 ++++++++++++++++++++++++++++++++++------------
1 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts
index 479313f..3a0d15a 100644
--- a/quartz/processors/parse.ts
+++ b/quartz/processors/parse.ts
@@ -7,12 +7,13 @@
import { MarkdownContent, ProcessedContent } from "../plugins/vfile"
import { PerfTimer } from "../util/perf"
import { read } from "to-vfile"
-import { FilePath, FullSlug, QUARTZ, slugifyFilePath } from "../util/path"
+import { FilePath, QUARTZ, slugifyFilePath } from "../util/path"
import path from "path"
import workerpool, { Promise as WorkerPromise } from "workerpool"
import { QuartzLogger } from "../util/log"
import { trace } from "../util/trace"
-import { BuildCtx } from "../util/ctx"
+import { BuildCtx, WorkerSerializableBuildCtx } from "../util/ctx"
+import chalk from "chalk"
export type QuartzMdProcessor = Processor<MDRoot, MDRoot, MDRoot>
export type QuartzHtmlProcessor = Processor<undefined, MDRoot, HTMLRoot>
@@ -175,21 +176,42 @@
process.exit(1)
}
- const mdPromises: WorkerPromise<[MarkdownContent[], FullSlug[]]>[] = []
- for (const chunk of chunks(fps, CHUNK_SIZE)) {
- mdPromises.push(pool.exec("parseMarkdown", [ctx.buildId, argv, chunk]))
+ const serializableCtx: WorkerSerializableBuildCtx = {
+ buildId: ctx.buildId,
+ argv: ctx.argv,
+ allSlugs: ctx.allSlugs,
+ allFiles: ctx.allFiles,
+ incremental: ctx.incremental,
}
- const mdResults: [MarkdownContent[], FullSlug[]][] =
- await WorkerPromise.all(mdPromises).catch(errorHandler)
- const childPromises: WorkerPromise<ProcessedContent[]>[] = []
- for (const [_, extraSlugs] of mdResults) {
- ctx.allSlugs.push(...extraSlugs)
+ const textToMarkdownPromises: WorkerPromise<MarkdownContent[]>[] = []
+ let processedFiles = 0
+ for (const chunk of chunks(fps, CHUNK_SIZE)) {
+ textToMarkdownPromises.push(pool.exec("parseMarkdown", [serializableCtx, chunk]))
}
+
+ const mdResults: Array<MarkdownContent[]> = await Promise.all(
+ textToMarkdownPromises.map(async (promise) => {
+ const result = await promise
+ processedFiles += result.length
+ log.updateText(`text->markdown ${chalk.gray(`${processedFiles}/${fps.length}`)}`)
+ return result
+ }),
+ ).catch(errorHandler)
+
+ const markdownToHtmlPromises: WorkerPromise<ProcessedContent[]>[] = []
+ processedFiles = 0
for (const [mdChunk, _] of mdResults) {
- childPromises.push(pool.exec("processHtml", [ctx.buildId, argv, mdChunk, ctx.allSlugs]))
+ markdownToHtmlPromises.push(pool.exec("processHtml", [serializableCtx, mdChunk]))
}
- const results: ProcessedContent[][] = await WorkerPromise.all(childPromises).catch(errorHandler)
+ const results: ProcessedContent[][] = await Promise.all(
+ markdownToHtmlPromises.map(async (promise) => {
+ const result = await promise
+ processedFiles += result.length
+ log.updateText(`markdown->html ${chalk.gray(`${processedFiles}/${fps.length}`)}`)
+ return result
+ }),
+ ).catch(errorHandler)
res = results.flat()
await pool.terminate()
--
Gitblit v1.10.0