Akhir akhir ini saya telah melakukan migrasi website ini dari gatsby.js ke astro.js, dan sekarang saya ingin mencoba meningkatkan fitur pencarian di halaman ini.
Saat masih menggunakan gatsby, saya mengandalkan Lunr sebagai sistem pencarian. Namun, karena library tersebut sepertinya kurang dimaintain, saya mulai mencari alternatif yang lain.
Perkenalkan Fuse.js
Fuse.js merupakan library pencarian yg menggunakan metode fuzzy searching. Fuzzy searching merupakan teknik untuk mencari sebuah kata yang mirip atau mendekati dengan pola-pola tertentu (tidak 100% harus sama dengan keyword yg kita cari).
Kenapa menggunakan Fuse.js?
Tanpa Pengaturan Backend: Kita tidak perlu melakukan setup backend hanya untuk sistem pencarian
Ringan dan bebas dependency: Fuse.js sangat ringan dan tidak bergantung ke dependency lain.
Persiapan
Ada beberapa hal yg perlu kita persiapkan sebelum memulai membuat komponen.
Alpine sudah terinstall.
Karena project yg kita buat membutuhkan alpine.js, pastikan di project astro kalian juga sudah terinstall. jika belum, bisa cek
Integrasi Alpine.js
Menginstall Fuse.js
Cara menggunakan Fuse.js
Untuk menggunakan fuse.js sangat mudah.
ketika kita console hasil pencarian akan muncul hasil seperti berikut:
Ketika melakukan pencarian, fuse akan menampilkan hasil data pencarian berdasarkan keyword yang kita masukkan sesuai data yg relevan.
Demo
Klik tombol dibawah ini untuk melihat Demo Search Modal.
Membuat Komponen Modal.
Pada contoh ini saya akan membuat sebuah halaman baru di pages/search/index.astro. Di dalam halaman tersebut, kita akan mengimpor komponen <Search />.
Di dalam komponen <Search/>, kita akan membuat sebuah tombol. Ketika tombol tersebut diklik, akan muncul modal pencarian. Namun, sebelum itu, tambahkan style berikut:
Selanjutnya buat komponen search seperti contoh berikut
Kita telah berhasil membuat button & modal sederhana, tampilan yang kalian buat akan sama seperti contoh dibawah ini:
Implementasi Fuse.js
Selanjutnya, kita akan menambahkan fitur pencarian pada komponen yang sudah kita buat dengan mengimplementasikan fitur dari Fuse.js
Hasil pencarian anda sekarang akan tampil seperti berikut.
Kita telah berhasil melakukan pencarian sederhana, tetapi data yang kita cari dari contoh di atas hanya berupa array. Kita dapat mengganti data tersebut dengan data dari halaman artikel yang ada di website kita.
Membuat Endpoint
Disini kita akan membuat sebuah endpoint pada halaman astro.js untuk mengekspos semua halaman-halaman yang ingin kita masukkan ke fitur pencarian.
Untuk membuatnya kita perlu membuat file dengan nama search.json.js di dalam folder pages.
contoh:
kita dapat lihat endpoint tersebut dengan mengakses ke halaman /search.json di url. berikut merupakan contoh jika kita telah berhasil membuat endpoint
Update Search Component
Kita perlu mengupdate komponen search kita agar dapat mengambil data menggunakan fetch ke endpoint yang telah kita buat sebelumnya.
Kita dapat menambahkan limit pada hasil pencarian. Dalam contoh ini, saya akan membatasi hasil yang ditampilkan hanya sebanyak 5 item.
Sekarang kita sudah bisa melakukan pencarian berdasarkan data blog dari website kita.
Pre Generated Index
Langkah terakhir yang dapat kita implementasikan adalah membuat pre-generated fuse index. Dalam contoh yang sudah kita terapkan, index digenerate tiap ada request pencarian. Pendekatan ini tidak masalah selama kita tidak memiliki ratusan atau ribuan data.
Namun, jika kamu tetap ingin membuat pre-generated index, kita akan melakukannya di dalam API yang telah kita buat sebelumnya.
Silakan update file search.json.js seperti contoh di bawah ini.
Dan yang terakhir, kita update juga komponen Search agar menggunakan data dari index
Untuk mempelajari lebih lanjut bisa cek dokumentasi tentang Fuse.js index.
Catatan
Sampai saat ini. kalian bisa tingkatkan sendiri tampilannya serta bisa juga tambahkan untuk fitur handle loading maupun penanganan error saat fetch. Selain menggunakan fetch dan useEffect kalian bisa juga gunakan alternatif lainnya seperti TanStack/React Query.
Kesimpulan
Kita telah belajar cara mengimplementasikan fitur search di aplikasi Astro.js menggunakan Fuse.js. Mulai Dari persiapan awal hingga pembuatan modal pencarian dan integrasi dengan alpine, hingga setup endpoint dan juga indexing pre-generate yang membantu dalam proses pencarian, terutama saat menangani data dalam jumlah besar.
Jangan ragu untuk mengupdate tampilan serta fungsionalitas pencarian sesuai dengan kebutuhan anda. Dengan dasar yang telah dibangun di sini, anda bisa mengeksplorasi lebih lanjut berbagai cara untuk meningkatkan fitur pencarian pada website anda.
Fuse.js merupakan tools yang fleksibel, ringan & simple. Hasil pencarian yg ditawarkan Fuse.js memang kadang tidak sempurna. Namun selama pencarian kita tidak membutuhkan akurasi yang tinggi, Fuse.js sudah lebih dari cukup.