Dalam mengembangkan aplikasi, salah satu bagian yang paling penting adalah bagian antarmuka pengguna. Antarmuka pengguna penting karena bagian inilah yang paling banyak dilihat dan berinteraksi dengan pengguna. Pada kebanyakan kasus, kualitas dari antarmuka merupakan penentu dari keberhasilan perangkat lunak tersebut. Show Dalam dunia web, antarmuka pengguna direpresentasikan dengan HTML dan CSS. Tampilan yang dihasilkan dengan HTML dan CSS kemudian dapat kita kembangkan menjadi interaktif dengan Javascript. Pada bagian Request dan Response kita telah melihat bagaimana aplikasi web pada dasarnya hanya merupakan pembentuk HTTP Response dinamis, berdasarkan sumber daya tertentu. Bentuk paling umum dari HTTP Response yang diberikan ke pengguna adalah kombinasi antara HTML, CSS, dan Javascript. CSS dan Javascript umumnya bersifat statis, karena kedua bagian ini hanya berisi kode untuk mengatur tampilan dan interaksi. HTML, sebagai bagian yang mendefinisikan tampilan lah yang selalu bersifat dinamis, berubah sesuai dengan data atau informasi yang ingin ditampilkan. Perubahan yang ada pada HTML juga seringkali tidak 100% sesuai dengan data. Misalnya, bagian logo dan menu aplikasi umumnya selalu sama pada setiap halaman, tetapi bagian isi selalu berbeda-beda. Untuk dapat menghasilkan HTML yang bersifat setengah dinamis, kita dapat memanfaatkan sebuah sistem yang dikenal dengan sistem templating. Sistem templating memanfaatkan Template Engine untuk menghasilkan keluaran yang diinginkan. Apa itu template engine? Perhatikan gmabar berikut: Berdasarkan gambar di atas, kita dapat mendefinisikan template engine sebagai sebuah (komponen) perangkat lunak yang dirancang untuk menggabungkan sebuah template (contoh) dengan data untuk dijadikan dokumen hasil. Pada umumnya di dunia web, dokumen yang dihasilkan oleh template engine merupakan dokumen HTML, walaupun tidak jarang juga kita menghasilkan data lain seperti PDF atau JSON. Pada beberapa kasus ekstrim, template engine bahkan digunakan untuk menghasilkan kode program tertentu berdasarkan masukan pengguna. Fitur Umum Template Engine¶Sebagai komponen perangkat lunak yang kerap digunakan dalam berbagai lingkungan dan situasi, template engine memiliki beberapa fitur umum, yaitu:
Seperti yang dapat dilihat di atas, template engine pada umumnya memiliki fitur yang mirip dengan sebuah bahasa pemrograman (perulangan dan percabangan, pembuatan fungsi, dan fungsi bawaan). Hal ini disebabkan karena pada pembuatan template seringkali kita akan memerlukan cara untuk menampilkan data secara berulang. Misalnya, kita dapat saja ingin menampilkan data di dalam tabel, dan baris dari tabel merupakan data yang diambil
dari basis data. Metode paling efektif untuk menampilkan data tersebut tentunya dengan melakukan perulangan yang mengeluarkan baris tabel ( Untuk lebih jelasnya, perhatikan contoh kode berikut:
Contoh kode di atas merupakan contoh kode yang kita ambil dari halaman dokumentasi Twig, yang merupakan sebuah templating engine populer dari PHP. Pada contoh di atas, kita melihat bagaimana Twig digunakan untuk menampilkan menu navigasi, yang melakuakn perulangan terhadap variabel Beberapa hal lagi yang dapat diperhatikan pada kode di atas:
Sehingga dapat kita simpulkan bahwa sebuah template pada template engine umumnya merupakan kode program yang jika
dieksekusi akan menghasilkan keluaran tertentu. Karena memiliki bagian yang statis dan dinamis, template engine juga harus memiliki penanda antara bagian statis dan dinamis ( Seperti ketiga fitur awal, fitur-fitur tambahan lain dari template engine juga pada dasarnya dibuat untuk mempermudah pengembangan halaman dinamis. Blok dokumen dibuat agar kita dapat dengan mudah mengganti hanya bagian spesifik dari dokumen, penggabungan file digunakan agar kita dapat mengorganisasikan bagian statik dan dinamis dengan lebih rapi, dan pewarisan (inheritance) dapat digunakan untuk menyederhanakan pengembangan template yang didasarkan pada template lain. Kita akan melihat fitur-fitur ini dan kenapa fitur ini sangat menyenangkan nantinya. Komponen Template Engine¶Sebuah template engine umumnya memiliki beberapa komponen utama, yaitu:
Karena fungsi pada bahasa pemrograman sering ditemui juga pada template engine, biasanya pengembang template engine akan menyediakan sistem khusus untuk ini. Beberapa pendekatan umum yang digunakan untuk bahasa pada template engine yaitu:
Karena spesifiknya sebuah template engine ini, sistem template engine umumnya berdiri sendiri tanpa terikat kepada sistem lainnya. Kebanyakan template engine dirancang untuk diintegrasikan ke dalam aplikasi atau framework lain. Implementasi Template Engine Sederhana¶Untuk melihat bagaimana sebuah template engine bekerja, kita akan mencoba untuk mengimplementasikan sebuah template engine sederhana, dan kemudian mengintegrasikan template engine ini ke sistem routing dan server yang telah kita kembangkan pada bagian sebelumnya. Template engine yang akan kita kembangkan bersifat sederhana, hanya memiliki sebuah fitur yaitu menampilkan data secara dinamis. Misalnya, untuk template seperti berikut:
dapat kita panggil dengan mengisikan data seperti berikut:
Perhatikan bagaimana tetap harus melakukan penulisan HTTP Response secara manual. Pada integrasi template engine yang ideal, hal ini harus telah dilakukan secara otomatis. Langsung saja, kita akan memulai implementasi dengan membuat objek kosong yang akan kita kembangkan:
Seperti yang dapat di lihat pada kode di atas, objek kita memiliki hanya satu buah method,
Pembacaan file akan kita lakukan dengan modul fs dari NodeJS. Karenanya kita akan menambahkan modul ini ke dalam modul kita:
Selanjutnya, kita dapat menggunakan fungsi Sayangnya, NodeJS tidak mendukung Promise secara langsung. Kita harus menambahkan pustaka pihak ketiga untuk mendapatkan fitur ini. Langsung saja, tambahkan
dan jalankan perintah
Selanjutnya, sebagai langkah awal kita akan membuat fungsi yang membaca file dengan Promise, untuk nanti digunakan oleh
Kode di atas cukup sederhana, hanya menggabungkan konsep dasar dari Promise dengan fungsi pembacaan file
Jika anda tidak mengerti kod di atas, silahkan baca pembahasan tentang Promise dan dokumentasi fungsi fs.readFile. Setelah memiliki fungsi khusus untuk membaca file, kita kemudian dapat mengimplementasikan fungsi yang akan mengganti seluruh variabel yang ada dalam template dengan nilai yang ada dalam data. Berikut adalah kode yang kita gunakan:
Penjelasan dari kode di atas (bagian inisialisasi variabel kita lewatkan): Bagian Pertama, kita memanggil Bagian Setelah file selesai dibaca dan disimpan pada Bagian Selanjutnya kita melakukan pencarian pola di dalam file dengan menggunakan regular expression (RE). RE yang kita gunakan ada pada
variabel
Nilai-nilai yang kita dapatkan dan simpan pada Bagian berikutnya, yaitu 3 baris kode dalam
Pada bagian ini kita melakukan 3 hal sekaligus:
Singkatnya, pada tiga baris di atas kita akan mengisikan nilai variabel dalam template dengan data yang diberikan. Hal ini dilakukan secara berulang, sampai seluruh variabel yang ada tergantikan oleh data. Pada bagian terakhir, yaitu
dengan isi file
Jika dijalankan, HTML yang dihasilkan adalah seperti berikut:
yang kemudian dapat kita format menjadi sebuah HTTP Response jika diinginkan. Sampai pada titik ini, template engine yang telah kita kembangkan sudah dapat bekerja dengan cukup baik, tetapi terdapat satu hal yang kita lewatkan dalam implementasi ini, yaitu keamanan. Keamanan pada Template Engine¶Pada kode template engine sebelumnya, ketika menerima sebuah data dalam variabel kita langsung menggantikan data tersebut menjadi kode HTML. Hal ini mengakibatkan ketika data string yang dikirimkan memiliki kode di dalamnya, seperti:
maka kode javascript yang ada di dalam akan dieksekusi. Hal ini merupakan lubang keamanan yang sangat besar, karena jika kita mengembangkan aplikasi yang dapat menerima masukan pengguna seperti kotak komentar, pengguna akan dapat memasukkan kode yang akan dieksekusi oleh pengguna lain. Kode yang dimasukkan ini kemudian dapat digunakan untuk mencuri identitas pengguna lain, atau bahkan menutupi akses ke website kita dengan mengirimkan pengguna ke web lain begitu kode dieksekusi. Lubang keamanan yang dieksploitasi pada contoh di atas kita kenal dengan nama Cross Site Scripting (XSS). XSS merupakan lubang keamanan yang cukup kompleks dengan berbagai area penyerangan, yang tidak akan kita bahas secara mendalam pada bagian ini. Ingat bahwa contoh yang diberikan hanya merupakan area penyerangan XSS yang spesifik. XSS masih bisa dieksploitasi dengan cara lain!. Untuk menanggulangi XSS pada contoh, kita dapat menggunakan dua buah pendekatan:
Kedua pendekatan di atas umumnya sudah cukup efektif untuk mengantisipasi XSS, walaupun pendekatan ini bergantung kepada kemampuan dari kdoe HTML Sanitizing atau Input / Output Encoding yang kita gunakan. Integrasi penggunaan pustaka sendiri sangat mudah. Kita cukup melakukan HTML Sanitizing atau Input / Output Encoding ketika akan menggantikan nilai variabel. Misalnya,
untuk kode sebelumnya, kita dapat menambahkan paket sanitize-html. Tambahkan paket ke dalam
Kemudian jalankan
Perhatikan bagaimana kita hanya mengganti satu baris kode, di bagian Sampai di sini kita telah berhasil mengembangkan sebuah template engine sederhana dan juga menutupi sedikit lubang keamanan. Pada sebuah template engine yang lengkap, hal ini akan sedikit lebih sulit dilakukan karena umumnya kita akan mengikutkan komponen kode yang dapat dieksekusi seperti fungsi dan perulangan. Begitupun, sedikit mengetahui cara kerja template engine dapat membantu kita dalam menulis kode yang lebih baik karena kita melihat berbagai pertimbangan seperti keamanan dan pencocokan pola yang ada dalam sebuah template engine. Pada bagian berikutnya, kita akan mencoba sebuah alternatif yang lebih dapat digunakan di dunia nyata: mengintegrasikan aplikasi web kita dengan template engine yang telah ada. Template Engine Menggunakan JADE¶Pada kebanyakan waktu, menggunakan template engine yang telah ada akan jauh lebih menguntungkan kita. Waktu pengembangan akan sangat banyak dihemat karena fitur-fitur yang telah dikembangkan oleh template engine lain sebelumnya. Sistem keamanan juga biasanya telah lebih teruji, karena template engine telah digunakan oleh banyak orang. Salah satu template engine yang paling populer pada NodeJS adalah JADE. Untuk menggunakan JADE, kita dapat memasukkan JADE ke dalam
dan kemudian kita dapat memperbaharui kode pada
dan JADE dapat kita gunakan dengan cara yang sama dengan ketika kita mengembangkan template engine kita sendiri:
Perlu dicatat bahwa karena sekarang kita telah menggunakan JADE, file template yang akan kita bangun akan memiliki ekstensi
jauh lebih sederhana, dan kita dapat menggunakan berbagai fitur dari JADE tanpa perlu menambahkan terlalu banyak kode. Jika ingin mengintegrasikan JADE lebih dalam, silahkan rujuk ke dokumentasi API JADE. Penutup¶Sampai titik ini kita telah melihat bagaimana sebuah template engine bekerja, dan apa saja yang ditawarkan oleh sebuah template engine secara umum. Berbagai kode yang kita tuliskan pada bagain ini dapat diakses pada versi lengkapnya di Github:
Di bagian selanjutnya kita akan melihat tentang basis data dan berbagai hal yang berhubungan dengan basis data pada NodeJS. |