Lompat ke konten
dokumentasi.id
Commit 314576d
v1
Star2 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

7

Indeks Tag dan Halaman Tag

Penelusuran tag ditangani dua berkas yang bekerja terpisah. src/components/AllTags.astro menyusun daftar tag populer yang selalu tampil di sidebar, sedangkan src/pages/tags/[slug].astro menghasilkan satu halaman statis untuk setiap tag lewat getStaticPaths. Keduanya membaca collection tools dan menghitung tag sendiri-sendiri, tanpa modul bersama. Field tags sendiri hanya dideklarasikan sebagai z.array(z.string()) tanpa normalisasi, sehingga penulisan huruf besar-kecil dan spasi bergantung pada kontributor (src/content/config.ts:8). Aturan penulisan field itu dibahas di Format Berkas dan Aturan Kontribusi.

Pipeline agregasi di AllTags.astro

Komponen ini memuat seluruh entri lewat getCollection('tools'), meratakan obj.data.tags dengan flatMap, lalu menormalkan setiap elemen dengan trim().toLowerCase() (src/components/AllTags.astro:4-7). Setelah itu ia menghitung kemunculan tiap tag, mengurutkan menurun, dan memotong hasilnya pada maxTags = 20 (src/components/AllTags.astro:16-27).

graph TD
  A["getCollection('tools')"] --> B["allTags = flatMap(obj.data.tags)"]
  B --> C["trim + toLowerCase per index"]
  C --> D["tagCounts = reduce hitung kemunculan"]
  C --> E["uniqueTags = new Set(allTags)"]
  D --> F["sort descending by count"]
  F --> G["slice 0 sampai maxTags 20"]
  G --> H["tags: 20 nama tag"]
  H --> I["anchor href /tags/nama-tag"]
  E --> J["modal All Tags"]
  style A fill:#336791,color:#fff
  style D fill:#8b5cf6,color:#fff
  style E fill:#8b5cf6,color:#fff
  style G fill:#f59e0b,color:#000
  style I fill:#2d7d46,color:#fff
  style H fill:#2d7d46,color:#fff
%% fig: Alur agregasi tag di AllTags.astro
%% desc: Collection tools diratakan, dinormalkan, dihitung, lalu dipotong menjadi 20 tag teratas; cabang Set menyuplai modal semua tag.
Fig. 1: Alur agregasi tag di AllTags.astroCollection tools diratakan, dinormalkan, dihitung, lalu dipotong menjadi 20 tag teratas; cabang Set menyuplai modal semua tag.
LangkahEkspresi di kodeKeluaran
Muat collectionawait getCollection('tools')tools (src/components/AllTags.astro:4-7)
Ratakan tagtools.flatMap(obj => obj.data.tags)allTags berisi tag mentah
Normalisasi di tempatallTags[index] = tag.trim().toLowerCase()allTags lowercase tanpa spasi tepi
HitungtagCounts[tag] = (item[tag] atau 0) + 1Record<string, number>
Urutkan.sort((a, b) => b[1] - a[1])tag terbanyak lebih dulu
Potong.slice(0, maxTags) dengan maxTags = 20tags berisi 20 nama tag (src/components/AllTags.astro:16-27)

Angka 20 muncul dua kali di tampilan: sebagai batas slice dan sebagai teks judul blok, karena heading ditulis Top {maxTags} Tags (src/components/AllTags.astro:62-73). Anchor pada blok itu memakai href={/tags/${tag.trim().toLowerCase()}}, jadi nilai yang ditautkan sudah sama dengan slug hasil normalisasi.

Daftar lengkap di modal dan kontrol tampilan

uniqueTags dibuat dari new Set(allTags) sesudah normalisasi berjalan, sehingga isinya seluruh tag unik dalam bentuk lowercase (src/components/AllTags.astro:9-13). Set itu dipakai modal id="modal" untuk merender semua tag, bukan hanya 20 teratas (src/components/AllTags.astro:86-100). Tombol pembuka modal memanggil showAllTags() (src/components/AllTags.astro:76-82).

