Tiptap Editor - Trình soạn thảo WYSIWYG headless
(github.com/ueberdosis)- Là framework headless không cung cấp UI, thuận lợi cho việc tùy biến giao diện
- Hoạt động rất tốt với React, Vue, Svelte, Alpine.js, Next.js, Nuxt.js và vanilla JS
- Dựa trên ProseMirror
9 bình luận
Trong số những trình soạn thảo tôi từng dùng thử, cá nhân tôi thấy đây là cái thuận tiện nhất và có cấu trúc dễ mở rộng nhất.
Rất nhiều điểm bất tiện mà tôi cảm nhận khi làm editor bằng Slate đã thực sự được giải quyết ở đây.
Bạn có thể chia sẻ những điểm bất tiện khi dùng editor Slate được không?
Mình mới chỉ dùng Tiptap thôi, nhưng vì có nghe nói Slate cũng khá ổn nên hiện đang thấy hứng thú!!
Phần xây dựng component bên ngoài tiện hơn nhiều. Đặc biệt, khi dùng DOM riêng như với React thì cần render dưới dạng component chứ không phải HTML, và ngay từ đầu tiptap đã được tạo ra có tính đến việc mô-đun hóa nên tôi thấy chỉnh sửa cũng dễ hơn.
Nhìn chung, tôi thấy tài liệu của Slate khá khó và quá raw, nên cảm giác có nhiều phần phải học hơn để triển khai các tính năng tôi muốn.
Đây là ký ức từ khoảng 2 năm trước nên có thể hơi khác một chút, nhưng tôi đã gặp những vấn đề như sau.
Ồ.... cảm ơn~!
Có thể xem ví dụ trình soạn thảo đang hoạt động tại https://tiptap.dev/docs/editor/installation/react#7-the-complete-setup.
Cá nhân tôi thấy tài liệu được viết khá tốt, nhưng ở giữa có xen lẫn những phần yêu cầu đăng ký trả phí.
Dù chưa đến mức gây khó chịu khi đọc tài liệu, nhưng cũng khá tài tình và hơi đáng ghét ở chỗ khiến người ta bị kích thích muốn mua dù thực ra không cần... cảm giác thật phức tạp khó tả.
Tôi khó có thể đồng ý với nhận xét rằng tài liệu của họ được làm khá tốt. Theo cảm nhận của tôi, khoảng cách giữa tài liệu bắt đầu và tài liệu API quá lớn nên đường cong học tập khá dốc. Trong dự án React mà chúng tôi đang thực hiện, chúng tôi đánh giá phong cách tài liệu của Prosemirror và react-prosemirror thân thiện với người dùng hơn và hoàn thiện hơn, vì vậy đã chọn react-prosemirror chứ không chọn tiptap.
Trong lúc tìm hiểu ví dụ React để tạo mã mẫu POC cho các yêu cầu của chúng tôi, đã có những vấn đề như sau.
editor().chain().focus()? Không có nguyên lý thiết kế hay giải thích nào về method chaining.Tôi hoàn toàn không cảm thấy có gì đáng nghi ngờ hay bất tiện ở các mục 1-3, 4-6 và 8, nên tôi khó mà đồng ý được.
1-2
StarterKit đúng như tên gọi, là một bộ kit dành cho giai đoạn khởi đầu, nên đến lúc dùng thực tế thì có vẻ không còn nhiều ý nghĩa.
Với ListItem thì đúng như bạn nói. Nó là thành phần để cấu hình extension Color. Tương tự, tôi nghĩ đây cũng là phần mà chỉ cần không dùng StarterKit là được.
3
chain().something().run()tuy chỉ giống như syntax sugar đơn thuần, nhưng tôi nghĩ nó cung cấp một tính năng phù hợp với khái niệm của một thư viện đi kèm sẵn nhiều thứ.Tôi đang dùng nó rất hữu ích trong môi trường mobile, nơi các thao tác như in đậm rồi focus gần như là bắt buộc.
4
Vì tôi không dùng tính năng đó nên cũng không rõ lắm.
(Tôi nghĩ đây cũng là một ưu điểm đi kèm theo chiều ngược lại với nhược điểm ở mục 1 mà bạn đề cập là bị kéo ra khỏi trạng thái tập trung, ở chỗ không cần phải cố xem thông tin về những tính năng mà mình sẽ không dùng.)
5-6
Không chỉ đã được ghi chép khá rõ trong tài liệu của từng extension, mà về cơ bản nó cũng chẳng khác gì việc triển khai editor nói chung.
Thành thật mà nói, ở phần 6 tôi cũng không chắc mình đã hiểu đúng ý savvykang hay chưa... Tôi cứ liên tục nghĩ kiểu: "Sao chỗ này lại là điều đáng thắc mắc nhỉ...? Rốt cuộc là cần loại gợi ý nào vậy...?" haha...
7
"Cũng như với những node khác", có thể kiểm tra focus bằng
editor.isActive('table').Tuy nhiên, tôi nghĩ đây không phải vấn đề có thể giải quyết chỉ bằng cách xác định node đang focus. Có vẻ đây là một yêu cầu cần cân nhắc rất nhiều thứ như lọc khi dán, chèn qua developer tools, v.v.
8
Tôi đồng ý ở điểm việc quản lý phiên bản dependency là một gánh nặng, nhưng tôi nghĩ đây cũng là chỗ có ưu điểm, vì không cần phải mang theo code của những tính năng không cần thiết.
Đúng ngay trường hợp của bên tôi là không dùng extension Color mà bạn đã nhắc đến. Có lẽ mỗi bên đều có ưu và nhược điểm riêng.
.
Tôi nghĩ
react-prosemirrorvàtiptapmà bạn nhắc đến là hai thứ có concept hoàn toàn khác nhau.một bên là thứ giúp có thể dùng
prosemirrortheo kiểu Reactvs
một bên là thứ mà việc có dựa trên
prosemirrorhay không không quan trọng, miễn là gom hết mọi thứ cần thiết để triển khai một editor phù hợp với dịch vụ của tôiVì đây vốn đã là một cái tên khá được ưa chuộng bên phía Vue nên tôi cũng đã phân vân không biết có nên viết hay không,
nhưng lần này sau khi áp dụng và dùng thử trên SvelteKit thì thấy khá hài lòng nên xin chia sẻ.
Trong hệ sinh thái Svelte, tôi vẫn luôn băn khoăn vì chưa có một editor WYSIWYG nào thật sự khiến mình thấy “đúng là nó đây!”,
nếu bạn cũng đang có cùng nỗi trăn trở thì thử một lần xem sao, có lẽ sẽ là một lựa chọn không tệ.