diff --git a/src/services/exportHtml.ts b/src/services/exportHtml.ts index eacaad4..900e698 100644 --- a/src/services/exportHtml.ts +++ b/src/services/exportHtml.ts @@ -243,6 +243,34 @@ const EXPORT_LANGS = [ 'csharp', 'sql', 'yaml', 'xml', 'diff', 'ini', ] as const +/** 每个语言用字面量 import 声明:模板拼接的 import(`.../${name}`) Vite 无法分析, + * 打包后会原样保留裸模块说明符导致高亮加载失败;字面量写法可正常分块、按需加载。 */ +const LANG_LOADERS: Record<(typeof EXPORT_LANGS)[number], () => Promise<{ default: import('@shikijs/types').LanguageRegistration[] }>> = { + javascript: () => import('@shikijs/langs/javascript'), + typescript: () => import('@shikijs/langs/typescript'), + tsx: () => import('@shikijs/langs/tsx'), + jsx: () => import('@shikijs/langs/jsx'), + json: () => import('@shikijs/langs/json'), + html: () => import('@shikijs/langs/html'), + css: () => import('@shikijs/langs/css'), + markdown: () => import('@shikijs/langs/markdown'), + bash: () => import('@shikijs/langs/bash'), + shell: () => import('@shikijs/langs/shell'), + powershell: () => import('@shikijs/langs/powershell'), + python: () => import('@shikijs/langs/python'), + java: () => import('@shikijs/langs/java'), + go: () => import('@shikijs/langs/go'), + rust: () => import('@shikijs/langs/rust'), + c: () => import('@shikijs/langs/c'), + cpp: () => import('@shikijs/langs/cpp'), + csharp: () => import('@shikijs/langs/csharp'), + sql: () => import('@shikijs/langs/sql'), + yaml: () => import('@shikijs/langs/yaml'), + xml: () => import('@shikijs/langs/xml'), + diff: () => import('@shikijs/langs/diff'), + ini: () => import('@shikijs/langs/ini'), +} + /** * Shiki 高亮器:用 core + JavaScript 正则引擎(不用 Oniguruma WASM—— * WASM 加载依赖 fetch/stream,在部分 WebView/测试环境会失败,JS 引擎 everywhere 可用)。 @@ -254,7 +282,7 @@ function loadHighlighter(): Promise { const { createJavaScriptRegexEngine } = await import('shiki/engine/javascript') const theme = (await import('@shikijs/themes/github-light')).default const langs = await Promise.all( - EXPORT_LANGS.map(async (name) => (await import(`@shikijs/langs/${name}`)).default), + EXPORT_LANGS.map(async (name) => (await LANG_LOADERS[name]()).default), ) return createHighlighterCore({ themes: [theme],