Skip to content

Commit 5c10f25

Browse files
authoredJan 20, 2025
fix(rehype): improve lazy performance (#896)
1 parent e86ca5f commit 5c10f25

File tree

1 file changed

+30
-29
lines changed

1 file changed

+30
-29
lines changed
 

‎packages/rehype/src/core.ts

+30-29
Original file line numberDiff line numberDiff line change
@@ -86,24 +86,7 @@ function rehypeShikiFromHighlighter(
8686

8787
return (tree) => {
8888
// use this queue if lazy is enabled
89-
const languageQueue: string[] = []
90-
const queue: (() => void)[] = []
91-
92-
function getLanguage(lang: string | undefined): string | undefined {
93-
if (!lang)
94-
return defaultLanguage
95-
96-
if (highlighter.getLoadedLanguages().includes(lang) || isSpecialLang(lang))
97-
return lang
98-
99-
if (lazy) {
100-
languageQueue.push(lang)
101-
return lang
102-
}
103-
104-
if (fallbackLanguage)
105-
return fallbackLanguage
106-
}
89+
const queue: Promise<void>[] = []
10790

10891
visit(tree, 'element', (node, index, parent) => {
10992
let handler: RehypeShikiHandler | undefined
@@ -127,7 +110,23 @@ function rehypeShikiFromHighlighter(
127110
if (!res)
128111
return
129112

130-
const lang = getLanguage(res.lang)
113+
let lang: string | undefined
114+
let lazyLoad = false
115+
116+
if (!res.lang) {
117+
lang = defaultLanguage
118+
}
119+
else if (highlighter.getLoadedLanguages().includes(res.lang) || isSpecialLang(res.lang)) {
120+
lang = res.lang
121+
}
122+
else if (lazy) {
123+
lazyLoad = true
124+
lang = res.lang
125+
}
126+
else if (fallbackLanguage) {
127+
lang = fallbackLanguage
128+
}
129+
131130
if (!lang)
132131
return
133132

@@ -145,24 +144,26 @@ function rehypeShikiFromHighlighter(
145144
}
146145
}
147146

148-
parent.children.splice(index, 1, ...fragment.children)
147+
parent.children[index] = fragment as any
149148
}
150149

151-
if (lazy)
152-
queue.push(processNode)
153-
else
150+
if (lazyLoad) {
151+
queue.push(highlighter.loadLanguage(lang).then(() => processNode()))
152+
}
153+
else {
154154
processNode()
155+
}
155156

156157
// don't visit processed nodes
157158
return 'skip'
158159
})
159160

160-
if (lazy) {
161-
return highlighter
162-
.loadLanguage(...languageQueue)
163-
.then(() => {
164-
queue.forEach(fn => fn())
165-
})
161+
if (queue.length > 0) {
162+
async function run(): Promise<void> {
163+
await Promise.all(queue)
164+
}
165+
166+
return run()
166167
}
167168
}
168169
}

0 commit comments

Comments
 (0)