Bermigrasi dari PHP ke Node.js
Saya telah meningkatkan program web dalam PHP selama bertahun-tahun, tetapi beberapa terakhir ini telah membentuk lebih banyak program iOS. Saat saya kembali ke peningkatan web, saya benar-benar merindukan keanggunan Objective-C dan struktur MVC-nya. Saya bisa mendapati susunan serupa untuk JavaScript sisi client saya, tetapi code sisi server saya dibiarkan dalam batas zona nyaman dan PHP saya. Hal luar biasa mengenai PHP ialah di mana saja dan penghambat masuk yang rendah. Anda dapat memperoleh program web dan bekerja hampir dalam waktu singkat, tetapi code tersebut bisa secara cepat beralih ke segunung kode spageti. Setelah hampir setiap pekerjaan yang saya lakukan menggunakan PHP, saya berkata pada diri sendiri bahwa inilah saatnya untuk mulai bekerja lebih cerdas. Saya kemudian akan mulai menyelidiki kerangka kerja baru untuk PHP dan berpikir untuk melompat sepenuhnya ke tumpukan baru yang menggunakan Java, Ruby, atau Python. Saya akan mulai mengutak-atik pendekatan baru dan membuat aplikasi sederhana. Apa yang pasti terjadi adalah pekerjaan baru datang dan saya menggunakan kembali pengetahuan domain saya tentang PHP. Ini sebagian karena saya, tetapi pada saat yang sama masalah platform yang saya coba pelajari. Saya telah menemukan titik masuk untuk membuat aplikasi yang solid menggunakan bahasa lain jauh lebih tinggi daripada yang saya lakukan dengan PHP. Ini sebagian mengapa PHP menjadi monster di industri ini dan mengapa Rails dan Django biasanya diturunkan ke puritan.
Di atas semua alternatif populer untuk PHP ada anak yang relatif baru di blok yang disebut Node.js. Ketika saya mulai mengutak-atik Node beberapa tahun yang lalu, menyegarkan untuk bersandar pada pengetahuan JavaScript yang saya miliki untuk membuat kode sisi server. Namun Node sepertinya tidak pernah menjadi pesaing yang realistis untuk bahasa-bahasa besar dalam hal menulis kode sisi server yang lengkap; itu terlalu baru dan belum terbukti.
Baru-baru ini saya melihat lagi menggunakan Node sebagai bahasa sisi server utama saya dan saya terpesona dengan kemajuan dan komunitasnya. Itu sudah cukup matang untuk digunakan sebagai alat penting untuk pengembang web mana pun, tetapi terutama untuk pengembang UI/front-end. Sudah waktunya untuk menggali Node lagi dan melihat apakah itu akan melepaskan saya dari PHP untuk selamanya.
Node 101
Mengaktifkan dan menjalankan Node di MacBook saya sesederhana yang Anda harapkan. Berikut tampilan instalasi OSX :
//Install homebrew then Node
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"brew install node
Setelah itu Anda siap menjalankan kode JavaScript di server Anda. Aplikasi Node 'Hello World' menunjukkan struktur kode dasar sementara pada saat yang sama mengilustrasikan bahwa ini adalah server web yang sangat mumpuni. Dengan hanya 2 baris di terminal, Anda akan memiliki semua kekuatan JavaScript yang Anda inginkan dan server web untuk melakukan booting. Cobalah, buka editor teks dan masukkan kode ini:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
Simpan file Anda sebagai app.js dan dari terminal jalankan :
node app.js
Muat browser Anda dan buka http://localhost:1337 !
Ini membawa Anda ke tempat Anda mungkin bertanya, "ok, sekarang apa?" Setidaknya itulah yang saya lakukan saat pertama kali mencobanya. Saya tidak tahu atau mengerti bagaimana menerapkan pengetahuan saya yang ada tentang cara membuat aplikasi web yang benar-benar tepat dari contoh ini.
NPM
Node menjadi sangat kuat saat Anda mulai menambahkannya. Node Package Manager* atau NPM disertakan dengan pemasangan Node. Komunitas telah menciptakan beberapa aplikasi, alat, kerangka kerja, dan middleware yang sangat berharga untuk membantu pengembang UI fokus pada tugas-tugas utama yang ada; membuat pengalaman pengguna yang luar biasa. Jika Anda berpengalaman dengan komposer saat membangun aplikasi web PHP Anda, maka menggunakan NPM tidak akan banyak membantu Anda. Ada beberapa situs bagus di luar sana untuk membantu memahami seluk beluk NPM jadi saya hanya akan menyebutkan beberapa hal penting. NPM menggunakan file bernama package.json untuk menguraikan metadata aplikasi Anda dan yang paling penting ketergantungan perangkat lunak aplikasi web Anda. Anda dapat mengedit file ini secara manual dan mengisi dependensinya sendiri seperti yang Anda lakukan dengan file composer.json milik komposer. Anda juga dapat menginstal paket dari baris perintah seperti :
npm install <package_name> --save
Saya biasanya menambahkan opsi '- simpan' sehingga paket ditambahkan ke daftar dependensi di file package.json saya.
Di luar aplikasi web Anda, NPM menampung beberapa aplikasi sisi server yang sangat bagus yang ingin Anda gunakan untuk membuat hidup Anda lebih mudah. Anda dapat menginstal paket dalam direktori aplikasi lokal Anda atau Anda dapat memilih untuk menginstal paket secara global di sistem Anda. Menginstalnya secara global akan memberi Anda akses ke paket dari baris perintah (Anda harus menambahkan folder bin NPM ke PATH terminal Anda). Memasang paket secara global terlihat seperti ini :
npm install -g <package_name>
Setelah mempelajari cara mengelola paket, ada beberapa yang penting yang ingin Anda instal sebelum memulai dengan Node.js.
Membuat dan Memindahkan Situs Web
Saya sudah lama tidak bermain dengan Node, tetapi saya telah menemukan beberapa hal penting untuk membuat saya bergerak ke arah yang benar. Berikut adalah pilihan yang menurut saya paling membantu.
Express
Mungkin satu-satunya komponen terpenting dalam membangun aplikasi web yang sukses di Node adalah Express. Ini adalah paket middleware yang dibangun di atas pondasi Node dengan menambahkan beberapa struktur penting untuk membangun aplikasi web dengannya. Node sendiri mendelegasikan banyak tanggung jawab server web kepada pemrogram. Express dibangun di atas paket middleware yang disebut Connect yang mengisi celah ini sehingga pengembang tidak perlu khawatir tentang detail kecil dari penguraian masukan dan penyajian halaman. Selain itu, Express menyediakan kerangka kerja yang sangat bagus untuk diikuti pengembang dan membuat kode yang kaya dan berkelanjutan. Express telah menjadi standar de-facto untuk membangun aplikasi web di Node. Saya tidak akan membuat aplikasi web tanpa itu. Ada panduan fantastis di ExpressJS.com untuk memulai: http://expressjs.com/guide.html
Di beranda Express ada tautan ke buku yang sangat membantu juga. Ini akan memandu Anda melalui ikhtisar Node yang sangat mendalam dan membangun untuk membuat aplikasi web menggunakan Express.
Nodemon
Menjalankan dan menguji aplikasi Node sangat berbeda dengan membuatnya di PHP. Biasanya dengan PHP Anda meretas beberapa kode dan kemudian menuju ke browser dan menyegarkan. Sesekali Anda mungkin perlu mengubah konfigurasi Apache dan memulai ulang server web. Proses di Node sangat berbeda. Karena server web dan aplikasi dibundel menjadi satu paket kecil yang ketat, mengubah kode berarti harus memulai ulang seluruh aplikasi web; yang juga berarti me-restart server web. Ketika saya belajar bagaimana membangun dasar-dasarnya, sepertinya ada banyak sekali proses mematikan, menekan panah atas untuk membuka perintah terakhir saya dan kemudian menekan enter untuk memulai ulang aplikasi ([Ctrl+C][Up][Enter ] siklus). Ini dengan cepat menjadi rasa sakit yang sangat besar di pantat. Agar orang-orang membuat pekerjaan yang bermakna di Node, ini harus ditingkatkan. Untungnya di sinilah Nodemon datang untuk menyelamatkan. Instal Nodemon menggunakan NPM secara global dan alih-alih memulai aplikasi Anda menggunakan:
node app.js
Sebagai berikut:
nodemon app.js
Aplikasi ini akan memantau perubahan dalam kode dan memulai ulang Node secara otomatis untuk Anda. Sangat mudah dan sangat esensial.
Swig
Saat saya membuat aplikasi web PHP, mesin template pilihan saya adalah Twig dari orang-orang baik di SensioLabs. Itu adalah komponen kerangka kerja Symfony dan membuat HTML ujung depan menjadi mudah. Ranting adalah alat penting bagi saya dan jika saya akan memindahkan salah satu proyek saya yang sudah ada ke Node, saya harus menggunakan kembali templat tampilan yang sudah saya miliki. Swig membuat transisi ini sangat sederhana. Hampir setiap bagian dari Twig yang saya gunakan tersedia di Swig.
Ada port langsung dari Ranting ke Node tetapi sayangnya proyek itu terhenti. Swig diperbarui dengan sangat aktif, jadi saya memilih untuk menggunakannya di masa mendatang.
Catatan: Saya menganggap orang lain mungkin menganggap ini bermanfaat mengingat Twig adalah salah satu mesin template paling populer di PHP. Beyond Swig ada banyak mesin template yang tersedia untuk Node. Semua yang populer memiliki fungsi yang sama atau serupa; ini hanya tentang perbedaan sintaks untuk sebagian besar.
MySQL untuk Node
Saat Anda membaca tentang Node, sebagian besar waktu itu dipasangkan dengan database tipe NoSQL seperti MongoDB. Ke depan saya kemungkinan besar akan menggunakan Mongo hanya karena middleware Mongoose yang luar biasa. Itu membuat manajemen model dalam aplikasi web menjadi sangat mudah. Namun, mengingat bahwa saya memiliki beberapa proyek lama untuk dikelola dan dipindahkan, saya ingin mempertahankan sebanyak mungkin. Ini berarti menjaga skema dan data MySQL saya yang sudah ada.
PasporJS
Hampir semua aplikasi web saat ini memiliki semacam konektivitas dengan API pihak ketiga. Untuk mengautentikasi dengan layanan ini memiliki tantangan tersendiri. Untungnya ada banyak paket yang tersedia di PHP untuk mempermudah akses API ini. Dengan Node Anda benar-benar hanya perlu memperhatikan PassportJS. Ini adalah paket yang kompatibel dengan Express yang memungkinkan Anda mengautentikasi hampir di mana saja di web. Anda bahkan dapat menggunakannya untuk mengautentikasi login lokal Anda sendiri dan mengelola sesi jika perlu. Saya menemukan alat ini sangat berharga saat mengautentikasi dengan layanan lain seperti Twitter, Instagram, dan Facebook. Dari wiki perangkat lunak, dikatakan dapat mengautentikasi dengan 140 layanan berbeda. Harus dimiliki oleh setiap pengembang aplikasi web.
Memulai mesin
Setelah memahami dasar-dasar Node dan membiasakan diri dengan tumpukan baru, saya siap terjun dan mulai membuat aplikasi. Butuh sekitar satu hari atau lebih untuk membaca buku NodeJS in Action dan mengerjakan beberapa contoh menggunakan Express. Dengan pemahaman dasar tentang cara kerja mekanik, tugas selanjutnya adalah memindahkan salah satu proyek lama saya. Untuk situs multibahasa berukuran kecil hingga sedang, proses porting memakan waktu sekitar 2-3 hari. Kecepatan saya mem-porting situs pasti akan meningkat saat saya menjadi lebih akrab dengan proses dan struktur Node dan Express. Berikut adalah beberapa hal yang patut dicatat bagi orang lain yang pindah dari PHP.
Sinkron vs Asinkron
Salah satu perubahan terbesar yang harus saya pikirkan adalah mengubah kode PHP sinkron saya menjadi kode JavaScript asinkron. Karena Node dibangun di atas sistem loop peristiwa non-pemblokiran utas tunggal, tindakan apa pun yang Anda lakukan tidak akan menunggu tindakan pemblokiran kembali sebelum mengeksekusi baris kode berikutnya. Semua baris kode dieksekusi segera satu demi satu. Gagasan bahwa data yang diminta akan tersedia di baris kode berikutnya bukanlah jaminan. Di sinilah pengalaman JavaScript front-end Anda akan membantu. Sama seperti sisi klien, event ditangani melalui fungsi panggilan balik dan hal yang sama berlaku untuk kode Javascript di server. Untuk membuat kode sinkron menggunakan JavaScript, Anda harus menyarangkan urutan peristiwa Anda di callback. Ini contohnya:
//PHP
$sql1 = "SELECT user_id FROM users WHERE email=?";
$stmt = DB()->prepare($sql);
$stmt->execute( array($email) );$sql2 = "SELECT photo_id FROM photos WHERE user_id=?";
$stmt = DB()->prepare($sql);
$stmt->execute( array($user_id) );
Hanya apa yang Anda harapkan. PHP akan mengeksekusi dan menunggu hasil dari kueri pertama dan kemudian menggunakan data yang diterima di kueri kedua. Di Node Anda harus membuat sarang kueri melalui callback penyelesaian seperti:
var sql1 = "SELECT user_id FROM users WHERE email=?";
connection.query( sql1, [email], function(err, rows)
{
var sql2 = "SELECT photo_id FROM photos WHERE user_id=?";
connection.query( sql2, [rows[0].user_id], function(err, rows)
{
console.log(rows); //output all the photos
}
}
Anda mungkin berpikir bahwa jenis kode ini akan menjadi sangat sulit ketika Anda memiliki banyak kode sinkron untuk dieksekusi, dan Anda benar. Menggunakan janji memecahkan masalah "Piramida Doom" ini. Saya tidak akan membahas janji dalam artikel ini tetapi ada paket bagus untuk Node bernama Q dan ini memberi Anda gambaran tentang bagaimana janji akan membersihkannya.
Bug yang benar-benar buruk
Karena Node adalah sistem utas tunggal, penting untuk diingat bahwa ketika kode Anda memiliki pengecualian yang tidak tertangkap, itu akan menurunkan Node untuk semua orang, bukan hanya orang yang menyebabkan kerusakan. Ini berbeda dari PHP dan Apache/Nginx karena utas yang menangani permintaan mati, bukan keseluruhan proses server web. Di lingkungan dev, ini benar-benar baik dan mungkin dianjurkan sehingga Anda dapat menangkap dan memperbaiki masalah dengan benar. Namun dalam lingkungan produksi, ini bisa sangat mengganggu karena aplikasi web Anda akan dihapus untuk semua pengguna yang mengunjungi situs Anda. Jalan keluarnya adalah dengan membuat pendengar untuk semua pengecualian yang tidak tertangkap dan menanganinya dengan anggun (lihat catatan di bawah). Kodenya terlihat seperti ini :
process.on('uncaughtException', function (err) {
console.log('Caught exception: ' + err);
});
Ini akan memastikan aplikasi Anda tetap aktif bahkan ketika hal yang tidak terduga terjadi.
Catatan: Saya telah membaca sedikit lebih dalam tentang masalah ini dan tampaknya menangani pengecualian yang tidak tertangkap dengan cara ini tidaklah ideal. Menggunakan domain tampaknya menjadi solusi yang lebih baik. Baca tentang itu di dokumen Node API. Pilihan lain adalah menggunakan alat seperti selamanya untuk memulai aplikasi. Ini akan secara otomatis me-restart server ketika hal yang tidak terduga terjadi.
Aturan Tulis Ulang
Salah satu bagian kuat dari pengembangan aplikasi web adalah kemampuan untuk menulis ulang URL yang berantakan menjadi URL yang bersih dan bagus. Ini membuat mesin pencari senang dan membuat pengguna Anda lebih bahagia. Dengan PHP, tidak peduli seperti apa URL-nya, hanya ingin masukan untuk bekerja dengannya. Penulisan ulang URL dikelola oleh Apache (atau Nginx). Saat menggunakan Node untuk membuat aplikasi web, pemetaan rute Express adalah cara khusus untuk mengarahkan permintaan. Saya menemukan mengelola rute melalui kode aplikasi sisi server saya merupakan perubahan yang sangat disambut baik. Setelah merasa nyaman dengan ide ini, Anda tidak akan pernah ingin menulis aturan perutean lain melalui entri <VirtualHost> Anda lagi. Berikut adalah contoh kecil :
RewriteRule ^/blog/([A-Za-z-]+)$ /blog/entry.php?slug=$1
Menggunakan pemetaan rute Express :
app.get( '/blog/:slug([A-Za-z-]+)', blogController.entry );
No more running around managing request route mapping between your web server and your web app code. <Applause>.
Menjalankan beberapa situs Node di satu server
Karena Node adalah pemroses kode dan server web yang dibangun menjadi satu, ini menghadirkan tantangan saat menjalankan banyak situs dalam satu lingkungan. Menjalankan server web Node mengharuskan Anda memilih port untuk menjalankan permintaan. Setelah Anda menjalankan situs di port 80, Anda tidak dapat memetakan situs kedua ke port yang sama. Seseorang mungkin hanya memberi tahu Anda untuk mendapatkan VPS baru untuk setiap situs web mengingat harganya sangat terjangkau akhir-akhir ini, namun dalam banyak kasus, satu VPS benar-benar berlebihan untuk satu situs. Dalam kasus ini, Anda dapat memilih untuk menjalankan server web standar seperti Apache atau Nginx dan meneruskan permintaan ke Node melalui proxy. Saya memilih untuk proxy menggunakan penulisan ulang Apache karena saya sering menggunakannya. Berikut adalah contoh entri <VirtualHost> :
<VirtualHost *:80>
ServerName example.com
ServerAlias another-example.com
DocumentRoot /my/folder/
RewriteEngine On
RewriteRule ^(/.*)$ http://%{HTTP_HOST}:1337$1 [P]
</VirtualHost>
Untuk Nginx akan terlihat seperti ini :
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:{YOUR_PORT};
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection ‘upgrade’;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Anda juga dapat memilih pendekatan JavaScript murni dengan menggunakan paket Node-Http-Proxy. Gunakan apa yang masuk akal bagi Anda.
*Catatan: Saya telah mendapatkan banyak umpan balik tentang topik ini dan sebagian besar mengatakan bahwa menggunakan Nginx tidak sebesar hambatan seperti yang awalnya saya buat dan dalam beberapa hal menggunakannya sebagai proxy akan membantu lebih dari itu' akan menghalangi. Maksud saya seharusnya tentang menjalankan beberapa instance node di lingkungan yang sama, jadi saya telah menulis ulang poin ini agar lebih membantu. Saya akan meninggalkan debat kinerja untuk komunitas karena saya belum banyak menguji di lingkungan produksi yang sibuk. Terima kasih Reddit!
Carilah dan Anda akan temukan
Salah satu bagian paling menarik tentang pemrograman dengan Node adalah komunitas yang mengelilinginya. Ada banyak hal yang terjadi di luar angkasa dan itu terjadi dengan sangat cepat. Ketika saya mem-porting situs pertama saya, saya akan mengalami masalah dan bertanya "Bagaimana saya melakukan ini di Node?" Saya hanya akan mencari di Google apa pun masalah saya dan cukup yakin dalam beberapa detik saya akan mendapat jawaban. Saya tidak pernah menemukan masalah pemecah kesepakatan yang tidak mudah dipecahkan menggunakan Node. Ini adalah bukti kemajuan yang dibuatnya. Jika Anda mengalami masalah, cukup googling saja, pasti ada yang punya solusinya.
Penyelesaian
Setelah menghabiskan sekitar 3-4 hari dengan Node dan rekan-rekannya, saya benar-benar terkesima dengan betapa mudahnya menjalankannya dan yang paling penting betapa mudahnya bekerja membuat sesuatu. Hambatan masuk untuk mengembangkan aplikasi web menggunakan Node masih tidak serendah PHP tetapi cukup dekat! Meskipun demikian, nilai yang Anda dapatkan dari memahami manajer paket dan kerangka kerja MVC sangat penting untuk menjadi pengembang web modern. Kedua konsep tersebut mungkin satu-satunya hal yang menjaga penghalang masuk Node+Express lebih tinggi daripada PHP. Node+Express memaksa Anda untuk mempelajari konsep-konsep ini sebelum Anda bisa memasak dan itu adalah hal yang sangat bagus untuk pengembang dan kode yang mereka tulis.
Terakhir, menurut saya penting untuk memahami mengapa menulis kode sisi server dalam JavaScript adalah hal yang luar biasa bagi pengembang web dan khususnya pengembang web UI/Front-end.
Kontrol penuh
Sebagian besar pengembang web UI sudah memiliki pengetahuan mendalam tentang JavaScript dan nuansanya. Memanfaatkan pengetahuan ini saat menyiapkan kode sisi server meningkatkan produktivitas. Selain itu, pengalaman saya memberi tahu saya logika bisnis/pengembang back-end biasanya enggan menggabungkan kode UI untuk membangun situs web. Mereka lebih suka fokus pada rekayasa fungsi inti aplikasi. Membuat aplikasi menggunakan Node memungkinkan pengembang UI untuk mengambil alih bagian UI dari aplikasi sisi server. Logika bisnis dapat sepenuhnya dipisahkan dari UI dan diakses melalui panggilan API. Memisahkan back-end dari front-end memungkinkan setiap pengembang memilih tumpukan yang ingin mereka gunakan untuk menyelesaikan pekerjaannya.
Mengingat pengalaman baru-baru ini, saya telah berkomitmen untuk memindahkan semua proyek mendatang ke Node (jika memungkinkan) dan berkomitmen untuk tumpukan JavaScript lengkap untuk pengembangan UI. Ini telah menjadi bahasa penting untuk membangun pengalaman pengguna yang luar biasa dan sekarang dapat dimanfaatkan sepenuhnya untuk membuat kode sisi server yang hebat juga. Sejujurnya saya percaya ini akan menjadi bahasa yang mendominasi untuk membangun kode aplikasi web front-end ke depannya. Saya memuji dan berterima kasih kepada komunitas pengembang yang telah bekerja keras untuk membuat alat luar biasa ini sehingga orang-orang seperti saya dapat menggunakannya untuk membuat situs web yang hebat.