ข้ามไปยังเนื้อหา

สถาปัตยกรรม

ตัวสร้างเอกสาร (docs builder) เป็นระบบ Astro + Starlight ที่ทำงานในคอนเทนเนอร์ รีโปเนื้อหาจัดเตรียมไฟล์ Markdown/MDX ส่วนตัวสร้างจัดเตรียมเฟรมเวิร์ก ธีม และลอจิกการ build ทั้งสองส่วนมาพบกันในเวลา build ภายในคอนเทนเนอร์ Docker

รีโปเนื้อหาเก็บเอกสารไว้ในไดเรกทอรี docs/ ในเวลา build คอนเทนเนอร์จะคัดลอกไฟล์เหล่านั้นไปยัง src/content/docs/ ซึ่ง content collection ของ Astro จะนำไปใช้งาน

content-repo/
docs/ ← เขียนโดยทีมเนื้อหา
index.mdx
guide.mdx
docs-builder/
src/content/docs/ ← ว่างเปล่าในสภาวะปกติ (.gitkeep)

สคริปต์ entrypoint (docker/entrypoint.sh) ทำการคัดลอก:

Terminal window
cp -r "$CONTENT_DIR"/* /app/src/content/docs/

ซึ่งหมายความว่ารีโปตัวสร้างจะมีไดเรกทอรี src/content/docs/ ที่ว่างเปล่า เนื้อหาจะปรากฏเฉพาะในเวลา build เท่านั้น

ธีม Starlight ถูกเผยแพร่เป็นแพ็กเกจ npm แยกต่างหาก package.json ใช้ npm alias เพื่อแมปชื่อย่อไปยังแพ็กเกจในรีจิสทรีที่กำหนดขอบเขต:

"@f5-sales-demo/docs-theme": "^1.29.0"

แพ็กเกจธีมเป็นเจ้าของ astro.config.mjs ในเวลา build สคริปต์ entrypoint จะคัดลอกไปยังรูทของโปรเจกต์:

Terminal window
cp /app/node_modules/@f5-sales-demo/docs-theme/astro.config.mjs /app/astro.config.mjs

วิธีนี้ทำให้การกำหนดค่ารวมศูนย์อยู่ที่เดียว — รีโปเนื้อหาและตัวสร้างเองไม่ต้องดูแลไฟล์ Astro config ของตัวเอง

src/
components/
PlaceholderForm.tsx # ฟอร์ม React สำหรับแก้ไขค่า placeholder
PlaceholderFormWrapper.astro # Astro wrapper โหลดสคริปต์ DOM และ CSS ส่วนกลาง
content/
docs/ # จุดเมาท์สำหรับเนื้อหาที่นำเข้า
content.config.ts # คำจำกัดความ content collection ของ Starlight
data/
placeholders.json # คำจำกัดความโทเค็น placeholder
lib/
placeholder-store.ts # การจัดการ state: โหลด บันทึก คำนวณ ส่งเหตุการณ์
scripts/
placeholder-dom.ts # DOM walker ฝั่งไคลเอนต์ และตัวเรนเดอร์ Mermaid

src/content.config.ts กำหนดคอลเลกชัน docs เดียวโดยใช้ loader และ schema ของ Starlight:

import { defineCollection } from 'astro:content';
import { docsLoader } from '@astrojs/starlight/loaders';
import { docsSchema } from '@astrojs/starlight/schema';
export const collections = {
docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
};

ไฟล์ .md หรือ .mdx ใดๆ ที่วางไว้ใน src/content/docs/ จะกลายเป็นหน้าหนึ่งในเว็บไซต์ที่ build แล้ว

แผนภาพต่อไปนี้แสดง pipeline การ build ตั้งแต่ต้นจนจบเมื่อคอนเทนเนอร์ Docker ทำงาน:

flowchart LR
    A[Content Repo<br/>docs/] -->|mount| B[Container<br/>/content/docs]
    B -->|entrypoint.sh<br/>cp| C[src/content/docs/]
    D[npm registry] -->|npm install| E[node_modules/<br/>@f5-sales-demo/docs-theme]
    E -->|cp astro.config| F[astro.config.mjs]
    C --> G[astro build]
    F --> G
    G --> H[dist/<br/>static HTML]
    H -->|cp| I[/output]
ข้อกังวลเมื่อไหร่อย่างไร
MDX → HTMLเวลา buildคอมไพเลอร์ Astro
บล็อกโค้ด Mermaid → container divsเวลา buildปลั๊กอิน remark-mermaid.mjs (จาก docs-theme)
โทเค็น placeholder → span แบบโต้ตอบได้เวลาไคลเอนต์TreeWalker ของ placeholder-dom.ts
การเรนเดอร์ Mermaid SVGเวลาไคลเอนต์mermaid CDN import ใน placeholder-dom.ts
state ของฟอร์ม placeholderเวลาไคลเอนต์placeholder-store.ts + localStorage
การเปลี่ยนหน้า Astroเวลาไคลเอนต์event listener ของ astro:page-load