Giới thiệu CodeMirror - Khung soạn thảo Code và Markdown hiệu quả

Giới thiệu CodeMirror - Khung soạn thảo Code và Markdown hiệu quả

Tin ngắn hàng ngày dành cho bạn
  • Cuối tuần đang ngồi làm cái Cửa hàng cho thư giãn mọi người ạ. Trước mình đã làm một lần rồi cơ mà làm cho có, bán được hẳn 1 cuốn sách 😆

    Giờ làm lại, sẽ đa dạng sản phẩm hơn. Dự là đăng mấy sản phẩm đã mua và dùng rồi kèm theo vài dòng nhận xét cho mọi người tham khảo 🤓

    » Xem thêm
  • Một bài viết thú vị về cách làm thế nào để viết blog cho lập trình viên đọc.

    How to Write Blog Posts that Developers Read

    Tóm tắt lại là đi thẳng vào vấn đề và hình dung ra đối tượng độc giả mà bạn đang nhắm đến. Một điều nữa là tác giả đã có hơn 9 năm kinh nghiệm viết, thời gian đầu không ai đọc nhưng sự kiên trì đã giúp anh đạt được mốc 300K - 500K độc giả mỗi năm. Quả là con số ấn tượng phải không ạ 🔥

    » Xem thêm
  • Bây giờ hiện đại quá cái gì người ta cũng có thể nghĩ ra được. ferretdb.com là một dự án mã nguồn mở, biến cơ sở dữ liệu PostgreSQL thành... MongoDB. Đúng vậy bạn không nghe nhầm đâu. Nếu vẫn muốn dùng Postgres mà thích cú pháp truy vấn của Mongo thì ferretdb là dành cho bạn.

    À ngoài PostgreSQL ra thì còn có thể cắm vào SQLite nữa. Xịn!!! 🙏

    » Xem thêm

Vấn đề

input, textarea là hai thẻ mà HTML định nghĩa để giúp chúng ta lấy được dữ liệu người dùng nhập vào. input phù hợp trong trường hợp nội dung nhập vào tương đối ngắn và ngược lại - textarea thường là một cái gì đó rất dài và xuống dòng. Sau này tìm hiểu thêm, tôi được biết đến một cách khác nữa để lấy được dữ liệu người dùng là contenteditable, nhưng ngược lại với inputtextarea, contenteditable cho phép người dùng chỉnh sửa trực tiếp mã HTML. Chính vì thế dữ liệu hiển thị trong contenteditable vô cùng đa dạng.

Có một hạn chế là hai thẻ trên chỉ đơn giản là cho người dùng nhập vào những dòng chữ, thuần kí tự. Nếu muốn làm gì đó trong những nội dung này, ví dụ như định dạng chữ, highlight cú pháp, tạo shortcut... thì quả là một vấn đề khó khăn. Do đó, nếu chỉ sử dụng chúng một cách đơn thuần, chúng ta khó mà có thể tạo ra được một trình soạn thảo văn bản có định dạng phong phú. contenteditable thì lại "dính" quá nhiều mã HTML, khó có thể lọc ra được nội dung của người dùng đang nhập. Chưa kể, mỗi trình duyệt lại có cách triển khai contenteditable khác nhau cho nên nhiều khi chúng sẽ hoạt động một cách khó hiểu.

Vì lẽ đó, có khá nhiều thư viện Text Editor được ra đời và cung cấp tính năng soạn thảo, định dạng văn bản rất mạnh mẽ. Có thể kể đến những cái tên như TinyMCE, CKEditor, WYSIWYG... Điểm chung của những công cụ này là chúng có giao diện đẹp mắt, hiện đại, với các thanh công cụ hỗ trợ định dạng văn bản như một trình soạn thảo thực thụ. Sử dụng trong những trường hợp cần nhập vào nội dung không chỉ đơn giản là thuần chữ, mà còn là cách trình bày, định dạng, hình ảnh... Hầu hết chúng đều cho đầu ra là các đoạn mã HTML, chỉ cần lưu lại và trả về cho trình duyệt hiển thị là đã có trang hiển thị "y xì đúc".

Mạnh mẽ là thế nhưng tất cả chúng hầu như lại không đáp ứng được một nhu cầu đơn giản của tôi là trình soạn thảo Markdown với chế độ xem trước (Preview). Nếu lướt qua những cái tên bên trên, có thể bạn sẽ thấy một vài thư viện có cả chế độ Markdown. Tôi đã thử qua chúng và thấy rằng nó vẫn chưa đáp ứng được, hoặc là chỉ làm nửa vời - nghĩa là không hỗ trợ hết cú pháp của markdown...

