Jadi ceritanya aku lagi asik-asiknya bikin halaman blog di portfolio. Semuanya jalan lancar โ sampai aku sadar ada yang aneh.
Di halaman /en, link ke artikel blog mengarah dengan benar ke /en/blogs/nama-artikel. Tapi begitu aku buka /en/blogs, link yang sama malah mengarah ke /en/en/blogs/nama-artikel. Ada /en yang dobel. Aneh banget.
Investigasi
Aku mulai curiga di komponen Blog โ khususnya bagian href-nya:
<Link href={`${lang}/blogs/${blog.slug}`}>{blog.frontmatter.title}</Link>Kelihatannya normal. Tapi setelah aku perhatikan lagi, ternyata tidak ada / di depan. Aku ubah jadi:
<Link href={`/${lang}/blogs/${blog.slug}`}>{blog.frontmatter.title}</Link>Dan langsung fixed. Sesederhana itu. Tapi kenapa?
Kenapa Ini Terjadi?
Ternyata ini bukan bug Next.js โ ini perilaku standar URL yang sudah ada sejak lama.
Tanpa / di depan, browser memperlakukannya sebagai relative path โ path yang dihitung relatif terhadap URL halaman saat ini.
URL saat ini: /en
href: en/blogs/artikel
hasil: /en/blogs/artikel โ
URL saat ini: /en/blogs
href: en/blogs/artikel
hasil: /en/blogs/en/blogs/artikel โ
Sedangkan dengan / di depan, browser memperlakukannya sebagai absolute path โ selalu dihitung dari root, tidak peduli halaman mana yang sedang dibuka.
URL saat ini: /en โ /en/blogs/artikel โ
URL saat ini: /en/blogs โ /en/blogs/artikel โ
URL saat ini: /en/projects โ /en/blogs/artikel โ
Apakah Dokumentasi Next.js Menyebutkan Ini?
Aku langsung cek dokumentasi Next.js. Dan jawabannya โ tidak secara eksplisit.
Dokumentasi Next.js di bagian <Link> hanya menunjukkan contoh dengan absolute path seperti /about, /blog/post, tanpa pernah secara khusus memperingatkan tentang bahaya relative path. Perilaku ini dianggap sudah dipahami sebagai standar web โ bukan sesuatu yang perlu dijelaskan ulang.
Jadi kalau kamu mengharapkan Next.js yang akan mengingatkan kamu soal ini โ tidak akan. Ini murni pengetahuan dasar URL yang ternyata masih bisa bikin kita kecolongan, terutama saat kita sedang fokus ke hal lain.
Pelajaran yang aku ambil: kalau ada dynamic segment seperti lang di URL, selalu gunakan absolute path.
// โ jangan
href={`${lang}/blogs/${slug}`}
// โ
selalu
href={`/${lang}/blogs/${slug}`}Dan untuk komponen global atau reusable yang bisa dipakai di berbagai halaman โ pastikan semua href yang masuk selalu diawali dengan /. Tanggung jawab ada di si pemanggil komponen, bukan di komponen itu sendiri.
Moral of the story: kadang bug paling sederhana justru yang paling lama dicarinya. Dan ya โ sepertinya aku memang harus lebih banyak baca dokumentasi. Wkwkwk.
