refactor(shiki): migrate to shiki/core with lazy initialization

- Replace shiki with shiki/core for better tree-shaking
- Change highlighter initialization to explicit theme/lang imports
- Export getHighlighter function instead of direct highlighter instance
- Add error handling for uninitialized highlighter access
This commit is contained in:
cfngc4594 2025-05-13 14:48:32 +08:00
parent 2efdc21419
commit cea0027799

View File

@ -1,25 +1,29 @@
import { MonacoTheme } from "@/types/monaco-theme"; import {
import { EditorLanguage } from "@/generated/client"; createHighlighterCore,
import { createHighlighter, Highlighter } from "shiki"; createOnigurumaEngine,
HighlighterCore,
} from "shiki";
// Get all values from the ProgrammingLanguage and Theme enums let highlighter: HighlighterCore;
const themes = Object.values(MonacoTheme);
const languages = [...Object.values(EditorLanguage), "markdown"];
// Use lazy initialization for highlighter const initHighlighter = async () => {
let highlighter: Highlighter; highlighter = await createHighlighterCore({
themes: [
const initializeHighlighter = async () => { import("@shikijs/themes/github-light-default"),
try { import("@shikijs/themes/github-dark-default"),
highlighter = await createHighlighter({ ],
themes: themes, // Use all values from the Theme enum langs: [import("@shikijs/langs/c"), import("@shikijs/langs/cpp")],
langs: languages, // Use all values from the ProgrammingLanguage enum engine: createOnigurumaEngine(import("shiki/wasm")),
}); });
} catch (error) { };
console.error("Error initializing highlighter:", error);
}
}
initializeHighlighter(); initHighlighter();
export { highlighter }; export const getHighlighter = () => {
if (!highlighter) {
throw new Error(
"Highlighter not initialized yet! Call initHighlighter() first."
);
}
return highlighter;
};