Files
mengyanote/README.md
2025-12-19 15:51:26 +08:00

418 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 萌芽笔记 🌱
一个优雅的 Markdown 笔记 Web 应用,支持实时预览和 GitHub 风格渲染。
> **🎉 v2.0 重要更新 (2025-12-19)**
> - ✅ 完全移除 localStorage 依赖,解决浏览器权限弹窗问题
> - ✅ 完美支持移动端浏览器微信、Safari iOS 等)
> - ✅ 隐私模式/无痕模式下正常工作
> - ✅ 添加错误边界和友好的错误提示
> - ✅ 优化网络请求,支持相对路径部署
> - 📖 详细说明请查看 [前端优化说明.md](前端优化说明.md)
## ✨ 特性
- 📝 **Markdown 渲染**: 使用 `react-markdown` 提供强大的渲染能力
- 🎨 **GitHub 风格**: 标准的 GitHub Markdown 样式
- 🔤 **霞鹜文楷字体**: 全站使用 LXGW WenKai Mono 等宽字体
- 📂 **文件树导航**: 直观的侧边栏目录结构
- 🚀 **快速响应**: FastAPI 后端 + React 前端
- 💡 **代码高亮**: 支持多种编程语言的语法高亮
- 🧮 **数学公式**: KaTeX 数学公式渲染支持
- 📱 **响应式设计**: 完美适配桌面和移动设备
- 🌐 **跨浏览器兼容**: 支持所有主流浏览器和移动端
- 🔒 **隐私模式支持**: 在隐私/无痕模式下正常工作
## 🛠 技术栈
### 后端
- **Python 3.8+**
- **FastAPI** - 现代、快速的 Web 框架
- **Uvicorn** - ASGI 服务器
### 前端
- **React 19** - 用户界面库
- **Vite 7** - 极速构建工具
- **react-markdown** - Markdown 渲染
- **github-markdown-css** - GitHub 风格样式
- **rehype/remark 插件** - 扩展 Markdown 功能
- GFM (GitHub Flavored Markdown)
- 代码高亮 (highlight.js)
- 数学公式 (KaTeX)
- HTML 支持
## 🚀 快速开始
### 方式一使用批处理脚本Windows推荐
#### 启动后端
双击运行 `启动后端.bat`
#### 启动前端
双击运行 `启动前端.bat`
### 方式二:手动启动
#### 1. 启动后端服务
```bash
# 进入后端目录
cd mengyanote-backend
# 安装依赖(首次运行)
pip install -r requirements.txt
# 启动服务
python main.py
```
后端将在 `http://localhost:8000` 运行
#### 2. 启动前端服务
```bash
# 进入前端目录
cd mengyanote-frontend
# 安装依赖(首次运行)
npm install
# 启动开发服务器
npm run dev
```
前端将在 `http://localhost:5173` 运行
## 📁 项目结构
```
mengyanote/
├── mengyanote-backend/ # 后端服务
│ ├── main.py # FastAPI 应用入口
│ ├── requirements.txt # Python 依赖
│ └── mengyanote/ # Markdown 文件存储目录
│ ├── 编程语言/
│ ├── 计算机科普/
│ ├── 计算机网络/
│ └── ...
├── mengyanote-frontend/ # 前端应用
│ ├── src/
│ │ ├── components/ # React 组件
│ │ │ ├── Sidebar.jsx # 侧边栏组件
│ │ │ ├── MarkdownRenderer.jsx # Markdown 渲染器
│ │ │ └── ...
│ │ ├── context/ # React Context
│ │ ├── utils/ # 工具函数
│ │ ├── App.jsx # 主应用组件
│ │ └── main.jsx # 应用入口
│ ├── public/ # 静态资源
│ │ └── LXGWWenKaiMono-Medium.ttf # 字体文件
│ ├── package.json # 前端依赖
│ └── vite.config.js # Vite 配置
├── 启动后端.bat # 后端启动脚本
├── 启动前端.bat # 前端启动脚本
├── 启动说明.md # 详细启动说明
└── README.md # 项目说明
```
## 🎯 功能说明
### 后端 API
- `GET /api/tree` - 获取文件树结构
- `GET /api/file?path={path}` - 获取指定文件内容
- `GET /api/health` - 健康检查
- `GET /docs` - API 文档Swagger UI
### 前端功能
- **文件导航**: 点击左侧文件树浏览笔记
- **Markdown 渲染**: 自动渲染 GitHub 风格的 Markdown
- **代码高亮**: 自动识别并高亮代码块
- **数学公式**: 支持行内和块级数学公式
- **图片支持**: 点击图片可放大查看
- **外链处理**: 外部链接自动在新标签页打开
## 🎨 字体配置
项目使用 **霞鹜文楷等宽体 (LXGW WenKai Mono)** 作为全站字体。
字体文件位置:`mengyanote-frontend/public/LXGWWenKaiMono-Medium.ttf`
如果字体文件缺失,系统会自动回退到默认字体。
## 🔧 环境变量
### 前端环境变量(可选)
`mengyanote-frontend` 目录创建 `.env` 文件:
```env
VITE_API_BASE=http://localhost:8000
```
## 📦 构建生产版本
### 前端构建
```bash
cd mengyanote-frontend
npm run build
```
构建产物在 `dist` 目录,可部署到任何静态托管服务。
## 🐛 故障排除
### 前端无法连接后端
1. 确认后端服务正在运行(访问 http://localhost:8000/api/health
2. 检查浏览器控制台的网络请求错误
3. 确认后端端口为 8000
### 字体未加载
1. 确认 `LXGWWenKaiMono-Medium.ttf` 存在于 `public` 目录
2. 检查浏览器开发者工具的网络面板
3. 清除浏览器缓存重试
### Markdown 渲染异常
1. 检查文件编码是否为 UTF-8
2. 查看浏览器控制台错误信息
3. 确认 react-markdown 相关依赖已正确安装
## 📝 开发建议
1. **IDE**: 推荐使用 VS Code
2. **代码规范**: 前端使用 ESLint 进行代码检查
3. **热重载**: 后端和前端都支持热重载,修改代码自动刷新
4. **调试**: 使用 Chrome DevTools 进行前端调试
---
**Made with ❤️ by 树萌芽**
## 🛠 技术栈
- React 19 + Hooks + Context
- Vite 构建
- react-markdown + remark / rehype 插件:
- `remark-gfm`(扩展语法)
- `remark-math`(数学公式)
- `remark-breaks`(软换行)
- `rehype-raw`(允许原始 HTML 渲染)
- `rehype-katex`(数学公式渲染)
- `rehype-highlight`(代码高亮)
- Highlight.js 默认主题(可替换)
- KaTeX 样式(按需可移除)
所有数据生成逻辑在 **Node 脚本层** 完成,前端只做纯渲染,部署安全轻量。
## ⚡ 快速开始Windows / cmd.exe
1. 安装依赖
```
npm install
```
2. 本地开发(会先生成静态数据)
```
npm run dev
```
这会先执行 `node scripts/generateData.js``public/mengyanote` 读取 Markdown 并生成 `src/data` 下的 `directoryTree.json` / `fileContents.json` / `stats.json`,然后启动 Vite 开发服务器。
3. 生成生产构建
```
npm run build
```
4. 预览构建产物
```
npm run preview
```
5. 单独生成数据(不启动服务器)
```
npm run generate-data
```
6. 代码检查
```
npm run lint
```
## 🧬 项目结构(重要文件/目录)
- `public/mengyanote/` - 源 Markdown 笔记目录(请把你的 .md 文件放在这里以纳入站点)。
- `scripts/generateData.js` - 将 Markdown 文件读取并生成 `src/data` 的脚本。
- `src/data/` - 由脚本生成的 JSON 数据(目录树、文件内容、统计信息)。
- `src/components/MarkdownRenderer.jsx` - Markdown 渲染组件(样式与功能定制点)。
- `src/components/MarkdownRenderer.css` - Markdown 渲染相关样式(可在此处简化或替换为你喜欢的样式)。
- `src/components/Sidebar.jsx` - 侧边栏目录树组件。
- `src/context/AppContext.jsx` - 全局上下文与路由状态。
- `scripts/` - 工具脚本(目前包含 `generateData.js`)。
示例:如果你想让 Markdown 渲染更简洁(“换成我图片那种”样式),可以编辑 `src/components/MarkdownRenderer.css` 或直接修改 `MarkdownRenderer.jsx` 中的渲染类名/元素结构。
## ✍️ 如何编辑/添加笔记
1.`public/mengyanote` 下增加或修改 `.md` 文件,保持目录组织即可。
2. 运行 `npm run generate-data`(或 `npm run dev`)以重新生成 `src/data`
3. 刷新浏览器查看最新内容。
### 忽略机制
- 默认忽略:`.obsidian``.trash``.git``node_modules`、所有以 `.` 开头的文件或目录。
- 自定义忽略:在 `public/mengyanote/ignore.json` 中加入:
```jsonc
{
"ignore": ["临时", "草稿.md", "private"]
}
```
> ignore.json 位于源根目录(`public/mengyanote`),脚本运行时会打印“已加载忽略配置”。
## 🚢 部署建议
- 静态站点:`npm run build` 会在 `dist/` 生成静态文件,适合部署到 GitHub Pages、Netlify、Vercel、或任意静态文件托管服务。
- GitHub Pages构建后将 `dist/` 的内容发布到 gh-pages 分支或通过 GitHub Actions 自动发布。
示例(手工):
1. 构建
```
npm run build
```
2.`dist/` 内容上传到你的静态托管服务或 gh-pages 分支。
如果需要,我可以为你添加一个自动部署到 GitHub Pages 的 GitHub Actions 工作流(`deploy.yml`)。示例工作流会:
1. 触发条件:`push``main` 或手动触发
2. 安装依赖 & 运行 `npm run build`
3. 发布 `dist/``gh-pages` 分支
(如需请开 Issue 或在 PR 中请求)
### 其他托管方式
| 平台 | 方式 | 备注 |
|------|------|------|
| GitHub Pages | gh-pages 分支 / Action | 需启用 Pages |
| Netlify | 直接连接仓库 | Build 命令:`npm run build`Publish`dist` |
| Vercel | 导入项目 | 自动识别 Vite |
| OSS / Nginx | 上传 dist | 纯静态即可 |
### 基础 Nginx 配置示例
```nginx
server {
listen 80;
server_name example.com;
root /var/www/markdown-to-web/dist;
location / { try_files $uri /index.html; }
add_header Cache-Control "public, max-age=31536000";
}
```
## 🎨 定制渲染样式
如果你觉得当前 Markdown 美化太重并想改回更简洁的“图片优先”或原始样式:
- 编辑 `src/components/MarkdownRenderer.css`:移除或覆盖过度的样式(字体、背景、代码块高亮等)。
- 编辑 `src/components/MarkdownRenderer.jsx`:调整渲染器的 className、元素包装或忽略某些 remark/rehype 插件。
### 常见修改点
| 需求 | 修改位置 | 说明 |
|------|----------|------|
| 去掉公式支持 | `MarkdownRenderer.jsx` | 移除 `remark-math` / `rehype-katex` 并删 CSS 引入 |
| 去掉代码高亮 | `MarkdownRenderer.jsx` | 移除 `rehype-highlight` 与对应样式 |
| 禁用内联代码特殊样式 | 已内置 | 自定义插件 `remarkDisableInlineCode` 已将 inlineCode 转普通文本 |
| 改图片最大宽度 | `MarkdownRenderer.css` | 调整 `.markdown-image img` |
| 更换高亮主题 | 安装新主题 | 引入其他 highlight.js CSS |
| 调整面包屑 | `fileUtils.generateBreadcrumbs` | 可改分隔符或格式 |
### 架构 / 数据流程简述
```
┌──────────────┐ 扫描/过滤 ┌────────────────┐ JSON写入 ┌───────────────┐
│ public/mengya │ ─────────────▶ │ generateData.js │ ───────────▶ │ src/data/*.json │
│ note/ (原始MD)│ ignore.json │ (Node脚本) │ public/data │ (目录/内容/统计)│
└──────────────┘ └────────────────┘ └───────────────┘
前端 (React 渲染)
```
前端加载策略:尝试按顺序 fetch`/data/...``/src/data/...``./data/...`
### 渲染组件要点
- 代码块组件:支持复制、语言标签、降尾换行处理
- 图片:包裹 `<figure>` + `<figcaption>`
- 标题:自动生成 `id` + 锚点链接
- 链接:区分内部/外部,`[[wikilink]]` 保留为文本标签(可扩展)
- 表格:外层包裹 div 实现横向滚动容器
### 性能提示
- Markdown 数量巨大时,可按需拆分 lazy-load目前为一次性加载全部 JSON
- 可拓展为:构建阶段拆分单文件 JSON运行时按需请求
- 可增加 Service Worker 缓存静态 JSON
## ❓ 常见问题FAQ
**Q: 为什么我新增文件后页面没有显示?**
A: 需要重新运行 `npm run generate-data``npm run dev` 让脚本再生成数据。
**Q: 想忽略某个目录但它还是出现?**
A: 确认 `ignore.json` 位于 `public/mengyanote/` 根目录,键名是 `ignore`,数组项不要写路径前缀。
**Q: 能否按需加载而不是一次性加载所有内容?**
A: 当前实现为构建期大 JSON。可拓展为“每文件单独 JSON + 动态 fetch”。
**Q: 是否支持搜索?**
A: 目前未实现。可通过构建阶段生成反向索引lunr / minisearch再前端搜索。
**Q: 图片如何放大预览?**
A: 可在 `MarkdownRenderer.jsx` 中为 `img` 包裹 Lightbox 组件或添加点击事件。
**Q: 可以改成多语言站点?**
A: 可在数据生成脚本中区分语言目录(如 `en/``zh/`),渲染层添加语言切换上下文。
## 🧭 Roadmap计划
- [ ] 全文搜索(可选:关键词高亮)
- [ ] 按需加载:文件内容拆分
- [ ] 文件更新 diff / 最近更新列表
- [ ] Tag/Frontmatter 支持YAML 解析)
- [ ] RSS / JSON Feed 输出
- [ ] 导出 PDF / 打印优化
- [ ] Service Worker 缓存加速
- [ ] GitHub Actions 自动部署工作流示例
欢迎在 Issue 中补充你的需求。
## 🤝 贡献与许可
欢迎提交 Issue 或 Pull Request。仓库包含 `LICENSE`(请查看该文件以确认许可证类型)。
为了保持项目干净:
- 新功能请先创建 issue 讨论。
- 提交 PR 时附带简短说明和相关截图(如果是 UI 变更)。