From e2d83b94c0aa508cb036762548e6764b7c5ef83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Sun, 18 Oct 2026 10:35:55 -0300 Subject: [PATCH] perf(legacy-html): stop re-parsing shiki themes per code block --- .changeset/legacy-html-shiki-themes.md | 5 +++++ .../node-legacy/src/legacy-html/plugins/shiki.mjs | 11 ++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 .changeset/legacy-html-shiki-themes.md diff --git a/.changeset/legacy-html-shiki-themes.md b/.changeset/legacy-html-shiki-themes.md new file mode 100644 index 00000000..3f1f29aa --- /dev/null +++ b/.changeset/legacy-html-shiki-themes.md @@ -0,0 +1,5 @@ +--- +'@node-core/doc-kit-legacy': patch +--- + +`legacy-html` builds about 30% faster: Shiki no longer parses its themes again for every code block. diff --git a/packages/node-legacy/src/legacy-html/plugins/shiki.mjs b/packages/node-legacy/src/legacy-html/plugins/shiki.mjs index 90b559cc..fd7852e7 100644 --- a/packages/node-legacy/src/legacy-html/plugins/shiki.mjs +++ b/packages/node-legacy/src/legacy-html/plugins/shiki.mjs @@ -5,7 +5,11 @@ import shikiConfig from '@doc-kit/core/shiki.config.mjs'; import { h as createElement } from 'hastscript'; import { SKIP, visit } from 'unist-util-visit'; -const highlighter = await createHighlighter(); +const [lightTheme, darkTheme] = shikiConfig.themes; + +const highlighter = await createHighlighter({ + themes: { light: lightTheme, dark: darkTheme }, +}); // This is what Remark will use as prefix within a
 className
 // to attribute the current language of the 
 element
@@ -93,8 +97,9 @@ export default function rehypeShikiji() {
         preElement.children[0].value,
         {
           lang: highlighter.resolveLanguage(languageId),
-          // Allows support for dual themes (light, dark) for Shiki
-          themes: { light: shikiConfig.themes[0], dark: shikiConfig.themes[1] },
+          // Allows support for dual themes (light, dark) for Shiki. Given by
+          // name, as Shiki parses a theme object again for every highlight
+          themes: { light: lightTheme.name, dark: darkTheme.name },
         }
       );