alexishida/Moji
GitHub: alexishida/Moji
一个基于 Electron 和 React 构建的轻量级跨平台桌面应用,用于打开、阅读、编辑和导出 Markdown 文件。
Stars: 95 | Forks: 9
Moji
一个轻量、简洁的桌面应用,用于打开、阅读、编辑和导出 Markdown 文件。
基于 Electron、React、TypeScript 和 electron-vite 构建。
当前版本:v0.1.4
下载:
Windows
·
macOS (DMG)
·
Linux (AppImage)
·
Linux (DEB)
## 名称
**Moji (文字)** 在日语中的字面意思是“字母”、“字符”或“文字”。简短且易于记忆,让人联想到字符与书写。这个名字非常契合它的用途:顺畅地打开、编辑、预览和导出 Markdown——毫无干扰。
## 功能
- **打开 Markdown 文件**:通过文件对话框、拖放、CLI/文件关联入口以及单实例转发,支持 `.md` 和 `.markdown` 文件。
- **多文档工作区**:水平标签页、修改标记、关闭按钮、重复文件检测以及带有清晰操作图标的未保存更改确认。
- **标签页管理**:通过文档标签页菜单关闭其他标签页、右侧标签页、已保存标签页或所有标签页。
- **预览模式**:经过净化的 Markdown 渲染,支持标题锚点、大纲导航、表格、任务列表、脚注、定义列表、下标/上标、高亮/插入标记、emoji 短代码、通过 KaTeX 实现的 LaTeX 数学公式 (`$…$` 和 `$$…$$`)、链接化 (linkify)、排版工具 (typographer)、语法高亮代码以及代码块复制按钮。
- **图形和 Mermaid 图表**:由内置 Mermaid 支持的每一个有效围栏 `mermaid` 块都会渲染为响应式图表,包括流程图、时序图、甘特图、类图、ER 图、状态图和旅程图。点击任何渲染出的 SVG 或 Markdown 图像,可在模态框中检查它,支持缩放、拖动导航、小地图以及单独导出为 PNG;格式错误的 Mermaid 块仍作为可读代码块保留。
- **大纲导航**:在预览和编辑器模式下均可使用可折叠的标题树。预览模式使用滚动侦测;点击任意标题可滚动预览页面,或将编辑器光标移至其 Markdown 源码处。
- **查找和替换**:顶部栏搜索会高亮预览/编辑器中的匹配项,显示出现次数,跳转到下一个匹配项,并替换当前文档中的一个或所有匹配项。
- **编辑器模式**:基于 CodeMirror 6 的 Markdown 编辑器,支持行号、历史记录、自动换行、本地化的未命名文档名称、Markdown 格式快捷方式以及保存/另存为流程。
- **导出模式**:将当前文档导出为 HTML、PDF 或 PNG。PDF 支持 A4、Letter、Legal 尺寸以及纵向和横向;过长的代码行会在 PDF 和 PNG 导出中自动换行。
- **图表导出**:渲染后的 Mermaid 图表会作为独立的 SVG 嵌入到 HTML、PDF 和 PNG 导出文件中。
- **设置视图**:工作区内的居中面板,用于设置语言、预览排版以及本地化的快捷键参考。
- **关于视图**:工作区内的面板,显示应用名称、版本(来自 `package.json`)、作者、仓库链接以及名称背后的故事。
- **Markdown 指南**:内置的本地化参考文档 (`samples/markdown-guide.
.md`),可从状态栏打开。
- **最近文件**:欢迎屏幕显示最近打开的 Markdown 文件,并允许您重新打开或移除条目。
- **记忆应用状态**:窗口大小/位置、最近文件、上次使用的文件夹、语言、预览排版和 Markdown 预览主题会保存在用户设置中。
- **自动更新**:已安装的 Windows NSIS 和 Linux AppImage 构建版本会检查 GitHub Releases,显示下载进度,并且只在保护未保存的文档后才会重启。
- **Markdown 主题**:支持渲染后的 Markdown 暗色/亮色切换。应用界面始终保持暗色;导出文件始终使用亮色主题。
- **国际化**:支持英语、葡萄牙语(巴西)、西班牙语、日语、中文和俄语。初始语言会尽可能遵循操作系统设置,用户的选择会被保存。
- **安全性**:沙盒渲染器、上下文隔离、`nodeIntegration: false`、DOMPurify 净化,以及外部链接在操作系统浏览器中打开。
- **键盘快捷键**:常用的文件、搜索、替换、标签页、预览、导出、全屏和字体大小操作;设置中列出了所有可用的快捷键。
## 截图
## 安装
Windows 和 Linux 可以通过上方的下载链接直接安装,无需额外步骤。
### macOS
macOS 在首次打开 Moji 时会拒绝运行,提示它已损坏或 Apple 无法检查其是否包含恶意软件。**应用本身没有任何问题。** 对应用进行签名需要付费的 Apple Developer 账户,而 Moji 目前还没有,因此 macOS 会将其视为来自未知开发者的应用。
1. 将 **Moji** 从 DMG 拖入您的 **Applications**(应用程序)文件夹。
2. 双击它。macOS 会阻止它。关闭对话框。
3. 打开 **System Settings > Privacy & Security**(系统设置 > 隐私与安全性),滚动到 **Security**(安全性)部分,然后在关于 Moji 的消息旁边点击 **Open Anyway**(仍要打开)。
4. 确认。macOS 会记住此选择,因此每个版本只需执行一次此操作。
如果您更喜欢使用终端,清除隔离标志可以完全跳过这些提示:
```
xattr -dr com.apple.quarantine /Applications/Moji.app
```
缺少签名也是 macOS 上自动更新功能保持关闭的原因:请通过下载新的 DMG 来升级。一旦应用经过签名和公证,这两个限制就会消失。
## 环境要求
- Node.js `^20.19.0 || >=22.12.0`(Vite 7 和 electron-vite 5 所需;打包还需要 `require()` ES 模块,自 Node 22.12 起已无需标志即可使用)
- npm
## 开发
```
npm install
npm run dev
npm run typecheck
npm test
npm run build
```
实用脚本:
- `npm run dev`:启动带有热重载的 Electron。
- `npm run typecheck`:运行 TypeScript 检查而不输出文件。
- `npm test`:运行一次 Vitest 测试套件(使用 `npm run test:watch` 进入监听模式)。
- `npm run build`:将主进程、预加载脚本和渲染进程构建到 `out/` 目录。
- `npm run preview`:运行构建后的应用预览。
## 打包
```
npm run dist
npm run dist:win
npm run dist:linux
npm run dist:mac
```
生成物将写入 `release/`。
当前的打包目标:
- Windows:NSIS 安装程序,x64,支持自动更新。
- Linux:支持自动更新的 AppImage,以及用于手动安装的 deb。
- macOS:通用(Apple Silicon + Intel)DMG 和 ZIP,不支持自动更新。
`.md` 和 `.markdown` 的文件关联在 `electron-builder.yml` 中声明。
### macOS 构建
macOS 发行版**未进行代码签名或公证**,因为这需要付费的 Apple Developer 账户。由此带来的影响:
- 当从网络下载 DMG 时,Gatekeeper 会阻止该应用。用户可以通过 **System Settings > Privacy & Security > Open Anyway**(系统设置 > 隐私与安全性 > 仍要打开)打开它,或者使用 `xattr -dr com.apple.quarantine /Applications/Moji.app` 清除隔离标志。在 macOS 15 (Sequoia) 中,按住 Control 点击应用并选择 *打开* 的方法已失效,因为 [Apple 移除了该覆盖选项](https://developer.apple.com/news/?id=saqachfa)。面向用户的具体步骤详见[安装](#macos)。
- macOS 上的自动更新保持禁用状态。Squirrel.Mac 拒绝替换未签名的包,因此 `updater.ts` 在该平台会报告 `unsupported`,用户需要通过下载新的 DMG 来更新。
要在本地签名,请在钥匙串中安装 Apple Developer ID 证书,并移除 `CSC_IDENTITY_AUTO_DISCOVERY=false` 覆盖设置;`build/entitlements.mac.plist` 和 `hardenedRuntime` 已经为公证配置完毕。
### 发布新版本
1. 更新 `package.json` 和 `package-lock.json` 中的 `version`。
2. 提交更改,然后创建并推送匹配的标签,例如 `v0.2.0`。
3. `.github/workflows/release.yml` 会验证标签,然后按顺序构建 Windows、Linux 和 macOS 版本,并将每个平台的生成物上传到草稿状态的 Release 中。无需手动附加任何二进制文件。
4. 一旦 Windows 和 Linux 构建成功,工作流就会将 GitHub Release 设为公开:包括 NSIS、AppImage、DEB 以及 `latest.yml` / `latest-linux.yml` 更新元数据。
如果 Windows 或 Linux 构建失败,Release 将保持草稿状态。如果 macOS 失败则不会影响发布:发布步骤会等待 macOS 作业完成,因此 DMG 仍在上传时,Release 绝不会被设为公开,但发布过程也不要求 macOS 必须成功。macOS 是未签名的且处于次要地位,损坏的 DMG 不应阻碍优秀的 Windows 和 Linux 版本发布。不过,macOS 作业的失败仍会在工作流中清晰地显示出来。
`electron-updater` 仅在打包后的 Windows NSIS 构建和 Linux AppImages 中运行。开发和 deb 构建版本不会自动更新。AppImage 必须位于用户可写的目录中才能成功替换。Windows 生产环境发行版应通过 electron-builder 的签名环境变量使用 Authenticode 证书;切勿将证书凭据存储在代码仓库中。
## 项目结构
```
electron/
main.ts Window lifecycle, persisted bounds, file opening, single-instance flow, close guard, macOS application menu, IPC registration
preload.ts Safe renderer API exposed through contextBridge
shared.ts Shared IPC names, settings, export types, languages, recent-file limits, supported extensions
updater.ts GitHub release checks, update download state, and NSIS/AppImage installation
settings.ts User settings persistence, window bounds, recent files, preview theme, and last dialog directory
export.ts HTML/PDF/PNG export implementation with remembered output directory
png.ts Streaming PNG encoder used to keep tall-document exports within memory
src/
App.tsx Renderer state, document actions, close guard wiring, mode switching
components/ Top bar, tabs, sidebar, outline tree, preview, Mermaid viewer, editor, export/settings/about dialogs, confirm dialog, welcome view
lib/ Markdown rendering, Mermaid rendering, outline extraction, preview scroll-spy, export HTML, hooks
locales/ en, pt-BR, es, ja, zh, ru translation files
styles/ Theme tokens, app shell CSS, Markdown preview CSS
samples/ Bundled Markdown documents (full Markdown guide)
```
## 文档
- `.ai-framework/RULES.md`:AI 辅助修改的项目规则。
- `.ai-framework/DESIGN.md`:视觉系统、设计令牌、布局和组件规则。
- `openspec/specs/`:当前行为规范。
## 许可证
MIT © Alex Ishida标签:Electron, Markdown, Markdown编辑器, React, Syscalls, TypeScript, 安全插件, 桌面应用, 自动化攻击