Khung soạn thảo bài viết

Nhu cầu của tôi khá đơn giản, một cái gì đó nhanh, nhẹ, hỗ trợ highlight cú pháp và có khả năng tùy biến dễ dàng - nghĩa là thêm thắt tính năng nuột nà. Trên đà đó, tôi bắt đầu tìm kiếm sang các keyword khác như là "markdown editor library"... Lúc đó, một ứng cử viên sáng giá xuất hiện là SimpleMDE.

SimpleMDE đúng như cái tên của nó, một trình editor markdown siêu "đơn giản", tập trung vào viết, hỗ trợ hầu như đầy đủ tiêu chí mà tôi cần. Nhưng khi nghiên cứu đến API của SimpleMDE, một cái tên mới xuất hiện là CodeMirror. Đến đây, tôi hiểu rằng SimpleMDE có thể đang sử dụng CodeMirror ở dưới nền. Tiếp tục tìm hiểu thì quả không sai, CodeMirror cũng là một trình soạn thảo markdown và có lẽ là rất mạnh mẽ.

Codemirror

CodeMirror là một thư viện JavaScript mã nguồn mở được sử dụng để tạo ra trình soạn thảo mã trong các ứng dụng web. Nó cung cấp một giao diện tương tác cho người dùng để viết và chỉnh sửa mã nguồn trong nhiều ngôn ngữ lập trình khác nhau. CodeMirror hỗ trợ các tính năng quan trọng như làm nổi bật cú pháp (syntax highlighting), tự động hoàn thành mã (code autocompletion), kiểm tra lỗi (error checking), thay đổi kích thước linh hoạt và nhiều tính năng khác.

CodeMirror thường được sử dụng trong các dự án web-based, chẳng hạn như trình soạn thảo mã nguồn trong các trang web dự án mã nguồn mở, các môi trường phát triển tích hợp (IDEs), trình biên tập blog với hỗ trợ mã, và nhiều ứng dụng web khác đòi hỏi khả năng soạn thảo mã nguồn.

Có rất nhiều lợi ích mà Codemirror mang lại để làm lý do cho tôi và nhiều người khác sử dụng nó như:

  • Làm nổi bật cú pháp (Syntax Highlighting), tự động hoàn thành mã (Code Autocompletion, kiểm tra lỗi (Error Checking):
  • Dễ dàng tạo thêm các phím tắt (Keybindings).
  • Tùy chỉnh giao diện theo sở thích.
  • Kho plugin phong phú hoặc tự tạo thêm plugin cho mình.
  • Tương thích đa nền tảng, đây là cái hết sức cần thiết vì tôi không phải mất thêm thời gian để đi fix lỗi trong nhiều trình duyệt khác nhau.
  • Tài liệu và API rõ ràng, cộng đồng sử dụng lớn nên nhanh chóng tìm được sự trợ giúp trong quá trình phát triển.

Hiện tại tôi đang sử dụng CodeMirror ở hai nơi, một là trình soạn thảo bài viết trong AdminCP, hai là khung bình luận của blog. Mặc dù chưa được tối ưu hóa cho lắm như tôi có thể kiểm soát được tính năng mới cho chúng.

Triển khai

Vì là một thư viện JavaScript nên chúng ta có thể dễ dàng nhúng lên bất kì trang web nào. Hoặc nếu đang sử dụng một thư viện như là Vue, React... thì cũng có nhiều packages biến đổi CodeMirror thành components của thư viện.

Dưới đây là một ví dụ sử dụng CodeMirror cho một khung soạn thảo markdown đơn giản.

import {basicSetup, EditorView} from "codemirror"
import {markdown} from "@codemirror/lang-markdown"
import {languages} from "@codemirror/language-data"

let view = new EditorView({
  doc: "Hello\n\n```javascript\nlet x = 'y'\n```",
  extensions: [
    basicSetup,
    markdown({codeLanguages: languages})
  ],
  parent: document.body
})

Bạn đọc có thể xem thêm nhiều ví dụ hơn nữa tại Try CodeMirror. Hoặc xem thêm ví dụ cụ thể cho từng trường hợp sử dụng tại Examples.

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...