{
  "url": "https://unifast.dev/vi/docs/introduction/key-concepts/",
  "locale": "vi",
  "title": "Các khái niệm cốt lõi",
  "description": "Tìm hiểu về pipeline biên dịch đa tầng của unifast, các pass tích hợp sẵn, và cách các phép biến đổi MdAst và HAst hoạt động.",
  "section": "introduction",
  "body": "unifast biên dịch Markdown thông qua một pipeline đa tầng. Việc hiểu rõ các giai đoạn này sẽ giúp bạn cấu hình trình biên dịch và lựa chọn đúng plugin phù hợp.\n\n### Pipeline biên dịch\n\n```\nInput text\n  → Parse (Markdown or MDX)\n  → IR0: MdAst (Markdown structure)\n  → Normalize + Built-in MdAst passes\n  → Lower to IR1: HAst (HTML structure)\n  → HAst passes (sanitize, highlight, etc.)\n  → Emit (HTML string)\n```\n\nMỗi giai đoạn biến đổi tài liệu thông qua một biểu diễn trung gian (intermediate representation - IR).\n\n### Các biểu diễn trung gian\n\n| IR | Tên | Mục đích |\n|----|------|---------|\n| **IR0** | MdAst | Cấu trúc Markdown - tiêu đề, đoạn văn, danh sách, khối mã |\n| **IR1** | HAst | Cấu trúc HTML - phần tử, thuộc tính, nút văn bản |\n| **IR2** | JsAst | Chỉ dành cho MDX - các import ESM và biểu thức JSX |\n\nParser sinh ra **MdAst**, sau đó được hạ xuống thành **HAst** để xuất ra HTML. Với đầu vào MDX, trình biên dịch còn sinh thêm các nút **JsAst** cho phần đầu ra JavaScript.\n\n### Passes\n\nPass là các phép biến đổi được áp dụng lên AST ở những giai đoạn cụ thể. unifast tích hợp sẵn các pass cho những tác vụ phổ biến:\n\n**MdAst passes** (trước khi hạ xuống HTML):\n\n- **Normalize** - Chuẩn hóa cấu trúc để phục vụ các pass phía sau\n- **Slug** - Sinh ID cho tiêu đề từ nội dung văn bản\n- **TOC** - Trích xuất mục lục từ các tiêu đề\n- **Definition Resolution** - Phân giải các định nghĩa tham chiếu link/image\n\n**HAst passes** (sau khi hạ xuống HTML):\n\n- **Sanitize** - Loại bỏ các phần tử và thuộc tính HTML không được phép\n- **Highlight** - Áp dụng syntax highlighting cho khối mã\n- **Cleanup** - Loại bỏ các nút và khoảng trắng không cần thiết\n\nCác pass được sắp xếp theo phase - bạn không cần lo lắng về thứ tự thực thi.\n\n### Plugins\n\nPlugin là các gói TypeScript dùng để cấu hình các pass tích hợp sẵn. Chúng không chạy JavaScript tùy ý trong quá trình biên dịch - thay vào đó, chúng thiết lập các tùy chọn để điều khiển cách lõi Rust xử lý tài liệu của bạn.\n\n```ts\nimport { compile, gfm, sanitize } from \"@unifast/node\";\n\nconst result = compile(source, {\n  plugins: [gfm(), sanitize()],\n});\n```\n\nMỗi plugin trả về một đối tượng cấu hình được gộp vào các tùy chọn biên dịch trước khi lõi Rust chạy. Nhờ vậy, đường dẫn xử lý chính (hot path) hoàn toàn nằm trong mã native.\n\n### Định dạng đầu ra\n\nTrình biên dịch hỗ trợ nhiều định dạng đầu ra thông qua tùy chọn `outputKind`:\n\n| Định dạng | Mô tả |\n|--------|-------------|\n| `\"html\"` | Chuỗi HTML (mặc định) |\n| `\"hast\"` | HAst JSON - AST của HTML để render tùy biến |\n| `\"mdast\"` | MdAst JSON - AST của Markdown để phân tích |\n| `\"mdx-js\"` | Chuỗi JavaScript module (chỉ dành cho MDX) |\n\n### Diagnostics\n\nTrình biên dịch báo cáo các vấn đề thông qua mảng `diagnostics` trong kết quả. Mỗi diagnostic bao gồm mức độ nghiêm trọng, thông điệp, và vùng nguồn tùy chọn để xác định chính xác vị trí lỗi.\n\n```ts\nconst result = compile(source);\n\nfor (const d of result.diagnostics) {\n  console.warn(`[${d.level}] ${d.message}`);\n}\n```",
  "alternates": [
    {
      "locale": "en",
      "url": "https://unifast.dev/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/docs/introduction/key-concepts.json"
    },
    {
      "locale": "ja",
      "url": "https://unifast.dev/ja/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/ja/docs/introduction/key-concepts.json"
    },
    {
      "locale": "zh-CN",
      "url": "https://unifast.dev/zh-CN/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/zh-CN/docs/introduction/key-concepts.json"
    },
    {
      "locale": "zh-TW",
      "url": "https://unifast.dev/zh-TW/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/zh-TW/docs/introduction/key-concepts.json"
    },
    {
      "locale": "ko",
      "url": "https://unifast.dev/ko/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/ko/docs/introduction/key-concepts.json"
    },
    {
      "locale": "fr",
      "url": "https://unifast.dev/fr/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/fr/docs/introduction/key-concepts.json"
    },
    {
      "locale": "it",
      "url": "https://unifast.dev/it/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/it/docs/introduction/key-concepts.json"
    },
    {
      "locale": "es",
      "url": "https://unifast.dev/es/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/es/docs/introduction/key-concepts.json"
    },
    {
      "locale": "pt-BR",
      "url": "https://unifast.dev/pt-BR/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/pt-BR/docs/introduction/key-concepts.json"
    },
    {
      "locale": "de",
      "url": "https://unifast.dev/de/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/de/docs/introduction/key-concepts.json"
    },
    {
      "locale": "ru",
      "url": "https://unifast.dev/ru/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/ru/docs/introduction/key-concepts.json"
    },
    {
      "locale": "hi",
      "url": "https://unifast.dev/hi/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/hi/docs/introduction/key-concepts.json"
    },
    {
      "locale": "id",
      "url": "https://unifast.dev/id/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/id/docs/introduction/key-concepts.json"
    },
    {
      "locale": "tr",
      "url": "https://unifast.dev/tr/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/tr/docs/introduction/key-concepts.json"
    },
    {
      "locale": "vi",
      "url": "https://unifast.dev/vi/docs/introduction/key-concepts/",
      "api": "https://unifast.dev//api/vi/docs/introduction/key-concepts.json"
    }
  ]
}
