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ệ:

trien-khai.mmd — toàn bộ tệp, sáu dòng
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ơ đồ.

Sai
```mermaid
flowchart TD
    A[Bắt đầu] --> B[Kết thúc]
```
Đúng
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.

Sai
flowchart TD
    Đơn hàng --> Thanh toán
Đúng
flowchart 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.

Sai
flowchart TD
    ĐơnHàng[Đơn hàng] --> B[Xong]
Đúng
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.

Sai
flowchart TD
    A[Gọi ghiNo(đơn hàng)] --> B[Xong]
Đúng
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ì.

Sai
flowchart TD
    A[Bắt đầu] --> end
Đúng
flowchart 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.

Sai
stateDiagram-v2
    [*] --> Chờ thanh toán
    Chờ thanh toán --> Đã hủy
Đúng
stateDiagram-v2
    state "Chờ thanh toán" as choThanhToan
    [*] --> choThanhToan
    choThanhToan --> DaHuy

Bạ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ả.

Sai
erDiagram
    KHACH_HANG ||--o{ DON_HANG : đặt hàng
Đúng
erDiagram
    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.

Sai
sequencediagram
    Client->>API: Xin chào
Đúng
sequenceDiagram
    Client->>API: Xin chào

Bạ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.

Sai
flowchart TD
    A -->|có (luôn luôn)| B
Đúng
flowchart TD
    A -->|"có (luôn luôn)"| B

Bạ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.

Sai
sequenceDiagram
    Client->>API: Yêu cầu
    alt Mọi thứ ổn
        API-->>Client: OK
Đúng
sequenceDiagram
    Client->>API: Yêu cầu
    alt Mọi thứ ổn
        API-->>Client: OK
    end

Bạ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.

Sai
flowchart XY
    A --> B
Đúng
flowchart TD
    A --> B

Bạ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.

Đúng
info

Có 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?
Thả nó vào khung ở đầu trang này. Sơ đồ được vẽ trong trình duyệt của bạn, không cần tải lên và không cần tài khoản. Bạn cũng có thể mở trình soạn thảo rồi kéo tệp vào khung xem trước.
Chương trình nào mở được tệp .mmd?
Mã nguồn thì trình soạn thảo văn bản nào cũng hiện được, vì tệp là văn bản thuần. Muốn thấy sơ đồ thì cần thứ gì đó vẽ được Mermaid: trang này, trình soạn thảo ở đây, hoặc công cụ dòng lệnh mermaid-cli. Không có ứng dụng máy tính để bàn nào sở hữu phần mở rộng .mmd cả.
Tệp .mmd có giống .mermaid không?
Có. Hai phần mở rộng chứa nội dung giống hệt và thay thế được cho nhau. .mmd phổ biến hơn và là thứ mà công cụ dòng lệnh chính thức dùng mặc định.
Vì sao tệp .mmd của tôi không vẽ ra trên GitHub?
GitHub chỉ vẽ Mermaid bên trong các khối có rào ```mermaid trong tệp Markdown, issue, Discussions, pull request và wiki. Một tệp .mmd đứng riêng được hiện ra dưới dạng mã nguồn. Hãy đặt đúng sơ đồ đó vào một khối có rào trong tệp .md để nó hiện trên GitHub.
Tôi có mở được .mmd mà không cài gì không?
Có — trang này sinh ra để làm việc đó. Việc vẽ chạy bằng JavaScript ngay trong trình duyệt của bạn, nên không có gì để cài và tệp không bao giờ rời khỏi máy bạn.
Sơ đồ báo lỗi mà tôi nhìn mãi không thấy chỗ nào sai
Với tiếng Việt, khả năng cao là một trong hai chuyện. Một là khoảng trắng giữa các âm tiết trong một định danh — đó là lỗi hay gặp nhất. Hai là dạng Unicode tổ hợp (NFD): chữ hiện ra đúng y như bình thường nhưng định danh vẫn đổ với `Lexical error`. Trong cả hai trường hợp, dùng định danh không dấu viết liền và để chữ có dấu ở nhãn là cách chắc chắn nhất.
Chữ tiếng Việt hiện ra thành ký hiệu lạ
Tệp không phải UTF-8. Trang này đọc tệp theo UTF-8 và xử lý được dấu BOM, nhưng tệp lưu theo VNI-Windows, TCVN3 hay VISCII sẽ tới nơi với dấu bị hỏng. Hãy lưu lại theo UTF-8 từ trình soạn thảo của bạn.
Ở đây chạy được mà trên wiki của bọn tôi thì không. Tại sao?
Gần như luôn là chênh lệch phiên bản. Trình xem này chạy Mermaid 11.12.2, còn nhiều wiki chạy bản cũ hơn — GitLab.com ghi phiên bản 10. Hãy viết chữ info trong một sơ đồ trên hệ thống kia để nó in ra phiên bản đang chạy.

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:

Mở trình soạn thảo →