Part 1 - Membuat Web Blog Static Dengan Astro JS

Persiapan dan konfigurasi awal dalam membuat website blog dengan Static Site Generator (SSG) dari Astro

profile of Andika Saputra
· 5 min read · published on

opening book

Salah satu keunggulan membangun website dengan astro adalah performanya yang sangat kencang. Di artikel tutorial ini saya akan membahas pembuatan web blog dengan Astro js dengan menggunakan fitur content collection, dan digenerate menjadi static site.

Beberapa fitur blog yang akan dibuat antara lain :

  • Pagination
  • Topik / Kategori
  • Tags

Persiapan Kebutuhan

Pastikan beberapa hal di bawah ini telah terinstall di dalam komputer.

  • NodeJS
  • Code Editor
  • Web Browser

Install Astro

Setelah semua kebutuhan siap, selanjutnya adalah inisialisasi project astro dengan command npm create astro@latest. Isi beberapa inputan yang diperlukan.

npm create astro@latest         
Need to install the following packages:
[email protected]
Ok to proceed? (y) y

 astro   Launch sequence initiated.

   dir   Where should we create your new project?
         ./tutorial-blog

  tmpl   How would you like to start your new project?
         Empty

    ts   Do you plan to write TypeScript?
         Yes

   use   How strict should TypeScript be?
         Strict

  deps   Install dependencies?
         Yes

   git   Initialize a new git repository?
         Yes

  Project initialized!
 Template copied
 TypeScript customized
 Dependencies installed
 Git initialized

  next   Liftoff confirmed. Explore your project!

         Enter your project directory using cd ./tutorial-blog 
         Run npm run dev to start the dev server. CTRL+C to stop.
         Add frameworks like react or tailwind using astro add.

         Stuck? Join us at https://astro.build/chat

╭─────╮  Houston:
  Good luck out there, astronaut! 🚀
╰─────╯

Berikut adalah penjelasan dari beberapa poin di atas.

   dir   Where should we create your new project?
         ./tutorial-blog

Membuat project dan directory dengan nama tutorial-blog

  tmpl   How would you like to start your new project?
         Empty

Membuat project dengan template project kosong. Artinya, hanya ada file - file konfigurasi dasar dari astro, dan satu halaman astro.

    ts   Do you plan to write TypeScript?
         Yes

Di dalam tutorial ini, saya akan menggunakan TypeScript, karena saat ini, TypeScript sudah menjadi standar industri.

   use   How strict should TypeScript be?
         Strict

Mode TypeScript strict lebih dapat memastikan tidak boleh terjadi kesalahan tipe data dalam program yang dibuat. Dan mode ini direkomendasikan oleh astro.

  deps   Install dependencies?
         Yes

Pilih yes agar dependensi awal yang diperlukan oleh astro diinstall sekalian dalam tahap pembuatan project ini.

   git   Initialize a new git repository?
         Yes

Pilih yes agar perintah git init juga akan dijalankan otomatis pada tahap pembuatan project ini.

  Project initialized!
 Template copied
 TypeScript customized
 Dependencies installed
 Git initialized

  next   Liftoff confirmed. Explore your project!

         Enter your project directory using cd ./tutorial-blog 
         Run npm run dev to start the dev server. CTRL+C to stop.
         Add frameworks like react or tailwind using astro add.

         Stuck? Join us at https://astro.build/chat

╭─────╮  Houston:
  Good luck out there, astronaut! 🚀
╰─────╯

Project telah selesai dibuat dengan struktur kira - kira seperti di bawah ini, dan siap dikembangkan menjadi sebuah website blog.

├── astro.config.mjs
├── package.json
├── package-lock.json
├── public
│   └── favicon.svg
├── README.md
├── src
│   ├── env.d.ts
│   └── pages
│       └── index.astro
└── tsconfig.json

File Config Untuk Content Collection

Buatlah file dengan nama config.ts di dalam directory src/content. Pastikan nama file-nya adalah config.ts, dan nama directory-nya adalah content.

File ini digunakan untuk membuat konfigurasi dari koleksi konten (content collection) yang akan dibuat. Berikut adalah file config.ts yang dibuat untuk tutorial kali ini.

import { defineCollection, reference, z } from "astro:content";

/**
 * membuat collection / koleksi data dengan nama blog
 * dan koleksi data ini harus dimasukkan ke dalam
 * directory `blog` (saat ini belum dibuat)
 */
const blog = defineCollection({
  type: "content", // data blog ini akan berupa markdown / mdx
  /**
   * konten markdown harus memiliki data seperti di bawah ini.
   * schema ini bisa langsung berupa object, atau berupa fungsi
   * seperti di bawah ini. Jika sebagai fungsi, akan memiliki
   * parameter dengan tipe data `SchemaContext`, dan di dalam
   * `SchemaContext` tersebut ada sebuah fungsi `image` untuk
   * memvalidasi data image
   */
  schema: ({ image }) =>
    z.object({
      title: z.string(),
      category: z.string(),
      tags: z.array(z.string()),
      image: z.object({
        src: image(),
        alt: z.string(),
      }),
      /**
       * data author ini akan merujuk ke koleksi / collection
       * authors yang ada di bawah. Data author ini harus
       * berisi nama file yang ada di directory authors (saat ini belum dibuat)
       */
      author: reference("authors"),
      pubDate: z.date(),
    }),
});

/**
 * membuat collection / koleksi data dengan nama authors
 * dan koleksi data ini harus dimasukkan ke dalam
 * directory `authors` (saat ini belum dibuat)
 */
const authors = defineCollection({
  type: "data", // data authors ini akan berupa json / yml
  schema: z.object({
    name: z.string(),
    avatar: z.string(),
  }),
});

// data harus diexport melalui variable `collections`
export const collections = { blog, authors };

Beberapa penjelasan sudah dituliskan di dalam komentar di atas. z di atas sebenarnya adalah library zod yang digunakan untuk validasi dan juga pembuatan schema koleksi konten (content collection).