捆绑包
主要的 shiki 包入点通过动态导入捆绑了所有支持的主题和语言。大多数情况下,效率应该不成问题,因为语法只有在需要时才会被导入或下载。然而,当你将 shiki 捆绑到浏览器运行时或 Web Worker 中时,即使这些文件没有被导入,它们仍然会增加你的分发大小。我们提供了细粒度捆绑以帮助你根据需要逐个组合语言和主题。
捆绑包预设
方便起见,我们还提供了一些预制的捆绑包供你使用。
shiki/bundle/full
捆绑包大小:6.4 MB (压缩后),1.3 MB (gzip),包含异步块
与 shiki 相同,这个捆绑包捆绑了所有的主题和语言。
shiki/bundle/web
捆绑包大小:4.2 MB (压缩后),748 KB (gzip),包含异步块
这个捆绑包捆绑了所有的主题和一些常见的 Web 语言(例如 HTML、CSS、JS、TS、JSON 和 Markdown 等)以及一些框架语法(例如 Vue、JSX 和 Svelte 等)的支持。
该捆绑包中可以使用 shiki 的所有功能。
ts
import {
BundledLanguage,
BundledTheme,
codeToHtml,
createHighlighter
} from 'shiki/bundle/web'
const highlighter = await createHighlighter({
langs: ['html', 'css', 'js'],
themes: ['github-dark', 'github-light'],
})细粒度捆绑
当导入 shiki 时,所有的主题和语言都会作为异步块被捆绑。通常这对你来说不会是问题,因为如果你不使用它们,它们不会被加载。在某些情况下,如果你想控制要捆绑的内容,你可以使用核心并自己组合捆绑包。
ts
// 直接导入主题和语言模块,只有你导入的才会被捆绑。
import nord from '@shikijs/themes/nord'
// `shiki/core` 入口不包含任何主题、语言或 wasm 二进制文件。
import { createHighlighterCore } from 'shiki/core'
import { createOnigurumaEngine } from 'shiki/engine/oniguruma'
const highlighter = await createHighlighterCore({
themes: [
// 你需要传入导入的模块,而不是字符串
nord,
// 或者动态导入以实现代码分割
import('@shikijs/themes/material-theme-ocean')
],
langs: [
import('@shikijs/langs/javascript'),
// shiki 会尝试与默认导出互操作
() => import('@shikijs/langs/css'),
// 或者返回自定义语法的 getter
async () => JSON.parse(await fs.readFile('my-grammar.json', 'utf-8'))
],
// `shiki/wasm` 包含了以 base64 字符串内嵌的 wasm 二进制。
engine: createOnigurumaEngine(import('shiki/wasm'))
})
// 可选,创建后加载主题和语言
await highlighter.loadTheme(import('@shikijs/themes/vitesse-light'))
const code = highlighter.codeToHtml('const a = 1', {
lang: 'javascript',
theme: 'material-theme-ocean'
})INFO
简写 只在捆绑包预设中可用。对于细粒度捆绑,你可以使用 createSingletonShorthands 自行创建简写,或者自行移植。