「又是 Electron?真丢人。」每当新的桌面应用使用 Web 技术构建时,这种评论就会出现。但一位拥有近 20 年 macOS/iOS 原生开发经验的老兵,在一次亲身实践中得出了一个让人不太舒服的结论:在富文本渲染这件事上,原生框架至今仍然远远落后于 Web。
从 SwiftUI 到 TextKit 2:步步碰壁
作者的目标很简单:实现一个带 Markdown 渲染的聊天界面,并且支持选中整段文本。在 SwiftUI 中,Markdown 渲染勉强可用——只要你能忍受跳动的滚动和不时出现的卡顿。但想选中一段由 SwiftUI 原语构建的文本?设计上就不支持。切换到 NSTextView(原生文本控件)后,选中问题解决了,但流式文本渲染导致 CPU 飙升。再换到 NSCollectionView,又发现单元格会莫名闪烁。继续深入到纯 TextKit 2 层面做原型——流式渲染仍然表现糟糕。
WebKit 救场:讽刺的终局
在经历了所有原生方案之后,作者尝试用 WebKit 渲染 Markdown。结果令人震惊:性能好、排版近乎完美、有恰当的控制粒度。再进一步尝试 Electron 项目,文本操作、Markdown 渲染、高质量排版——全部开箱即用,流畅度甚至超过了纯 TextKit 2 的实现。还能用几行代码轻松渲染 Git diff。
「我做了所有人告诉我要做的事——全栈原生。我了解平台,了解 SwiftUI、AppKit、TextKit、WebKit 所有选项。但我仍然无法让一个简单的东西正常工作。」这解释了为什么这个时代最重要的界面模式——聊天/长文本富格式界面——越来越多地用 Web 技术构建。
文本渲染为什么这么难?
一位评论者道出真相:Apple 旧版 macOS 和 AppKit 也曾用 WebKit 渲染 NSTextField 中的富文本。文本本身就是计算机科学中最难的问题之一——光是一个简单的「在段落中插入可点击链接」,在 iOS 上就曾是噩梦级别的工程任务。Web 平台之所以在这方面遥遥领先,恰恰是因为它经过了二十年浏览器大战的血与火洗礼。
社区分裂:经验派与质疑派
这篇 373 分的帖子在 HN 引发 250 条评论,评论两极分化严重。一边是共鸣——@iamcalledrob 指出 iMessage for Mac 也曾使用 WebView 渲染内容,文本本身就是难啃的骨头。另一边是质疑——多位开发者列出成熟的 SwiftUI Markdown 渲染库(swift-markdown-ui、Textual),认为作者的问题是实现方式而非框架局限。但 @skeledrew 的总结或许最接近真相:人们抱怨原生不够成熟,然后转投 Web;Web 因此获得更多投入变得更好,原生进一步被冷落——这是一个自我强化的恶性循环。
📎 原文:justsitandgrin.im|💬 HN讨论:Hacker News (373分 / 250评论)