Tận hưởng Native cho đến khi bạn cần xử lý văn bản
Một lập trình viên kỳ cựu chia sẻ trải nghiệm thất vọng khi cố gắng xây dựng ứng dụng chat hỗ trợ Markdown bằng công cụ Native của Apple như SwiftUI và AppKit. Bài viết chỉ ra rằng Electron thực sự mang lại hiệu suất và khả năng xử lý văn bản vượt trội hơn so với các SDK native trong trường hợp này.

Tận hưởng Native cho đến khi bạn cần xử lý văn bản
Tôi đã là một lập trình viên chuyên phát triển ứng dụng macOS và iOS gần hai mươi năm nay, và tôi muốn nói lên một vài điều về phản ứng thường thấy khi mọi người nhìn thấy một ứng dụng: "Ôi, lại là Node hay Electron sao... thật đáng tiếc...".
Gần đây, tôi đã cố gắng triển khai một tính năng chat đơn giản có hỗ trợ Markdown trên một ứng dụng Swift/SwiftUI thuần túy. Và thú thật, việc các công cụ "native" này vẫn còn khá non nớt khi bạn bước ra khỏi những màn hình đơn giản thực sự là một điều hài hước. Đúng là bạn có thể đạt được hiệu suất chấp nhận được ở SwiftUI. Bạn thậm chí có thể tự thuyết phục mình rằng việc cuộn trang bị giật cục là ổn, và việc lag vài chỗ ở đây ở kia là chấp nhận được. Nhưng khi bạn muốn chọn toàn bộ một tài liệu Markdown được xây dựng từ các nguyên thủy của SwiftUI, bạn đơn giản là không thể làm được điều đó. Đó là do thiết kế.
Vì vậy, với tư cách là một người thông minh và có kinh nghiệm, bạn chuyển sang NSTextView. Nó thậm chí còn hỗ trợ TextKit 2 nữa. Tuyệt vời. Ngoại trừ việc giờ đây bạn mất đi phần lớn công việc kiểm thử và tối ưu hóa hiệu suất đã làm xung quanh SwiftUI, vì nó không tương thích tốt với NSTextView. Sau đó, bạn cố gắng stream văn bản vào đó, vì đây là năm 2026 và mọi người đều stream phản hồi từ các mô hình AI, và bạn bắt đầu thấy CPU tăng vọt. Được thôi. Chúng ta vẫn còn AppKit. Chúng ta vẫn còn NSCollectionView. Trưởng thành, hiệu suất cao, đã được kiểm chứng qua thực chiến. Vì vậy bạn chuyển đổi lần nữa, triển khai toàn bộ thứ đó, và vào ngày thứ hai bạn nhận ra các ô (cells) sẽ nhấp nháy bất chấp mọi cố gắng. Đó cũng là do thiết kế.
Sau đó, bạn thậm chí còn cân nhắc đi xuống mức thấp hơn với TextKit 2 thuần túy. Bạn tạo một bản mẫu. Hiệu suất thì ổn. Stream văn bản vẫn tồi tệ. Nó không chơi đẹp với bất cứ thứ gì hiện đại nào. Bạn loại bỏ hoàn toàn SwiftUI, bám vào AppKit, và bắt đầu chiến đấu với việc mở rộng các khối văn bản thủ công. Lúc này, hầu như mọi thứ đều bị hỏng, nhưng này, ít nhất bạn có thể chọn văn bản!
Sau đó, bạn nhận ra sẽ mất hàng tháng trời chỉ để đạt được sự tương đương về tính năng với hành vi macOS cơ bản: menu ngữ cảnh, tra cứu từ điển, chọn văn bản, khả năng truy cập, các tương tác văn bản, và tất cả những điều nhỏ nhặt mà người dùng mong đợi mà không cần phải suy nghĩ về chúng.
Vì vậy, bạn thử dùng WebKit để render Markdown. Và nó hoạt động. Tất nhiên vẫn có những lưu ý, nhưng phần lớn là nó hoạt động tốt. Hiệu suất tốt. Typography gần như hoàn hảo. Bạn có mức độ kiểm soát phù hợp.
Và rồi, vào khoảnh khắc tăm tối nhất, bạn nghĩ: "Được thôi, hãy tạo một dự án Electron đơn giản". Bạn bước sang "bên tối".
Và bạn bị choáng ngợp.
Các thao tác văn bản, render Markdown, typography đẹp – tất cả đều hoạt động ngay lập tức (out of the box), với hiệu suất mà bạn không thể đạt được ngay cả với bản triển khai TextKit 2 thuần túy của mình. Các tích hợp macOS cũng có ở đó. Bạn thậm chí có thể render các Git diffs cầu kỳ chỉ với vài dòng code. Tôi thậm chí còn chưa nói đến những thứ như diffs.com.
Và sau đó bạn tự hỏi: Điều gì đã sai?
Tôi đã làm mọi thứ mà mọi người nói là nên làm. Native cho đến cùng. Tôi hiểu nền tảng này. Tôi hiểu các lựa chọn. Tôi hiểu SwiftUI, AppKit, TextKit, WebKit.
Nhưng tôi vẫn không thể làm cho một điều đơn giản hoạt động đúng: một cuộc trò chuyện với Markdown và khả năng chọn toàn bộ tin nhắn.
Và đột nhiên mọi thứ trở nên rõ ràng hơn tại sao hầu hết các ứng dụng mới tập trung vào chat, phụ thuộc vào một trong những mô hình giao diện quan trọng nhất của thời đại này – chat, văn bản phong phú dạng dài, typography linh hoạt – lại dựa trên web theo cách này hay cách khác.
Không có sự thay thế thực sự nào khác.
SwiftUI ổn cho các màn hình đơn giản, tốt nhất là không có quá nhiều cuộn trang. Swift vẫn tuyệt vời cho các phần quan trọng về hiệu suất. Nhưng bạn có thể nhận được phần lớn hiệu suất đó từ Electron hoặc React Native gần như miễn phí thông qua khả năng tương tác native, trong khi vẫn giữ được mô hình văn bản và render tốt hơn nhiều.
Vì vậy, đây thậm chí không còn là cuộc tranh luận giữa "giải pháp nhanh chóng hay giải pháp đúng đắn" nữa. Nếu bạn muốn xây dựng render văn bản phong phú cho các cuộc trò chuyện dạng dài, SwiftUI và các SDK native của Apple không giúp ích gì cho bạn. Chúng ngừng là một lợi thế và bắt đầu trở thành rào cản.
Bài viết liên quan

Phần mềm
Plugin Checkmarx Jenkins bị xâm phạm trong cuộc tấn công chuỗi cung ứng
11 tháng 5, 2026

Công nghệ
Substrate (YC S24) tuyển dụng Technical Success Manager cho nền tảng AI chuyên xử lý thanh toán y tế
13 tháng 5, 2026

Phần mềm
Bun công bố hướng dẫn chuyển đổi sang Rust, nhưng gọi dự án viết lại là "chưa chín muồi"
05 tháng 5, 2026
