Cách mở tệp .mmd
Tệp .mmd là một tệp văn bản bình thường chứa một sơ đồ Mermaid. Nó không phải ảnh cũng không phải định dạng nhị phân — bạn có thể mở bằng bất kỳ trình soạn thảo văn bản nào và đọc được. Muốn xem nó thành sơ đồ, hãy thả tệp vào khung bên dưới. Sơ đồ được vẽ ngay trong trình duyệt của bạn và không có gì đi tới máy chủ nào cả.
Thả tệp .mmd của bạn vào đây
Chấp nhận cả .mermaid, .md và .txt. Tệp được đọc ngay trong trình duyệt và không bao giờ được gửi đi.
Tệp .mmd là gì
Mermaid là một cú pháp dạng văn bản dành cho sơ đồ. Bạn mô tả sơ đồ bằng chữ và bộ máy vẽ nó ra — hệt như Markdown mô tả định dạng còn bộ máy tạo ra trang. Tệp .mmd chứa đúng đoạn chữ đó và không có gì khác: không kiểu dáng, không dữ liệu ảnh, không siêu dữ liệu.
Toàn bộ lý do tồn tại của định dạng này nằm ở đó. Vì là văn bản nên sơ đồ có thể nằm trong kho Git ngay cạnh đoạn mã mà nó mô tả, và một thay đổi hiện ra thành một diff đọc được chứ không phải một tệp nhị phân bị thay thế. Đây là một tệp .mmd hoàn chỉnh và hợp lệ:
flowchart LR
Commit[Đẩy lên main] --> Build[Chạy kiểm thử]
Build -->|thành công| Deploy[Triển khai lên môi trường thật]
Build -->|thất bại| CanhBao[Báo cho tác giả]
Deploy --> KiemNhanh[Kiểm thử nhanh]
KiemNhanh --> Xong[Phát hành hoàn tất]Mở tệp .mmd bằng gì
Nói ngắn gọn: gần như không có gì mở được tệp .mmd bằng cách nháy đúp, vì phần mở rộng này không gắn với ứng dụng nào. Thứ bạn thật sự cần là một công cụ vẽ được Mermaid. Dưới đây là những gì tôi đã kiểm và những chỗ nó không chạy.
Trang nàyMở được
Vẽ tệp ra ngay lập tức
Thả tệp vào khung bên trên và bạn có ngay sơ đồ. Không có bước tải lên: tệp được đọc trong trình duyệt qua File API rồi vẽ tại chỗ, nên cách này dùng được cả với những sơ đồ bạn không được phép đưa ra ngoài.
Nếu bạn muốn sửa sơ đồ chứ không chỉ xem, hãy dùng liên kết bên dưới khung xem trước để mở nó trong trình soạn thảo.
Bất kỳ trình soạn thảo văn bản nàoMở được
Hiện mã nguồn chứ không hiện sơ đồ
Notepad, Notepad++, vim — cái nào cũng được. Tệp .mmd là văn bản UTF-8 nên bạn thấy mã nguồn ngay. Bạn sẽ không thấy sơ đồ, và không có gì hỏng cả — đơn giản là trong tệp không có ảnh nào để hiện.
Đây là cách nhanh nhất để kiểm xem tệp ai đó gửi có đúng là Mermaid không: mở ra và xem dòng đầu tiên khác rỗng có phải một từ khóa sơ đồ như flowchart, sequenceDiagram, classDiagram, stateDiagram-v2, erDiagram hay gantt không.
GitHubKhông mở được
Vẽ khối ```mermaid trong Markdown, nhưng không vẽ tệp .mmd
GitHub vẽ Mermaid bên trong các khối mã có rào. Tài liệu liệt kê chính xác những nơi đó: issue, Discussions, pull request, wiki và tệp Markdown. Một tệp .mmd đứng riêng không nằm trong danh sách ấy, và mở nó trong trình duyệt tệp của kho sẽ chỉ thấy mã nguồn.
Vậy nên nếu muốn sơ đồ hiện ra trên GitHub, nó phải nằm trong một khối ```mermaid bên trong tệp .md chứ không phải trong một tệp .mmd riêng. Giữ tệp .mmd làm nguồn rồi lặp lại đúng nội dung đó trong README là cách nhân bản phổ biến và hợp lý.
GitLabKhông mở được
Vẽ khối ```mermaid, nhưng không vẽ tệp .mmd, mà lại còn chạy Mermaid cũ hơn
Cùng một kiểu như GitHub: Mermaid được vẽ trong các khối có rào ở Markdown, issue, merge request và wiki, nhưng không chỗ nào nói rằng một tệp .mmd đứng riêng sẽ được vẽ.
Còn một điều nữa đáng biết, vì nó gây nhầm lẫn thật sự. GitLab.com cho biết họ hỗ trợ Mermaid phiên bản 10. Trang này chạy bản 11.12.2. Cú pháp thêm vào sau bản 10 sẽ vẽ được ở đây và đổ ở đó — và đó thường là lời giải thích cho câu «trên trình duyệt thì chạy mà trên GitLab của bọn tôi thì không». Với GitLab tự cài đặt còn có cái bẫy thứ ba: khi tiêu đề Cross-Origin-Resource-Policy được đặt là same-site hoặc same-origin, sơ đồ Mermaid đổ trong im lặng — không lỗi và cũng không sơ đồ.
.mmd, .mermaid và .md
.mmd và .mermaid là một. Cả hai chỉ chứa mã nguồn Mermaid, và mọi công cụ tôi biết mà nhận cái này thì cũng nhận cái kia. .mmd ngắn hơn và phổ biến hơn; công cụ dòng lệnh chính thức dùng nó làm mặc định. Hãy chọn một và giữ nguyên trong phạm vi một dự án — lựa chọn này không có hệ quả kỹ thuật nào.
.md thì khác về bản chất. Tệp Markdown là một tài liệu có thể chứa sơ đồ Mermaid, bọc trong một khối bắt đầu bằng ba dấu huyền và chữ mermaid. Sơ đồ là một mẩu nằm trong một văn bản lớn hơn.
Khác biệt này là nguyên nhân phổ biến nhất khiến một tệp không vẽ ra được, và nó tác động theo cả hai chiều. Dán nội dung một tệp .md vào trình xem Mermaid thì nó đổ, vì dòng rào không phải cú pháp Mermaid. Lưu một sơ đồ Mermaid trần vào tệp .md mà không có rào thì GitHub hiện nó thành một đoạn văn. Quy tắc rất đơn giản: tệp .mmd phải bắt đầu bằng một từ khóa sơ đồ, còn tệp .md phải đặt sơ đồ bên trong một khối có rào.
Trình xem này nhận .mmd, .mermaid, .md và .txt, nhưng coi mọi thứ nó đọc được là Mermaid thô. Nếu bạn thả vào một tệp Markdown có chữ nghĩa bao quanh sơ đồ, hãy xóa hết những gì không phải sơ đồ trước đã.
Không vẽ ra được — thật ra vấn đề nằm ở đâu
Thông báo lỗi của Mermaid chính xác nhưng không thân thiện. Một mẹo có tác dụng là chỉ đọc phần cuối thông báo: sau chữ `got` là tên token mà Mermaid bị kẹt lại, và token đó chỉ ra vấn đề tốt hơn số dòng rất nhiều. Mọi trường hợp dưới đây tôi đều dựng lại trên mermaid 11.12.2: bản sai thật sự đổ, bản đã sửa thật sự vẽ.
Bạn thấy gì
No diagram type detected matching given configuration for text: ```mermaid
Vì sao
Bạn đã sao chép sơ đồ từ một tệp Markdown hoặc từ một cuộc trò chuyện và mang theo cả phần rào. Ba dấu huyền là Markdown chứ không phải Mermaid, nên bộ phân tích không bao giờ đi tới được sơ đồ.
Cách sửa
Xóa dòng mở ```mermaid và dòng đóng ```. Tệp phải bắt đầu bằng một từ khóa sơ đồ.
```mermaid
flowchart TD
A[Bắt đầu] --> B[Kết thúc]
```flowchart TD
A[Bắt đầu] --> B[Kết thúc]Bạn thấy gì
Parse error, kết thúc bằng: got 'NODE_STRING'
Lỗi kết thúc bằng: got 'NODE_STRING'
Vì sao
Định danh nút có khoảng trắng, và đây là cái bẫy lớn nhất với người viết tiếng Việt. Tiếng Việt viết rời từng âm tiết nên gần như mọi danh từ tự nhiên đều có khoảng trắng: «đơn hàng», «thanh toán». Định danh là token đứng trước mũi tên, và khoảng trắng cắt ngang nó.
Cách sửa
Cho nút một định danh viết liền và đưa phần chữ dễ đọc vào nhãn. Dấu tiếng Việt trong định danh thì không sao — chỉ khoảng trắng mới làm hỏng.
flowchart TD
Đơn hàng --> Thanh toánflowchart TD
DonHang[Đơn hàng] --> ThanhToan[Thanh toán]Bạn thấy gì
Lexical error on line N. Unrecognized text. — mà định danh trông không có gì sai
Vì sao
Định danh được lưu ở dạng Unicode tổ hợp (NFD) thay vì dạng dựng sẵn (NFC). Chữ `ơ` có thể là một ký tự duy nhất, hoặc là `o` cộng một dấu móc tổ hợp; trên màn hình hai dạng giống hệt nhau. Đã đo: dạng NFC chạy được làm định danh, dạng NFD thì đổ. Ở vị trí nhãn thì cả hai đều bình thường và cho ra cùng một kích thước, nên lỗi chỉ lộ ra khi bạn dùng nó làm định danh. Đây là lỗi khó nhìn ra nhất trên trang này.
Cách sửa
Gõ lại định danh bằng bàn phím thay vì dán vào — hầu hết bộ gõ tiếng Việt đều sinh NFC. Chắc chắn hơn nữa là dùng định danh không dấu và để chữ có dấu ở nhãn, vì nhãn không bao giờ dính lỗi này.
flowchart TD
ĐơnHàng[Đơn hàng] --> B[Xong]flowchart TD
DonHang[Đơn hàng] --> B[Xong]Bạn thấy gì
Parse error, kết thúc bằng: got 'PS'
Lỗi kết thúc bằng: got 'PS'
Vì sao
Một dấu ngoặc đơn mở nằm trong nhãn nút. Trong Mermaid, ngoặc đơn là cú pháp hình dạng — A(văn bản) là nút bo tròn — nên một dấu ngoặc đơn trần bên trong ngoặc vuông bị đọc thành khởi đầu của một hình.
Cách sửa
Đặt nhãn trong dấu nháy. Mọi thứ bên trong dấu nháy đều được coi là văn bản, kể cả dấu ngoặc.
flowchart TD
A[Gọi ghiNo(đơn hàng)] --> B[Xong]flowchart TD
A["Gọi ghiNo(đơn hàng)"] --> B[Xong]Bạn thấy gì
Parse error, kết thúc bằng: got 'end'
Lỗi kết thúc bằng: got 'end'
Vì sao
Bạn đã dùng end làm định danh nút. Chữ end viết thường sẽ đóng một nhóm con, nên bộ phân tích thấy điểm kết thúc khối ở chỗ nó đang chờ một nút. Chuyện này hay xảy ra khi làm theo ví dụ tiếng Anh.
Cách sửa
Viết hoa chữ đó hoặc cho nút một định danh khác rồi chuyển chữ ấy vào nhãn. `KetThuc` không gây vấn đề gì.
flowchart TD
A[Bắt đầu] --> endflowchart TD
A[Bắt đầu] --> KetThuc[Đã hoàn tất]Bạn thấy gì
Vẽ được, nhưng trong sơ đồ trạng thái một trạng thái biến thành nhiều ô
Vì sao
Khoảng trắng trong định danh trạng thái. Khác với lưu đồ, sơ đồ trạng thái không phản đối: nó tạo một ô riêng cho mỗi âm tiết rồi vẽ ra tỉnh bơ. Đã đo — `[*] --> Chờ thanh toán` cho ra ba trạng thái là `Chờ`, `thanh` và `toán`, và chỉ cái đầu nối vào mũi tên. Tiếng Việt viết rời từng âm tiết nên đây là ngôn ngữ chịu thiệt nặng nhất ở lỗi này.
Cách sửa
Khai báo trạng thái bằng `state "Nhãn" as id` rồi chỉ tham chiếu tới nó qua định danh.
stateDiagram-v2
[*] --> Chờ thanh toán
Chờ thanh toán --> Đã hủystateDiagram-v2
state "Chờ thanh toán" as choThanhToan
[*] --> choThanhToan
choThanhToan --> DaHuyBạn thấy gì
Vẽ được, nhưng sơ đồ ER có những thực thể bạn không hề viết
Vì sao
Nhãn liên kết có khoảng trắng mà không có dấu nháy. Đây là cái bẫy gây phiền nhất với tiếng Việt, vì động từ quan hệ của ta hầu như đều nhiều chữ: «đặt hàng», «thuộc về». Mermaid không báo lỗi: nó cắt nhãn ở khoảng trắng đầu tiên rồi biến mỗi chữ còn lại thành một thực thể rỗng.
Cách sửa
Đặt dấu nháy quanh mọi nhãn liên kết có khoảng trắng. Với tiếng Việt thì gần như là tất cả.
erDiagram
KHACH_HANG ||--o{ DON_HANG : đặt hàngerDiagram
KHACH_HANG ||--o{ DON_HANG : "đặt hàng"Bạn thấy gì
No diagram type detected matching given configuration for text: sequencediagram
Vì sao
Từ khóa sơ đồ viết sai hoặc sai hoa thường. Từ khóa của Mermaid phân biệt hoa thường: sequenceDiagram chạy được, sequencediagram thì không. Với stateDiagram-v2 và erDiagram cũng vậy.
Cách sửa
Sửa lại hoa thường. Lưu ý graph vẫn được chấp nhận như bí danh cũ của flowchart, nên cú pháp cũ đó không phải vấn đề của bạn.
sequencediagram
Client->>API: Xin chàosequenceDiagram
Client->>API: Xin chàoBạn thấy gì
Parse error trong nhãn cạnh nằm giữa hai gạch đứng
Vì sao
Dấu ngoặc đơn nằm trong nhãn cạnh. Nhãn |...| chịu ràng buộc y hệt nhãn nút: ở đó ngoặc đơn cũng là cú pháp chứ không phải văn bản.
Cách sửa
Đặt nhãn cạnh trong dấu nháy.
flowchart TD
A -->|có (luôn luôn)| Bflowchart TD
A -->|"có (luôn luôn)"| BBạn thấy gì
Parse error chỉ vào dòng cuối cùng của sơ đồ
Vì sao
Một khối đã mở mà không bao giờ đóng: alt, opt, loop, par và subgraph đều đòi end của riêng chúng. Mermaid báo lỗi ở chỗ nó hết dữ liệu vào, nên số dòng chỉ vào cuối tệp chứ không chỉ vào khối còn dang dở.
Cách sửa
Đếm số khối đã mở và số end bạn đã viết. Nếu lỗi chỉ vào dòng cuối thì gần như luôn là chuyện này.
sequenceDiagram
Client->>API: Yêu cầu
alt Mọi thứ ổn
API-->>Client: OKsequenceDiagram
Client->>API: Yêu cầu
alt Mọi thứ ổn
API-->>Client: OK
endBạn thấy gì
Lexical error on line 1. Unrecognized text.
Vì sao
Hướng không hợp lệ sau từ khóa sơ đồ. Lưu đồ chỉ nhận TB, TD, BT, LR và RL, không có gì khác; một lỗi gõ sẽ đổ ngay ở bước phân tích từ vựng, trước khi đọc được dù chỉ một nút.
Cách sửa
Dùng một trong năm hướng hợp lệ. TD và LR bao gần hết mọi trường hợp.
flowchart XY
A --> Bflowchart TD
A --> BBạn thấy gì
Ở đây thì vẽ được, trên GitLab, Confluence hay một công cụ cũ thì không
Vì sao
Chênh lệch phiên bản. Trình xem này chạy Mermaid 11.12.2; GitLab.com ghi phiên bản 10, còn các wiki tự cài có thể lạc hậu nhiều năm. Cú pháp ra đời sau phiên bản của công cụ kia sẽ phân tích được ở đây và đổ ở đó.
Cách sửa
Hãy hỏi bộ máy kia đang chạy phiên bản nào. Viết mỗi chữ info trong một sơ đồ sẽ khiến Mermaid vẽ ra số phiên bản của chính nó, nhanh hơn là đọc nhật ký thay đổi.
infoCó một chuyện về mã hóa ký tự đáng nói riêng, vì với tệp tiếng Việt nó vẫn còn gây bất ngờ. Trang này và trình soạn thảo đọc tệp theo UTF-8 và bỏ dấu BOM nếu có, nên tệp lưu từ Notepad của Windows dạng «UTF-8 có BOM» mở ra bình thường. Nhưng tệp lưu theo các bảng mã cũ như VNI-Windows, TCVN3 hay VISCII — một số công cụ đời trước vẫn còn sinh ra — sẽ tới nơi với dấu tiếng Việt vỡ nát. Nếu chỗ đáng lẽ là chữ có dấu lại hiện ra những ký hiệu lạ, hãy lưu lại tệp theo UTF-8 từ trình soạn thảo của bạn.
Riêng với tiếng Việt còn một trường hợp tinh vi hơn hẳn: tệp đúng là UTF-8 nhưng lưu ở dạng tổ hợp (NFD) thay vì dạng dựng sẵn (NFC). Lúc này chữ hiện ra hoàn toàn bình thường, không có ký hiệu lạ nào, nhưng mọi định danh đều đổ với `Lexical error`. Nhãn thì vẫn chạy tốt ở cả hai dạng, nên sơ đồ có thể vẽ được một phần rồi hỏng ở chỗ khó hiểu. Nếu bạn gặp cảnh đó, hãy gõ lại định danh bằng tay hoặc chuyển sang định danh không dấu.
Và còn một thứ không hề báo lỗi: trên GitLab tự cài đặt, tiêu đề Cross-Origin-Resource-Policy đặt là same-site hoặc same-origin khiến sơ đồ Mermaid đổ trong im lặng. Không thông báo, không sơ đồ, không có gì trên trang. Nếu một sơ đồ vẽ được ở khắp nơi trừ đúng một bản cài riêng thì đó chính là chỗ cần xem.
Chuyển sang PNG, SVG hay PDF
Hãy mở tệp trong trình soạn thảo rồi dùng các nút xuất. SVG giữ sơ đồ dưới dạng văn bản véc-tơ, nên nó sắc nét ở mọi kích thước và nhãn thì chọn được, tìm được — đó là lựa chọn đúng cho tài liệu và cho mọi thứ có thể còn được xuất lại về sau. PNG là ảnh điểm, ở đây được xuất ở gấp hai đến ba lần kích thước hiển thị để còn trụ được trên màn hình mật độ cao; hãy dùng nó ở những nơi không nhận SVG, mà trên thực tế là phần lớn ứng dụng nhắn tin và một số wiki.
Không có nút PDF, và tôi thà viết ra điều đó còn hơn là làm ra vẻ có. Đường đi thực tế là xuất SVG rồi hoặc chèn vào tài liệu bạn đang soạn sẵn, hoặc in trang này ra PDF từ trình duyệt. Một tệp SVG véc-tơ chèn vào PDF vẫn giữ nguyên là véc-tơ.
Với mọi việc cần lặp lại — một bước dựng, một loạt tệp, một hook pre-commit — đã có bộ máy dòng lệnh chính thức @mermaid-js/mermaid-cli: nó nhận đúng tệp .mmd đó và ghi thẳng ra ảnh, không cần trình duyệt.
Câu hỏi thường gặp
Mở tệp .mmd trực tuyến bằng cách nào?
Chương trình nào mở được tệp .mmd?
Tệp .mmd có giống .mermaid không?
Vì sao tệp .mmd của tôi không vẽ ra trên GitHub?
Tôi có mở được .mmd mà không cài gì không?
Sơ đồ báo lỗi mà tôi nhìn mãi không thấy chỗ nào sai
Chữ tiếng Việt hiện ra thành ký hiệu lạ
Ở đây chạy được mà trên wiki của bọn tôi thì không. Tại sao?
Các loại sơ đồ bạn có thể mở ở đây
Viết bởi Dominik Malsch · Cập nhật lần cuối: