Saya tidak sepenuhnya mendapatkan apa Node.js adalah semua tentang. Mungkin itu karena saya terutama pengembang aplikasi bisnis berbasis web. Apa itu dan apa gunanya?
Pemahaman saya sejauh ini adalah:
- Model pemrograman event driven, terutama cara menangani I / O .
- Ini menggunakan JavaScript dan parser adalah V8 .
- Dapat dengan mudah digunakan untuk membuat aplikasi server bersamaan.
Apakah pemahaman saya benar? Jika ya, lalu apa manfaat dari I / O yang terjadi, apakah itu lebih untuk hal-hal konkurensi? Juga, apakah arah Node.js menjadi kerangka kerja seperti, model pemrograman berbasis JavaScript (berbasis V8)?
sumber
Saya menggunakan Node.js di tempat kerja, dan merasa sangat kuat. Terpaksa memilih satu kata untuk menggambarkan Node.js, saya akan mengatakan "menarik" (yang bukan kata sifat murni positif). Komunitas itu bersemangat dan berkembang. JavaScript, meskipun keanehannya bisa menjadi bahasa yang bagus untuk kode. Dan Anda setiap hari akan memikirkan kembali pemahaman Anda sendiri tentang "praktik terbaik" dan pola-pola kode yang terstruktur dengan baik. Ada energi besar gagasan mengalir ke Node.js sekarang, dan bekerja di dalamnya memaparkan Anda pada semua pemikiran ini - angkat berat mental yang hebat.
Node.js dalam produksi sudah pasti dimungkinkan, tetapi jauh dari penyebaran "turn-key" yang tampaknya dijanjikan oleh dokumentasi. Dengan Node.js v0.6.x, "cluster" telah diintegrasikan ke dalam platform, menyediakan salah satu blok bangunan penting, tetapi skrip "production.js" saya masih ~ 150 baris logika untuk menangani hal-hal seperti membuat log direktori, mendaur ulang pekerja yang mati, dll. Untuk layanan produksi "serius", Anda juga harus siap untuk membatasi koneksi masuk dan melakukan semua hal yang dilakukan Apache untuk PHP . Agar adil, Ruby on Rails memiliki masalah persis ini . Ini diselesaikan melalui dua mekanisme yang saling melengkapi: 1) Menempatkan Ruby di Rails / Node.Apache / Lighttd ). Server web dapat secara efisien menyajikan konten statis, mengakses logging, menulis ulang URL, mengakhiri SSL , menegakkan aturan akses, dan mengelola beberapa sub-layanan. Untuk permintaan yang mengenai layanan simpul aktual, server web proksi permintaan melalui. 2) Menggunakan kerangka kerja seperti Unicorn yang akan mengelola proses pekerja, mendaur ulangnya secara berkala, dll. Saya belum menemukan kerangka kerja Node.js yang tampaknya sepenuhnya dipanggang; mungkin ada, tapi saya belum menemukannya dan masih menggunakan ~ 150 baris di "production.js" linting tangan saya.
Kerangka kerja membaca seperti Express membuatnya tampak seperti praktik standar adalah hanya melayani semuanya melalui satu layanan Node.js yang serba bisa ... "app.use (express.static (__ dirname + '/ public'))" . Untuk layanan dan pengembangan yang lebih rendah, itu mungkin bagus. Tetapi segera setelah Anda mencoba untuk menempatkan beban waktu yang besar pada layanan Anda dan menjalankannya 24/7, Anda akan dengan cepat menemukan motivasi yang mendorong situs-situs besar untuk membuat kode-C yang dipanggang dengan baik seperti Nginx yang membuka situs mereka dan menangani semua permintaan konten statis (... hingga Anda menyiapkan CDN , seperti Amazon CloudFront )). Untuk pandangan negatif yang agak lucu dan tanpa malu-malu tentang hal ini, lihat pria ini .
Node.js juga menemukan semakin banyak penggunaan non-layanan. Bahkan jika Anda menggunakan sesuatu yang lain untuk menyajikan konten web, Anda mungkin masih menggunakan Node.js sebagai alat build, menggunakan modul npm untuk mengatur kode Anda, Browserify untuk menjahitkannya menjadi satu aset, dan uglify-js untuk memperkecilnya agar dapat digunakan. . Untuk berurusan dengan web, JavaScript adalah pasangan impedansi sempurna dan sering kali menjadikannya rute serangan paling mudah. Misalnya, jika Anda ingin melihat-lihat banyak muatan respons JSON , Anda harus menggunakan modul garis bawah-CLI saya , sabuk utilitas data terstruktur.
Pro kontra:
Lawan model satu proses-per-permintaan ( LAMP ) sederhana:
Lawan menulis layanan "nyata" di Java / C # / C (C? Sungguh?)
Untuk perspektif lain tentang JavaScript dan Node.js, lihat Dari Java ke Node.js , posting blog tentang tayangan pengembang Java dan pengalaman mempelajari Node.js.
Modul Saat mempertimbangkan simpul, perlu diingat bahwa perpustakaan JavaScript pilihan Anda akan MEMBENTUK pengalaman Anda. Kebanyakan orang menggunakan setidaknya dua, pembantu pola asinkron (Step, Futures, Async), dan modul gula JavaScript ( Underscore.js ).
Gula Pembantu / JavaScript:
Modul Pola Asinkron:
Atau untuk membaca semua tentang perpustakaan asinkron, lihat wawancara panel ini dengan penulis.
Kerangka Web:
Pengujian:
Juga, periksa daftar resmi modul Node.js yang direkomendasikan. Namun, Modul Node GitHub's Wiki jauh lebih lengkap dan sumber daya yang baik.
Untuk memahami Node, ada baiknya mempertimbangkan beberapa pilihan desain utama:
Node.js adalah EVENT BERBASIS dan ASYNCHRONOUS / NON-PEMBLOKIRAN. Peristiwa, seperti koneksi HTTP yang masuk akan memadamkan fungsi JavaScript yang sedikit bekerja dan memulai tugas asinkron lainnya seperti menyambung ke database atau menarik konten dari server lain. Setelah tugas-tugas ini telah dimulai, fungsi acara selesai dan Node.js kembali tidur. Segera setelah sesuatu yang lain terjadi, seperti koneksi basis data yang dibuat atau server eksternal merespons dengan konten, fungsi panggil kembali diaktifkan, dan lebih banyak lagi kode JavaScript dieksekusi, berpotensi memulai lebih banyak tugas yang tidak sinkron (seperti permintaan basis data). Dengan cara ini, Node.js akan dengan senang hati melakukan interleave aktivitas untuk beberapa alur kerja paralel, menjalankan aktivitas apa pun yang tidak terblokir pada titik waktu tertentu. Inilah sebabnya mengapa Node.js melakukan pekerjaan hebat mengelola ribuan koneksi simultan.
Mengapa tidak menggunakan satu proses / utas per koneksi seperti yang lainnya?Di Node.js, koneksi baru hanyalah alokasi heap yang sangat kecil. Memutar proses baru membutuhkan memori yang jauh lebih besar, satu megabita pada beberapa platform. Tetapi biaya sebenarnya adalah overhead yang terkait dengan pengalihan konteks. Ketika Anda memiliki 10 ^ 6 utas kernel, kernel harus melakukan banyak pekerjaan mencari tahu siapa yang harus menjalankan selanjutnya. Banyak pekerjaan yang telah dilakukan untuk membangun penjadwal O (1) untuk Linux, tetapi pada akhirnya, hanya cara yang jauh lebih efisien untuk memiliki satu proses yang digerakkan oleh peristiwa daripada 10 ^ 6 proses yang bersaing untuk waktu CPU. Selain itu, dalam kondisi kelebihan beban, model multi-proses berperilaku sangat buruk, membuat layanan administrasi dan manajemen kritis kelaparan, terutama SSHD (artinya Anda bahkan tidak bisa masuk ke dalam kotak untuk mengetahui seberapa benar-benar kacau itu).
Node.js adalah THREADED TUNGGAL dan KUNCI GRATIS . Node.js, sebagai pilihan desain yang sangat disengaja hanya memiliki satu utas per proses. Karena itu, pada dasarnya tidak mungkin bagi banyak utas untuk mengakses data secara bersamaan. Dengan demikian, tidak diperlukan kunci. Utas itu sulit. Sangat sulit. Jika Anda tidak percaya itu, Anda belum cukup melakukan pemrograman utas. Mengunci dengan benar sulit dan menghasilkan bug yang sangat sulit dilacak. Menghilangkan kunci dan multi-threading membuat salah satu kelas bug paling jahat hilang begitu saja. Ini mungkin satu keuntungan terbesar dari simpul.
Tetapi bagaimana saya memanfaatkan kotak 16 inti saya?
Dua arah:
Node.js memungkinkan Anda melakukan beberapa hal yang sangat kuat tanpa berkeringat. Misalkan Anda memiliki program Node.js yang melakukan berbagai tugas, mendengarkan padaport TCP untuk perintah, mengkodekan beberapa gambar, apa pun. Dengan lima baris kode, Anda dapat menambahkan portal manajemen web berbasis HTTP yang menunjukkan status tugas aktif saat ini. Ini mudah untuk dilakukan:
Sekarang Anda dapat menekan URL dan memeriksa status proses Anda yang sedang berjalan. Tambahkan beberapa tombol, dan Anda memiliki "portal manajemen". Jika Anda memiliki skrip Perl / Python / Ruby yang sedang berjalan, cukup "melempar di portal manajemen" tidak sepenuhnya sederhana.
Tapi bukankan JavaScript lambat / buruk / jahat / menelurkan-setan-? JavaScript memiliki beberapa keanehan aneh, tetapi dengan "bagian yang bagus" ada bahasa yang sangat kuat di sana, dan dalam hal apa pun, JavaScript adalah bahasa pada klien (browser). JavaScript ada di sini untuk tinggal; bahasa lain menargetkannya sebagai IL, dan bakat kelas dunia bersaing untuk menghasilkan mesin JavaScript paling canggih. Karena peran JavaScript dalam browser, sejumlah besar upaya rekayasa dilemparkan untuk membuat JavaScript menyala dengan cepat. V8adalah mesin javascript terbaru dan terhebat, setidaknya untuk bulan ini. Ini menghancurkan bahasa scripting lain dalam efisiensi DAN stabilitas (melihat Anda, Ruby). Dan itu hanya akan menjadi lebih baik dengan tim besar mengerjakan masalah di Microsoft, Google, dan Mozilla, bersaing untuk membangun mesin JavaScript terbaik (Ini bukan lagi "penerjemah" JavaScript karena semua mesin modern melakukan banyak JITkompilasi di bawah tenda dengan interpretasi hanya sebagai mundur untuk mengeksekusi kode sekali). Ya, kita semua berharap dapat memperbaiki beberapa pilihan bahasa JavaScript yang lebih aneh, tapi itu tidak terlalu buruk. Dan bahasanya sangat fleksibel sehingga Anda benar-benar tidak mengkode JavaScript, Anda mengkode Langkah atau jQuery - lebih dari bahasa lain, dalam JavaScript, perpustakaan menentukan pengalaman. Untuk membangun aplikasi web, Anda cukup banyak harus tahu JavaScript, jadi coding dengan itu di server memiliki semacam sinergi keterampilan-set. Itu membuat saya tidak takut menulis kode klien.
Selain itu, jika Anda BENAR-BENAR membenci JavaScript, Anda dapat menggunakan gula sintaksis seperti CoffeeScript . Atau apa pun yang membuat kode JavaScript, seperti Google Web Toolkit (GWT).
Berbicara tentang JavaScript, apa itu "penutupan"? - Cukup banyak cara mewah untuk mengatakan bahwa Anda mempertahankan variabel cakupan leksikal di seluruh rantai panggilan. ;) Seperti ini:
Lihat bagaimana Anda bisa menggunakan "myData" tanpa melakukan sesuatu yang canggung seperti menyembunyikannya ke objek? Dan tidak seperti di Jawa, variabel "myData" tidak harus hanya baca. Fitur bahasa yang kuat ini membuat pemrograman asinkron jauh lebih sedikit bertele-tele dan tidak terlalu menyakitkan.
Menulis kode asinkron selalu akan menjadi lebih kompleks daripada menulis skrip single-threaded sederhana, tetapi dengan Node.js, ini tidak terlalu sulit dan Anda mendapatkan banyak manfaat selain efisiensi dan skalabilitas ke ribuan koneksi bersamaan. ..
sumber
V8 adalah implementasi dari JavaScript. Ini memungkinkan Anda menjalankan aplikasi JavaScript mandiri (antara lain).
Node.js hanyalah sebuah pustaka yang ditulis untuk V8 yang menampilkan I / O. Konsep ini agak sulit untuk dijelaskan, dan saya yakin seseorang akan menjawab dengan penjelasan yang lebih baik daripada saya ... Intinya adalah daripada melakukan beberapa input atau output dan menunggu itu terjadi, Anda hanya tidak menunggu untuk itu selesai. Jadi misalnya, tanyakan waktu terakhir file yang diedit:
Mungkin butuh beberapa milidetik, atau mungkin butuh beberapa detik. Dengan I / O yang terjadi, Anda cukup mematikan permintaan dan alih-alih menunggu Anda melampirkan panggilan balik yang dijalankan saat permintaan selesai:
Ini membuatnya sangat mirip kode JavaScript di browser (misalnya, dengan fungsionalitas gaya Ajax ).
Untuk informasi lebih lanjut, Anda harus memeriksa artikel Node.js benar-benar menarik yang merupakan pengantar saya ke perpustakaan / platform ... Saya merasa cukup bagus.
sumber
Node.js adalah alat baris perintah sumber terbuka yang dibangun untuk kode JavaScript sisi server. Anda dapat mengunduh tarball , kompilasi, dan instal sumbernya. Ini memungkinkan Anda menjalankan program JavaScript.
JavaScript dijalankan oleh V8 , mesin JavaScript yang dikembangkan oleh Google yang digunakan di browser Chrome . Ini menggunakan JavaScript API untuk mengakses jaringan dan sistem file.
Ini populer untuk kinerjanya dan kemampuan untuk melakukan operasi paralel.
Berikut ini adalah beberapa artikel bagus tentang topik ini.
sumber
Penutupan adalah cara untuk mengeksekusi kode dalam konteks yang dibuatnya.
Apa artinya ini untuk concurency adalah bahwa Anda dapat mendefinisikan variabel, kemudian memulai fungsi I / O nonblocking , dan mengirimkannya fungsi anonim untuk panggilan baliknya.
Ketika tugas selesai, fungsi panggilan balik akan dieksekusi dalam konteks dengan variabel, ini adalah penutupan.
Alasan penutupan sangat baik untuk menulis aplikasi dengan nonblocking I / O adalah sangat mudah untuk mengelola konteks fungsi yang dijalankan secara tidak sinkron.
sumber
Dua contoh yang baik adalah mengenai bagaimana Anda mengelola template dan menggunakan perangkat tambahan progresif dengannya. Anda hanya perlu beberapa kode JavaScript yang ringan untuk membuatnya bekerja dengan sempurna.
Saya sangat menyarankan Anda menonton dan membaca artikel ini:
Ambil bahasa apa pun dan coba ingat bagaimana Anda akan mengelola templat file HTML Anda dan apa yang harus Anda lakukan untuk memperbarui satu nama kelas CSS dalam struktur DOM Anda (misalnya, pengguna mengklik item menu dan Anda ingin yang ditandai sebagai "terpilih" dan perbarui konten halaman).
Dengan Node.js semudah melakukannya dalam kode JavaScript sisi klien. Dapatkan simpul DOM Anda dan terapkan kelas CSS Anda untuk itu. Dapatkan simpul DOM Anda dan konten dalamHTML Anda (Anda akan memerlukan beberapa kode JavaScript tambahan untuk melakukan ini. Baca artikel untuk tahu lebih banyak).
Contoh bagus lainnya, adalah Anda dapat membuat halaman web Anda kompatibel baik dengan JavaScript dihidupkan atau dimatikan dengan potongan kode yang sama. Bayangkan Anda memiliki pilihan tanggal yang dibuat dalam JavaScript yang akan memungkinkan pengguna Anda untuk mengambil tanggal apa pun menggunakan kalender. Anda dapat menulis (atau menggunakan) bagian kode JavaScript yang sama untuk membuatnya berfungsi dengan JavaScript Anda AKTIFKAN atau MATI.
sumber
Ada analogi tempat makanan cepat saji yang sangat baik yang paling menjelaskan model event-driven Node.js, lihat artikel lengkapnya, Node.js, Kantor Dokter dan Restoran Makanan Cepat Saji - Memahami Pemrograman Berbasis Acara
Berikut ini ringkasannya:
Node.js adalah event-driven, tetapi sebagian besar server web berbasis thread.York menjelaskan cara kerja Node.js:
Anda menggunakan browser web Anda untuk membuat permintaan "/about.html" pada server web Node.js.
Server Node.js menerima permintaan Anda dan memanggil fungsi untuk mengambil file itu dari disk.
Ketika server Node.js sedang menunggu file untuk diambil, ia melayani permintaan web berikutnya.
Ketika file diambil, ada fungsi callback yang dimasukkan dalam antrian server Node.js.
Server Node.js menjalankan fungsi itu yang dalam hal ini akan merender halaman "/about.html" dan mengirimkannya kembali ke browser web Anda. "
sumber
Yah, saya mengerti itu
Bagi saya itu berarti Anda benar dalam ketiga asumsi. Perpustakaannya memang terlihat menjanjikan!
sumber
Juga, jangan lupa untuk menyebutkan bahwa Google V8 SANGAT cepat. Ini benar-benar mengubah kode JavaScript ke kode mesin dengan kinerja yang cocok dari kompilasi biner. Jadi bersama dengan semua hal-hal besar lainnya, itu GILA cepat.
sumber
Q: Model pemrograman event driven, terutama cara menangani I / O .
Benar. Itu menggunakan panggilan balik, sehingga setiap permintaan untuk mengakses sistem file akan menyebabkan permintaan untuk dikirim ke sistem file dan kemudian Node.js akan mulai memproses permintaan berikutnya. Itu hanya akan khawatir tentang permintaan I / O setelah mendapat respons kembali dari sistem file, di mana saat itu akan menjalankan kode panggilan balik. Namun, dimungkinkan untuk membuat permintaan I / O yang sinkron (yaitu, memblokir permintaan). Terserah pengembang untuk memilih antara asinkron (panggilan balik) atau sinkron (menunggu).
T: Ini menggunakan JavaScript dan parser adalah V8.
Iya
T: Dapat dengan mudah digunakan untuk membuat aplikasi server bersamaan.
Ya, meskipun Anda perlu kode tangan JavaScript cukup banyak. Mungkin lebih baik untuk melihat kerangka kerja, seperti http://www.easynodejs.com/ - yang dilengkapi dengan dokumentasi online lengkap dan contoh aplikasi.
sumber