Apa yang Unik dari Node.js? [Tutup]

48

Baru-baru ini ada banyak pujian untuk Node.js. Saya bukan pengembang yang memiliki banyak paparan aplikasi jaringan. Dari pemahaman saya tentang Nodes.js, kekuatannya adalah: kami hanya memiliki satu utas yang menangani beberapa koneksi, menyediakan arsitektur berbasis peristiwa.

Namun, misalnya di Jawa, saya hanya dapat membuat satu utas menggunakan NIO / AIO (yang merupakan non-blocking API dari pemahaman saya), dan menangani beberapa koneksi menggunakan utas itu, dan saya menyediakan arsitektur berbasis peristiwa untuk mengimplementasikan data menangani logika (tidak harus sesulit itu dengan memberikan panggilan balik dll)?

Mengingat JVM menjadi VM yang lebih matang daripada V8 (saya berharap ini berjalan lebih cepat juga), dan arsitektur penanganan berbasis peristiwa tampaknya menjadi sesuatu yang tidak sulit untuk dibuat, saya tidak yakin mengapa Node.js menarik begitu banyak perhatian. Apakah saya kehilangan beberapa poin penting?

Adrian Shum
sumber
3
Saya bertanya-tanya mengapa itu downvoted ... Saya merasa pertanyaan ini lebih merupakan diskusi pemrograman jadi saya tidak memasukkan stackoverflow. Saya juga mencoba mencari topik yang serupa tetapi saya hanya menemukan informasi tentang kekuatan Nodes.js tetapi masalah saya adalah saya tidak begitu mengerti mengapa "kekuatan" begitu unik (yang masih belum dapat saya temukan)
Adrian Shum
6
Coba terapkan pola itu di Jawa. Tentu saja berhasil. Tapi Anda akan melihat satu hal: Ini akan sangat, sangat bertele-tele di Jawa: Anda perlu banyak panggilan balik, yang hampir selalu berarti membuat kelas baru. Itu mungkin terdengar seperti nitpick kecil, tetapi dalam program besar itu bisa menjadi jelek dan sulit cukup cepat.
Joachim Sauer
6
Callback Javascript sama rentan untuk menjadi berat - dan spaghetti seperti itu jauh lebih mudah untuk debug dan refactor di Jawa daripada di Javascript IMO.
funkybro
5
@AdrianShum: ini merupakan efek slashdot, apa pun yang tidak cocok dengan pola pikir kelompok akan diturunkan - seperti memuji Microsoft di /.
gbjbaanb
3
Saya terkejut tidak melihat ada yang menyebutkan hype.
deadalnix

Jawaban:

33

Meskipun konsep itu memang dapat diimplementasikan dalam banyak bahasa (dan seperti yang disebutkan dodgy_coder , konsep tersebut telah diimplementasikan dalam Ruby dan Python setidaknya), itu tidak sepele seperti yang Anda nyatakan.

Benar, Java memiliki API IO non-pemblokiran. Jadi Anda dapat melakukan raw disk / IO jaringan dengan cara yang tidak menghalangi. Namun setiap API yang entah bagaimana membungkus atau menangani IO perlu diimplementasikan dengan cara yang juga tidak menghalangi. Setiap parser XML, setiap driver Database, setiap konverter format file perlu ditulis untuk mendukung IO yang tidak menghalangi. Karena jika pustaka tunggal memblokir dalam pola ini, maka itu menurunkan kinerja server Anda ke nilai zaman batu.

Node.js memiliki infrastruktur perpustakaan itu, karena selalu dirancang seperti itu: setiap perpustakaan yang berusaha menjadi populer harus menyediakan API asinkron atau tidak akan digunakan.

