From b4e7554608764540ec64ceae4c5fcee65baf2d5e Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 30 Jul 2026 03:14:28 +0530 Subject: [PATCH] refactor(markdown): make processIncludes async Resolve includes through replaceAsync and fs/promises so include files are read without blocking the event loop while pages render concurrently. Co-Authored-By: Claude Fable 5 --- src/node/markdownToVue.ts | 2 +- src/node/plugins/localSearchPlugin.ts | 2 +- src/node/utils/processIncludes.ts | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/node/markdownToVue.ts b/src/node/markdownToVue.ts index f26f31d4..187657f8 100644 --- a/src/node/markdownToVue.ts +++ b/src/node/markdownToVue.ts @@ -138,7 +138,7 @@ export async function createMarkdownToVueRenderFn( // resolve includes let includes: string[] = [] - src = processIncludes(md, srcDir, src, fileOrig, includes, cleanUrls) + src = await processIncludes(md, srcDir, src, fileOrig, includes, cleanUrls) const localeIndex = getLocaleForPath(siteConfig?.site, relativePath) diff --git a/src/node/plugins/localSearchPlugin.ts b/src/node/plugins/localSearchPlugin.ts index 472c4b18..65a9b1d8 100644 --- a/src/node/plugins/localSearchPlugin.ts +++ b/src/node/plugins/localSearchPlugin.ts @@ -59,7 +59,7 @@ export async function localSearchPlugin( } throw e }) - const src = processIncludes(md, srcDir, raw, file, [], cleanUrls) + const src = await processIncludes(md, srcDir, raw, file, [], cleanUrls) if (options._render) { return options._render(src, env, md) } else { diff --git a/src/node/utils/processIncludes.ts b/src/node/utils/processIncludes.ts index 62de0dd8..09eb62a3 100644 --- a/src/node/utils/processIncludes.ts +++ b/src/node/utils/processIncludes.ts @@ -1,6 +1,6 @@ import matter from 'gray-matter' -import type { MarkdownItAsync } from 'markdown-it-async' -import fs from 'node:fs' +import { replaceAsync, type MarkdownItAsync } from 'markdown-it-async' +import { readFile } from 'node:fs/promises' import path from 'node:path' import { findRegion } from '../markdown/plugins/snippet' import { slash, type MarkdownEnv } from '../shared' @@ -12,12 +12,12 @@ export function processIncludes( file: string, includes: string[], cleanUrls: boolean -): string { +): Promise { const includesRE = //g const regionRE = /(#[^\s\{]+)/ const rangeRE = /\{(\d*),(\d*)\}$/ - return src.replace(includesRE, (m: string, m1: string) => { + return replaceAsync(src, includesRE, async (m: string, m1: string) => { if (!m1.length) return m const range = m1.match(rangeRE) @@ -36,7 +36,7 @@ export function processIncludes( ? path.join(srcDir, m1.slice(m1[1] === '/' ? 2 : 1)) : path.join(path.dirname(file), m1) - let content = fs.readFileSync(includePath, 'utf8') + let content = await readFile(includePath, 'utf8') if (region) { const [regionName] = region