code-editor.tsx
概述
基于 Monaco Editor 的代码编辑器组件,为书籍内容提供语法高亮、代码展示和复制功能。支持主题自适应和多种编程语言。
组件
CodeEditor
功能完整的代码编辑器展示组件。
Props:
| 属性 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
code | string | 是 | - | 要显示的代码内容 |
language | string | 是 | - | 编程语言(如 "typescript", "python", "json") |
filename | string | 否 | - | 文件名(显示在标题栏) |
功能特性:
- 语法高亮
- 基于 Monaco Editor - 支持多种编程语言 - 主题自适应(亮色/暗色)
- 标题栏
- 三色圆点(仿 Mac 窗口风格) - 文件名显示 - 语言标识 - 复制按钮
- 复制功能
- 一键复制代码到剪贴板 - 复制成功视觉反馈(2秒)
- 主题自适应
- 自动检测系统主题 - 监听主题变化(MutationObserver) - 暗色:vs-dark 主题 + 深色背景 - 亮色:light 主题 + 白色背景
- 智能高度
- 根据代码行数自动计算高度 - 最小高度保证 - 最大高度限制(400px) - 隐藏垂直滚动条
使用示例:
import { CodeEditor } from "@/components/book/elements/code-editor";
// TypeScript 示例
<CodeEditor
language="typescript"
filename="types.ts"
code={`interface User {
id: string;
name: string;
email: string;
}`}
/>
// Python 示例
<CodeEditor
language="python"
filename="example.py"
code={`def greet(name: str) -> str:
return f"Hello, {name}!"`}
/>
// JSON 示例
<CodeEditor
language="json"
code={JSON.stringify({ name: "AI", version: "1.0" }, null, 2)}
/>
Monaco Editor 配置
{
readOnly: true, // 只读模式
minimap: { enabled: false }, // 禁用缩略图
scrollBeyondLastLine: false, // 不滚动超过最后一行
fontSize: 13, // 字体大小
lineNumbers: "off", // 关闭行号
folding: false, // 关闭代码折叠
lineDecorationsWidth: 12, // 行装饰宽度
lineNumbersMinChars: 0, // 行号最小字符
renderLineHighlight: "none", // 不高亮当前行
scrollbar: {
vertical: "hidden", // 隐藏垂直滚动条
horizontal: "auto" // 自动水平滚动条
},
overviewRulerLanes: 0, // 概览标尺通道
hideCursorInOverviewRuler: true, // 隐藏光标
overviewRulerBorder: false, // 隐藏概览标尺边框
contextmenu: false, // 禁用右键菜单
padding: { top: 12, bottom: 12 }, // 内边距
}
主题配色
暗色主题
| 元素 | 颜色值 |
|---|---|
| 容器背景 | #1e1e1e |
| 标题栏背景 | #252526 |
| 标题栏边框 | #3c3c3c |
| 按钮背景 | #3c3c3c |
| 按钮文字 | #cccccc |
| 语言标签 | #6e6e6e |
亮色主题
| 元素 | 颜色值 |
|---|---|
| 容器背景 | #ffffff |
| 标题栏背景 | #f3f3f3 |
| 标题栏边框 | #e0e0e0 |
| 按钮背景 | #e0e0e0 |
| 按钮文字 | #333333 |
| 语言标签 | #999999 |
依赖
| 依赖 | 用途 |
|---|---|
@monaco-editor/react | Monaco Editor React 封装 |
react - useState, useEffect | 状态和生命周期 |
lucide-react - Copy, Check | 复制图标 |
@/lib/utils - cn | 类名合并 |
注意事项
- 动态导入 - Monaco Editor 是动态加载的,首次渲染可能有延迟
- SSR 兼容 - 组件使用
"use client"指令,避免服务端渲染问题 - 语言支持 - 确保 Monaco Editor 支持所需语言(常用语言已内置)
- 性能考虑 - 大文件渲染时注意性能影响