Atom — Web 技术做桌面编辑器的先驱
待复核Atom 是 GitHub 在 2014 年推出的一款开源代码编辑器,口号是”21 世纪的可 hack 文本编辑器”。
日常类比:它像一把瑞士军刀,出厂时有基础刀片(编辑功能),但刀柄上的每一个卡槽都可以自由换装——你可以装螺丝刀(Git 面板)、开瓶器(终端)或者放大镜(代码补全),全凭你喜好。
技术上,Atom 用 Web 技术(HTML / CSS / JavaScript)搭建界面,运行在它自己催生的 Electron 框架上,实现了一套桌面应用也能像网页一样”写前端代码就能改 UI”的开发模式。项目巅峰期拥有约 60k GitHub star,社区贡献了超过 8000 个扩展包。
2022 年 12 月 15 日,GitHub 正式归档了 Atom 的所有仓库,宣告项目停止维护。
但它催生的技术——Electron 和 Tree-sitter——仍然是当今开发工具领域的基石。可以说 Atom 是一个”活在后代里”的项目。
不理解 Atom,下面这些事都没法解释:
-
为什么 VS Code、Slack、Discord 这些桌面应用全是用 JavaScript 写的——因为 Atom 证明了这条路可行并催生了 Electron 框架
-
为什么 Neovim、Helix、Zed 的语法高亮比老一代编辑器精准得多——因为 Atom 团队孵化了 Tree-sitter 增量解析器
-
为什么现代编辑器都有”命令面板”(Ctrl/Cmd+Shift+P)——Atom 把这个交互范式从 Sublime Text 发扬光大,变成行业标配
-
为什么编辑器插件生态这么繁荣——Atom 率先把”核心极小、功能全靠包”做到极致,后来者都在模仿这个架构
-
为什么”Electron 应用 = 吃内存”这个刻板印象存在——最初就来自 Atom 的性能问题
-
为什么一个项目可以”死了”却仍在发挥影响——Atom 归档了,但它的 DNA 活在 VS Code 和 Zed 中
Atom 的设计哲学可以归纳为三条,每一条都对后来的编辑器设计产生了直接影响:
第一,一切皆包(Package)。 编辑器的核心只负责最基本的文本渲染和事件循环,其余功能——文件树、Git 集成、语法高亮、自动补全——全部以包的形式存在,可以单独启用、禁用或替换。
Atom 自带的 70 多个”核心包”和用户安装的”社区包”使用完全相同的 API,没有特权之分。这意味着你不喜欢官方的文件树,可以直接换一个社区版,无需 fork 整个项目。
第二,Web 技术即 UI 层。 界面本质是一个 Chromium 渲染的网页,开发者可以用 CSS 改主题、用 JavaScript 写插件,前端开发者零门槛上手。你甚至可以在编辑器里按 Ctrl+Shift+I 打开 DevTools,像调试网页一样调试编辑器本身。这种”所见即所得”的开发体验,在当时的编辑器中是独一无二的。
第三,深度可 hack。 从快捷键绑定到命令面板,从样式表到初始化脚本(init.js),几乎每一层行为都暴露了可覆写的 API。用户可以在 ~/.atom/init.js 中写任意 JavaScript,启动时自动执行,无需打包发布就能定制行为。
配合 styles.less 可以直接覆盖编辑器的 CSS,改字体、改间距、改颜色只需几行 LESS 代码。这种”像改网页一样改编辑器”的体验,让前端开发者第一次感觉编辑器真的属于自己。
案例 1:实时协作编程
Section titled “案例 1:实时协作编程”团队想做实时协作编程。Atom 的 Teletype 包让两个人可以通过 WebRTC 直连,实时编辑同一个文件——类似 Google Docs,但发生在编辑器里。
这在 2017 年是非常前沿的尝试,比 VS Code Live Share 还早一年。Teletype 的架构采用 CRDT(无冲突复制数据类型)处理并发编辑,即使网络断开再重连也不会丢失修改。这个思路后来影响了其他协作编辑方案的设计。
一个 Atom 包最小会长得像这样:
{ "name": "team-collab-demo", "main": "./lib/main", "activationCommands": { "atom-workspace": "team-collab-demo:join" }}新手要抓住三件事:name 是包名,main 指向入口文件,activationCommands 告诉 Atom 用户执行哪个命令时再加载包。Teletype 复杂很多,但入口仍然遵守这套包机制。
案例 2:给小众语言加语法高亮
Section titled “案例 2:给小众语言加语法高亮”想给一门小众语言加语法高亮。在 Atom 中只需写一份 TextMate 语法文件或 Tree-sitter 语法,打包发布到 apm(Atom Package Manager),社区即可一键安装。
整个流程和 npm 发包几乎一样,因为 apm 本身就是 npm 的一个封装。从写语法到发布上线,一个下午就能完成。这种低门槛的扩展机制让 Atom 的语言支持覆盖面远超同期的竞品。
一个极简 TextMate grammar 片段大概是:
{ "scopeName": "source.toy", "fileTypes": ["toy"], "patterns": [ { "match": "\\\\b(print|let)\\\\b", "name": "keyword.control.toy" } ]}这里的 scopeName 像语言身份证,fileTypes 负责匹配文件后缀,patterns 则把关键字标成可上色的 token。Atom 的低门槛就在于:很多扩展一开始只是这种小 JSON。
案例 3:Git 可视化操作
Section titled “案例 3:Git 可视化操作”想用 Git 但不想记命令行。Atom 内置的 github 包直接在侧边栏展示文件变更、暂存区、提交历史,点按钮就能 commit 和 push。对新手来说,这比在终端敲命令的心理负担小很多。
更进一步,Atom 的 Git 面板支持行级暂存(stage individual lines)——你可以只提交文件中的部分修改,而不是整个文件。这种”编辑器内置版本控制 UI”的模式后来被 VS Code 完整继承并扩展。
如果想给自己加一个快捷命令,~/.atom/init.js 可以这样写:
atom.commands.add('atom-workspace', { 'study:open-git-panel': () => { atom.commands.dispatch(atom.views.getView(atom.workspace), 'github:toggle-git-tab') }})这段代码的重点不是 API 细节,而是 Atom 的精神:用户脚本、命令面板、核心包都能接在同一套命令系统上,所以”可 hack”不是口号。
-
性能是致命伤:Atom 启动慢(冷启动 3-5 秒)、大文件卡顿,根因是每次渲染都要走完整的 Chromium 排版流水线。打开一个 10MB 的日志文件可能让编辑器卡死。VS Code 用相同的 Electron 但通过虚拟化列表和更激进的懒加载避开了这个问题,证明框架本身不是瓶颈,架构设计才是。
-
插件质量参差不齐:因为门槛低,大量低质量包涌入生态,多个包之间容易冲突。用户装了 30 个包后编辑器行为变得不可预测,调试困难。缺乏统一的插件质量门禁和沙箱隔离机制是根因——任何包都能修改全局状态。
-
内部资源被 VS Code 吸走:微软收购 GitHub 后,Atom 和 VS Code 共存一个公司,资源逐渐向 VS Code 倾斜,Atom 的核心维护者流失。从 2020 年开始,Atom 几乎没有重大功能更新,只做安全补丁。一个项目如果没有持续的工程投入,再大的社区也会冷却。
-
架构决策难以回退:早期选择用 CoffeeScript 编写核心代码,后来社区迁移到 ES6/TypeScript 时产生大量技术债,重构进度缓慢。这个教训说明技术选型的惯性远比想象的大——初始决策会在项目生命周期内反复放大成本。
适用:
- 想理解”Web 技术如何做桌面应用”的学习者——Atom 的源码是最好的教材
- 对编辑器插件开发感兴趣的前端开发者——API 文档详尽,示例包丰富
- 想研究 Electron 起源和演化的人——Atom 是第一个 Electron 应用
- 想学习 Tree-sitter 语法文件编写的语言工具开发者
- 想了解”开源项目如何兴衰”的案例研究者——从巅峰到归档只用了 8 年
不适用:
- 需要高性能编辑大文件的日常开发——推荐 VS Code 或 Neovim
- 需要活跃维护和安全补丁的生产环境——Atom 已归档停更,不再有安全修复
- 追求极致启动速度的场景——Sublime Text 或 Vim 更合适
- 需要 AI 辅助编程的场景——Atom 没有 Copilot 级别的集成
- 需要远程开发(SSH/容器)的场景——Atom 没有成熟的远程方案
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”2011 年 — 起念:GitHub 联合创始人 Chris Wanstrath 想做一个”像 Emacs 一样可扩展、但对普通人友好”的编辑器。团队先造了一个叫 Atom Shell 的运行时——把 Node.js 和 Chromium 捆在一起,让 JavaScript 既能操作系统又能画界面。这个运行时后来更名为 Electron,成了独立项目。
2014 年 — 公测:2 月,Atom 以邀请制公测亮相,开发者社区反响热烈。邀请码一码难求,类似当年 Gmail 邀请码的盛况。
2015 年 — 1.0 发布:6 月正式发布 1.0 版本,同年 Electron 也独立发布,被其他团队拿去做 VS Code、Slack 桌面版等应用。Atom 无意中成了”Electron 生态第一个证明人”。
2017 年 — Tree-sitter 诞生:团队的 Max Brunsfeld 开发了 Tree-sitter——一套增量解析框架,让编辑器在你打字时实时维护整棵语法树,代码高亮和折叠因此更精准。传统的 TextMate 语法用正则匹配,遇到嵌套结构(如模板字符串里的表达式)就力不从心;Tree-sitter 直接构建真正的语法树,精度和性能都大幅提升。
2018 年 — 微软收购 GitHub:Atom 和 VS Code 同属一个公司,资源开始倾斜。社区能感受到更新频率的下降。
2022 年 — 日落归档:6 月 8 日,GitHub 宣布日落 Atom;同年 12 月 15 日正式归档所有仓库。理由是社区重心已转向 VS Code,继续维护的投入回报比不再合理。Atom 的故事结束了,但它留下的工具链仍在推动行业前进。
-
开创性项目的价值不止于自身——Atom 归档了,但 Electron 和 Tree-sitter 仍在高速发展,衍生影响远大于项目本身。做一个项目时,值得问自己”这里面有哪些东西即使主项目死了也能活下来”。
-
性能是编辑器的底线,再好的扩展性也弥补不了”打开文件要等 3 秒”的体验。用户对延迟的容忍度极低,尤其是高频操作的工具。Atom 的教训是:先把核心路径做快,再谈可扩展性。
-
“一切皆插件”的架构美观但需要严格的质量门禁和隔离机制,否则生态变成噪音。VS Code 用”扩展主机进程”做隔离,吸取了 Atom 的教训。开放不等于放任。
-
技术竞争中,生态和持续资源投入比先发优势更决定结局。Atom 先来 2 年,但 VS Code 靠更快的迭代周期(月度发布)和更大的全职团队反超。
-
好的副产品(Electron、Tree-sitter)有时比主产品活得更久——做项目时值得思考哪些组件可以独立抽象、独立发布、独立存活。
- GitHub 官方告别文:Sunsetting Atom
- Tree-sitter 官网:tree-sitter.github.io
- Atom 非官方社区复刻:atom-editor.cc
- Electron 框架:electronjs.org
- InfoQ 中文回顾:GitHub 官宣报废 Atom
- 知乎深度分析:Atom 编辑器兴衰与未来趋势
- Atom Flight Manual(官方文档,已归档):flight-manual.atom.io
- vscode —— Atom 的精神继承者,同样基于 Electron 但性能优化更彻底
- electron —— 从 Atom Shell 更名而来,Atom 是它的第一个应用
- tree-sitter —— 在 Atom 团队中孵化的增量解析器,至今活跃
- emacs —— Atom 的设计灵感来源之一,“可扩展编辑器”的鼻祖
- vim —— 与 Atom 代表两种极端:终端原生 vs Web 技术桌面化
- sublime-text —— Atom 出现前最流行的轻量编辑器,性能标杆
- lsp —— 语言服务器协议,让编辑器和语言工具解耦的关键标准
- doom-emacs —— Doom Emacs — 启动不到一秒的模块化 Emacs 配置
- geany —— Geany — 用 C 写的轻量级 GTK 编辑器
- lunarvim —— LunarVim — 开箱即用的 Neovim IDE 发行版
- marktext —— MarkText — 实时预览 Markdown 编辑器
- spacemacs —— Spacemacs — 让 Vim 党和 Emacs 党握手的编辑器配置
- textmate —— TextMate — macOS 上定义 bundle 宏系统的编辑器
- xi-editor —— xi-editor — 异步架构编辑器的先驱实验