fix(export): Shiki 语言包改字面量动态导入,修复打包警告与加载风险

This commit is contained in:
2026-11-14 12:34:47 +08:00
parent dc78bb0e2a
commit 9113bea007

View File

@@ -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<import('shiki').HighlighterCore> {
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],