文章

FIELD NOTE

语法高亮与代码块

Shiki 双主题高亮、复制按钮、语言标签和横向滚动提示的使用说明。

1 分钟读完技术写作

正文宽度每行约 49 字

正文宽度:标准,每行约 49 字。当前选项。点击轨道档位可直接调整,点击右侧按钮切换为宽。

语法高亮

代码块用 Shiki 在构建期高亮,语法树来自 TextMate 语法定义,和 VS Code 同一套引擎。 支持 ts、tsx、js、jsx、json、bash、css、html、md、mdx、python、rust 等常用语言, 不写语言标记时会尝试自动识别。

明暗双主题

同一段代码会同时输出两套颜色:

  • 浅色系统用 github-light
  • 深色系统用 github-dark

切换配色纯靠CSS,不加载任何 JavaScript,也不会闪烁。

复制按钮

鼠标移到代码块上,右上角会出现「复制」按钮,点击后变成「已复制」, 两秒后自动恢复。键盘用户按 Tab 聚焦到代码块时按钮也会常驻显示, 不会出现「看不到按钮就没法复制」的情况。

注意:浏览器的剪贴板 API 只在 HTTPS 或 localhost 下可用。 用局域网 IP 以 http 访问时复制会静默失败,这时仍可以手动选中复制。

语言标签

左上角显示语言名,纯装饰,不占额外空间。

横向滚动提示

代码超出宽度时可以横向滚动,右侧会出现渐变遮罩提示还有内容。 实测一段很长的配置:

ts
export const config = {
  server: { port: 3000, host: "0.0.0.0" },
  experimental: { optimizePackageImports: ["lucide-react", "date-fns", "@/lib/utils"] },
  images: { formats: ["image/avif", "image/webp"], minimumCacheTTL: 14400 },
  async redirects() { return [{ source: "/old-blog", destination: "/blog", permanent: true }] },
} satisfies Record<string, unknown>

不写语言会怎样

没有语言标记时,Shiki 会当作纯文本处理,不着色:

这是一段纯文本代码块
不会被着色
但依然有复制按钮和边框