Ketiga handler toggleBtnTags, showAllTags, dan closeModal didefinisikan di blok script is:inline, lalu showAllTags dan closeModal dipasang ke window supaya bisa dipanggil dari atribut onclick di markup (src/components/AllTags.astro:33-50). Di layar kecil, blok daftar tag hidden lg:block dibuka lewat baris Show Categories yang memanggil toggleBtnTags() (src/components/AllTags.astro:52-57). Komponen ini dipasang di dalam sidebar, bukan di halaman tersendiri (src/layouts/Sidebar.astro:2), dan muncul di semua halaman yang memakai sidebar itu bersama dua tautan Submit+ dan Saved (src/layouts/Sidebar.astro:26-31). Susunan sidebar dan tema dibahas di Layout, Sidebar, dan Tema.

Rute statis lewat getStaticPaths

Rute tag seluruhnya dibangun saat build. getStaticPaths mengumpulkan post.data.tags, membentuk uniqueTags dengan new Set(tags), lalu mengembalikan satu entri per tag berisi params.slug dan props.tag (src/pages/tags/[slug].astro:7-21).

sequenceDiagram
  participant B as Build Astro
  participant G as getStaticPaths
  participant C as getCollection tools
  participant P as Tag page
  participant U as Layout Header Card
  B->>G: minta daftar path
  G->>C: baca semua entri tools
  C-->>G: data.tags per tool
  G->>G: uniqueTags = new Set(tags)
  G-->>B: params.slug dan props.tag
  B->>P: render dengan Astro.props.tag
  P->>C: getCollection dengan filter data.tags.includes
  C-->>P: tool yang cocok
  P->>U: title, description, Card per tool
%% fig: Siklus satu rute tag
%% desc: getStaticPaths menyiapkan path dan props saat build, lalu halaman memfilter ulang tools memakai props.tag dan merender Card.
Fig. 2: Siklus satu rute taggetStaticPaths menyiapkan path dan props saat build, lalu halaman memfilter ulang tools memakai props.tag dan merender Card.
BagianNilai
params.slugtag.toLowerCase()
props.tagtag apa adanya dari collection (src/pages/tags/[slug].astro:13-16)
Filter isi halamandata.tags.includes(tag.trim().toLowerCase())
Pembacaan propsconst tag = Astro.props.tag (src/pages/tags/[slug].astro:23-28)
JudulFree ${tag} tools or service for developers
DeskripsiA collection of free ${tag} app, tools or service for developers (src/pages/tags/[slug].astro:30-31)
IsiLayout dan Header dengan title serta description, lalu Card untuk setiap tool (src/pages/tags/[slug].astro:44-48)

⚠️ Normalisasi tidak seragam antar kedua berkas

AllTags.astro menormalkan tag sebelum menghitung, tetapi [slug].astro tidak. Di sana uniqueTags dibentuk dari tag mentah, dan toLowerCase() hanya dipakai saat mengisi params.slug (src/pages/tags/[slug].astro:13-16). Akibatnya dua penulisan berbeda bisa menghasilkan path yang sama. Contoh nyata ada di repository: satu tool menulis tags: ["IDE"] (src/content/tools/goorm.md:6), tool lain menulis tags: ["ide"] (src/content/tools/vscode_web.md:6). Keduanya menjadi slug: "ide", sehingga daftar path memuat dua entri dengan path identik.

BerkasNormalisasiIsi uniqueTags
src/components/AllTags.astrotrim().toLowerCase() per elemen sebelum new Settag unik lowercase (src/components/AllTags.astro:9-13)
src/pages/tags/[slug].astrotidak ada, toLowerCase() hanya untuk slugtag mentah, "IDE" dan "ide" tetap dua anggota (src/pages/tags/[slug].astro:13-16)

Efek keduanya terasa pada filter isi halaman, karena includes membandingkan string persis. Halaman dengan props.tag = "ide" mencari "ide", sehingga tool bertag "IDE" tidak ikut tampil (src/pages/tags/[slug].astro:23-28). Spasi di depan tag menimbulkan masalah serupa: tag " CSS" pada satu entri (src/content/tools/100devs.md:8) menghasilkan slug dengan spasi, sementara tag "css" pada entri lain (src/content/tools/scrollbar.md:6) menghasilkan slug tanpa spasi. Karena itu penulisan tag sebaiknya selalu lowercase dan tanpa spasi tepi. Ringkasan schema yang menjadi sumber semua nilai ini ada di Skema Content Collection tools, sedangkan cara data tool ditampilkan per kartu ada di Halaman Recent dan Pengurutan.