Joachim Sauer
sumber
18
Ya. Dengan kata lain: Kekuatan Node.js yang paling penting adalah kelemahan ECMAScript yang paling penting: perpustakaan standar ECMAScript yang sangat jelek. Karena pengembang Node.js harus menemukan kembali setiap roda, mereka memiliki kesempatan untuk menemukan kembali dengan cara yang benar.
Jörg W Mittag
4
Yah, sejauh yang saya tahu ECMAScript selalu dirancang sebagai bahasa yang disematkan, jadi tidak perlu untuk API tingkat OS dalam bentuk apa pun (bahkan jaringan IO sebagian besar diabstraksi). Kekurangan itu memang menguntungkan Node.js.
Joachim Sauer
"setiap perpustakaan yang berusaha menjadi populer harus menyediakan API asnyronous atau tidak akan digunakan" Saya pikir itulah yang saya cari. Apakah ada sumber daya untuk melihat tentang bagaimana api asinkron disediakan untuk, misalnya, penguraian XML dan akses DB, di Node.js?
Adrian Shum
1
@AdrianShum secara umum, cari contoh pemrograman yang digerakkan oleh acara. Implementasi spesifik dapat ditemukan dalam banyak bahasa. Selain modul Node.js, Anda dapat melihat contoh Twisted dengan Python, twistedmatrix.com/trac/wiki , contoh POE di Perl, poe.perl.org , dan Ruby memiliki EventMachine, github.com/eventmachine/eventmachine
mghicks
19

Mungkin alasan utamanya adalah karena menggunakan JavaScript untuk menulis komponen sisi server untuk hal-hal seperti server web, aplikasi web, atau layanan web. Ini menyatukan JavaScript bahasa pengembangan ujung depan tradisional (sisi klien) dengan bahasa sisi server.

Anda benar - faktanya non-pemblokiran, menggunakan pola reaktor tidak unik - telah dilakukan sebelum menggunakan bahasa dan kerangka kerja lain, seperti EventMachine Ruby atau Python Twisted misalnya.

dodgy_coder
sumber
5
sangat sedikit teknologi memiliki fitur yang benar-benar unik, keunikan berasal dari kombinasi khusus mereka dari semua fitur mereka
jk.
1
Setuju, ada daftar di sini perpustakaan yang mendukungnya dalam semua bahasa utama ... Reactor Pattern on Wikipedia
dodgy_coder
10

Tiga alasan utama yang akan saya berikan adalah:

  1. IO Non Blocking / Asynchronous IO. Ini hash di mana-mana di web dan di poster sebelumnya. Satu hal yang saya akan berkontribusi adalah bahwa merancang kode Anda untuk secara eksplisit mengasumsikan perilaku asinkron membantu mesin kompiler untuk memaksimalkan perangkat keras. Ya, banyak dari kompiler JIT dan prosesor hyperthreading mengambil kode sinkron dan membantu memparalelkan eksekusi. Ini tentu saja merupakan pendekatan upaya terbaik. Sebaliknya, secara eksplisit membangun aplikasi untuk async io Anda memastikan mesin dan perangkat keras dapat memaksimalkan waktu eksekusi untuk kode Anda. Memang, saya tidak punya data kuantitatif untuk membuktikan ini, tetapi membuat saya merasa hangat untuk berpikir seperti ini.

  2. Basis kode tunggal untuk klien dan server. Ini memiliki sejumlah keuntungan: membantu mengoptimalkan biaya pusat data dengan dapat memindahkan logika bisnis dari server ke klien; membantu menggunakan kembali logika bisnis / validasi data; mengurangi kompleksitas keterampilan pengembang yang perlu ada untuk mendukung produk (vs. Python & javascript).

  3. Hambatan masuk yang rendah. Dalam banyak hal, Javascirpt seperti Basic, Pascal dan Perl dari tahun yang lalu. Sangat mudah untuk mulai menulis kode dan tidak memerlukan banyak pengetahuan domain untuk memulai. Ini juga membantu mengurangi biaya pengembangan Anda dengan bisa membawa lebih banyak pengembang jr dan meningkatkan proyek. [Tentu saja Anda harus melewati ideolog yang percaya bahasa pemrograman akan sulit untuk menyingkirkan pengembang yang berfungsi rendah]

cat
sumber
Saya tidak yakin saya akan merekomendasikan membangun tim Node sepenuhnya dengan jr. Devs JS. Arsitektur bukanlah sesuatu yang harus kita pikirkan dalam proyek web / UI kelas jr lebih dan JS membutuhkan waktu lama untuk benar-benar pandai dalam hal membangun untuk jangka panjang seperti bahasa lain tidak bahkan jika Anda bisa mendapatkan hasil yang relatif cepat pada tingkat pengalaman yang lebih rendah pada proyek yang tidak terlalu rumit daripada biasanya.
Erik Reppen
Saya setuju dengan @ErikReppen; sebuah tim arsitektur yang seluruhnya beranggotakan junior (terlepas dari bahasa) seperti merancang dan membangun rumah sepenuhnya menggunakan tukang kayu yang pandai membangun kursi, meja, dan rumah anjing.
Wildcard