JSX adalah sebuah ekstensi sintaks javascript. Walaupun dipopulerkan oleh React, tapi JSX tidak sama dengan React. Ada banyak framework lain yang menggunakannya seperti Preact, Inferno, dan Solid. Pada artikel kali ini, saya akan pakai JSX sebagai view engine untuk Express.js
Kenapa JSX?
Karena pada dasarnya jsx adalah javascript, sehingga semua tools yang tersedia untuk javascript bisa kita pakai untuk membangun UI yang menarik. Kalau butuh satu function tinggal import atau bikin langsung di file yang sama.
Berbeda sekali dibandingkan menggunakan template engine seperti pug, ejs, nunjucks, dkk. Yang masing-masingnya memiliki sintaks sendiri dan kalau mau menambahkan satu fungsi helper perlu diregistrasikan dulu ke enginenya atau didaftarkan sebagai local variable di express.
Sebenarnya ada library yang sudah jadi yang menggunakan jsx di expressjs, tapi semuanya depends ke React. Saya ingin sesuatu yang sederhana dan hanya memproduksi plain html. Karena ga ketemu yang cocok, saya putuskan untuk mencoba membuatnya sendiri.
Setelah membaca halaman Developing template engines for Express, saya berkesimpulan sepertinya membuat custom template engine bukan hal yang sulit. Express hanya butuh disediakan satu callback dengan signature (filePath, options, callback) => void
-
filePath
adalah lokasi file yang diinvoke denganres.render
. Misalnya jika diinvokeres.render('index')
, value filePath adalah/absolute/path/to/index.jsx
-
options
adalah value dari parameter keduares.render
digabung dengan value lain yang disediakan oleh express. -
callback
adalah function yang harus diinvoke dengan hasil rendering dalam bentuk string.
Ada satu library bagus yang mengubah jsx element menjadi plain html string yang bisa dipakai sebagai dasar untuk percobaan membuat view engine expressjs. Yaitu vhtml yang dibuat oleh creator preact.
Untuk mentransformasi jsx menjadi javascript normal dengan vhtml
function call, kita perlu menggunakan babel dengan plugin @babel/plugin-transform-react-jsx.
Berikutnya agar bisa mengimport css dan menggunakan css-in-js, saya tambahkan webpack dengan css-loader. Untuk css-in-js, saya menggunakan linaria dengan linaria/loader untuk webpack. Dan tentu saja tidak lupa tambahan konfigurasi untuk tailwindcss.
Hasil jadi dari percobaan ini bisa diakses di https://whatsmyip.fly.dev.
Seperti inilah code untuk halaman home yang dibuat dengan jsx, dan menggunakan kombinasi linaria + tailwindcss untuk styling.
Kenapa saya pakai linaria + tailwind, gak cuma tailwind aja? Karena hasil markup akhir terlihat lebih rapi dengan satu class saja, dan juga lebih gampang untuk mengkombinasikan tailwind dengan custom css yang kita tambahkan sendiri seandainya diperlukan.
Source code lengkapnya tersedia di
referensi:
Top comments (0)