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
  • Sống trong thế giới Internet đủ lâu bạn có thể thấy con người ta trên này cũng chịu khó đu "trend" lắm đấy chứ, đã thế lại còn lan nhanh với tốc độ chóng mặt.

    Mới cách đây vài tháng, chúng ta còn chưa khỏi bàng hoàng về độ thông minh của các mô hình ngôn ngữ lớn (LLM) trả lời y như con người thì ngay sau đó bọn chúng đã được cập nhật thêm khả năng suy nghĩ, suy luận đáng kinh ngạc. Được ứng dụng rộng rãi không chỉ mỗi lĩnh vực lập trình. Rồi mới đây, thuật ngữ AI Agents lại đang làm mưa làm gió.

    Vậy AI Agents là gì? Trong bài viết ngắn này dĩ nhiên là không thể nêu ra một khái niệm vắn tắt mà đầy đủ được hết ý. Bạn đọc có thể tham khảo bài viết rất chi tiết này ở đây Agents | Chip Huyen. Còn cho dễ hình dung, Có thể coi AI Agents như một con người hay một cá thể gì đó. Bản thân Agents được trang bị đầy đủ các công cụ. Từ những thứ đó, Agents có thể kết hợp chúng lại với nhau để hoàn thành một tác vụ mà chúng ta sai bảo.

    Vẫn hơi mơ hồ nhỉ! Một ví dụ sát thực tế nhất là bạn ra lệnh cho Agents mỗi 8 giờ tối, truy cập vào Facebook, đọc xem có tin tức gì nổi bật từ bạn bè không rồi gửi một bản tóm tắt vào Telegram, thế là xong!

    » Xem thêm
  • Hôm qua đến nay, lượt truy cập tới từ Facebook tăng đột biến. Thường như thế là do ai đó chia sẻ bài viết của blog vào một nhóm nào đó.

    Cơ mà lần này là liên kết trực tiếp đến trang chủ luôn. Tò mò ghê, không biết ai chia sẻ, chia sẻ ở đâu nữa. Muốn biết để tìm hiểu "insight" ghê 🥹

    » Xem thêm
  • Mình mới phát hiện ra thư viện idb-keyval giúp triển khai cơ sở dữ liệu dạng key-value một cách đơn giản. Như đã chia sẻ trong chuỗi bài viết về quá trình làm OpenNotas, mình loay hoay đi tìm một loại cơ sở dữ liệu để lưu trữ mà xem chừng vất vả quá, cuối cùng chốt localForage.

    idb-keyval cũng tương tự như localForage nhưng có vẻ như nó đang làm tốt hơn một chút. Đơn cử là có hàm update để cập nhật dữ liệu, hình dung đơn giản là:

    update('counter', (val) => (val || 0) + 1);

    Chứ không như hàm set là thay thế dữ liệu mất tiêu luô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

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? 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...
Bấm hoặc cuộn mạnh để sang bài mới