Agak sulit untuk mengatakannya karena kata-kata ini tidak terdefinisi dengan baik. Dalam bahasa umum, saya pikir itu agak tidak lazim untuk memanggil Node. Saya pikir itu kerangka kerja, tapi saya akan mengalami kesulitan berdebat mengapa tidak tepatnya.
Ini semua menjadi tidak pasti, dan saya sering melihat penggunaan bahasa yang sangat buruk, jadi saya akan secara eksplisit dan mulai dari bawah
JavaScript adalah bahasa komputer, yang berarti, secara sempit, seperangkat konvensi yang memungkinkan kita untuk membaca dan menafsirkan sekelompok teks sebagai memiliki semantik eksekusi - kata yang bagus untuk "cara menafsirkan bahasa sebagai seperangkat instruksi". Kelas-kelas program yang disebut interpreter , compiler , transpiler , linter , highlighters , dll. Semuanya memuat teks dan berupaya melakukan sesuatu dengan pemahaman konvensional tentang cara menjalankan kode ini.
- Penerjemah sebenarnya melakukan semantik eksekusi dengan mengoperasikan beberapa mesin — biasanya komputer Anda. Anda dapat menganggap mereka sebagai orang kecil di dalam komputer Anda dengan membalik saklar seperti "cetak karakter ini" berdasarkan instruksi yang tertulis dalam program JavaScript Anda.
- Compiler mencoba untuk mengkonversi teks JavaScript ke set teks baru yang memiliki semantik eksekusi untuk bahasa yang berbeda — mungkin dengan properti khusus yang dapat dieksekusi langsung oleh komputer.
- Transpiler adalah bentuk kompiler umum yang mengambil teks JavaScript dan teks keluaran dari bahasa lain. Perbedaannya dengan demikian sedikit subyektif, tetapi biasanya orang menganggap kompiler sebagai keluaran kode tingkat sangat rendah dan transpiler sebagai keluaran kode tingkat tinggi .
- Linters , highlighters , checker type , dll. Semuanya mengambil teks JavaScript dan mengeluarkan beberapa jenis produk analitik, misalnya teks yang disorot, yang dipengaruhi oleh semantik eksekusi, tetapi sebenarnya tidak mewakili itu.
Sekarang, mari kita menggali sedikit tentang semantik eksekusi. Secara umum, semantik eksekusi melibatkan proses membaca teks bahasa dan sampai pada deskripsi mesin abstrak atau deskripsi efek samping yang dapat diamati . Yang ingin saya sarankan adalah bahwa keduanya menganggap perlu ada semacam "API tingkat rendah" baik untuk mengoperasikan mesin atau untuk melakukan efek yang dapat diamati. Ini biasanya dianggap sebagai bagian dari lingkungan runtime
- Lingkungan runtime atau runtime adalah seperangkat asumsi primitif yang diperlukan oleh konvensi bahasa agar dapat beroperasi. Sejauh bahasanya, mungkin ada beberapa asumsi tentang perilaku mereka, tetapi mereka tidak dapat diamati. Dalam citra juru bahasa di atas, "orang dalam" hanya menjentikkan sakelar runtime --- dia tidak dapat secara pribadi memeriksa apa yang mereka lakukan.
Kata runtime biasanya disalahgunakan berarti kumpulan yang diasumsikan primitif sendiri dan instantiasi aktual dari mereka.
Jadi, sekarang kita sampai pada sesuatu yang berbulu. Bahasa adalah seperangkat konvensi yang mengasumsikan keberadaan runtime untuk memberikan makna pada semantik pelaksanaannya. Itu tidak pernah "menyelidiki mereka" karena mereka berada di luar ruang lingkup.
Untuk benar-benar menggunakan bahasa Anda ingin sesuatu seperti kompiler atau juru bahasa di samping implementasi runtime. Compiler / interpreter dan runtime ini berjalan seiring dalam menjalankan kode Anda.
- Chrome V8 , sering disebut engine , adalah paket yang berisi interpreter, compiler, implementasi runtime yang kompatibel dengan antarmuka runtime yang diminta oleh konvensi standar JavaScript ECMA.
Jadi di mana Node.js cocok dengan ini?
Kita harus memecahnya menjadi beberapa bagian:
- Node.js memperluas bahasa JavaScript dengan menyediakan sekumpulan primitif lingkungan runtime yang lebih besar — yang berada di luar ruang lingkup standar ECMA. Ini termasuk hal-hal seperti file I / O . Ini berarti bahwa Node.js mengubah bahasa dan dalam beberapa hal bahasa baru: "JavaScript Node.js"
- Node.js, sebagai sebuah paket, berisi penerjemah dan kompiler. Itu hanya mencuri ini dari V8.
- Node.js menyediakan implementasi lingkungan runtime Node.js yang memungkinkan "JavaScript Node.js" dijalankan.
- Node.js menyediakan satu set perpustakaan standar yang dibangun di atas primitif baru yang membuatnya lebih mudah diakses oleh pengguna akhir "Node.js JavaScript".
Jadi Node.js banyak hal!
Tetapi apakah ini sebuah kerangka kerja?
Di sinilah terminologi benar-benar berantakan — tidak ada yang memiliki definisi yang baik, konsisten, bermakna tentang apa sebenarnya kerangka kerja itu.
Ada perdebatan yang mengamuk: "apa itu kerangka kerja versus perpustakaan" dan mereka berakhir dengan hal-hal yang tidak memuaskan seperti "perpustakaan adalah sesuatu yang Anda panggil dan kerangka kerja adalah sesuatu yang memanggil Anda". Saya bahkan tidak benar-benar ingin memberikan penjelasan yang menyedihkan hari itu — tetapi JavaScript, dan JavaScript khususnya, adalah pukulan besar bagi definisi ini karena keseluruhan teknik panggilan balik berarti Anda terus - menerus beralih antara menelepon dan dipanggil.
Menurut pendapat pribadi saya, ada sesuatu yang substansial di sini. Saya tidak ingin menggambar garis yang terang, tetapi saya hanya akan mengatakannya
- Seperangkat kode mirip perpustakaan jika berfungsi seperti seperangkat lego : dapat dibagi dan dibuat untuk perakitan. Meskipun mungkin ada beberapa contoh cara menggunakan perpustakaan, umumnya pada pengguna sendiri untuk mengumpulkannya sesuai kebutuhan mereka.
- Seperangkat kode mirip kerangka kerja jika tidak dapat dibagi dan menyiratkan konvensi *: memisahkan beberapa bagian dapat menyebabkan banyak asumsi gagal sehingga Anda harus memahami penggunaan konvensional untuk menggunakan kerangka kerja dengan benar.
Ini adalah garis gelombang tangan yang pasti, tapi saya ingin menarik poin yang sangat menarik tentang kerangka kerja:
Kerangka kerja menyiratkan seperangkat konvensi tentang bagaimana menafsirkan kode; karena itu mereka adalah bahasa dalam hak mereka sendiri.
Ini mungkin sesuatu yang juga ingin diperdebatkan orang, tetapi jika Anda membeli definisi saya sebelumnya bahwa suatu bahasa hanyalah seperangkat konvensi yang memberi kehidupan pada sekumpulan teks, maka setiap kali Anda meletakkan lapisan konvensi baru, Anda Saya sudah membangun bahasa baru. Mungkin dengan kerangka kerja bahan baku adalah interpretasi semantik dari bahasa inang mereka alih-alih file teks mentah, tetapi idenya sama!
Jadi dengan semua yang dikatakan, saya benar-benar senang memanggil Node.js sebuah kerangka kerja bahkan jika itu bertentangan dengan norma! Node.js menambahkan fungsionalitas ke JavaScript mentah dengan cara memperluas bahasa . Dengan itu membawa asumsi dan alat baru untuk bekerja dalam bahasa yang diperluas ini. Secara fungsional, ide-ide ini sama dengan ide-ide kerangka kerja lain yang diterima dengan baik seperti Ruby on Rails .
Saya berpendapat bahwa jika pada saat ini Anda merasa sedikit mual dan ingin berdebat bahwa ada perbedaan besar antara Ruby on Rails dan Node.js dengan cara ini maka saya di sana bersama Anda , tentu saja. Jenis dunia konseptual yang didiami keduanya secara dramatis berbeda - saya hanya ingin mengatakan bahwa mereka adalah hal yang sama: seperangkat konvensi untuk memperluas kekuatan bahasa dasar dalam domain tertentu.
Saya juga senang menyarankan bahwa domain Node.js kecil dan ketat sehingga konvensi yang ditambahkannya sederhana untuk dipikirkan dan relatif mudah dibuat benar. OTOH, Ruby on Rails hidup dalam domain kompleks "aplikasi web bisnis" yang tidak didefinisikan dengan baik, yang berarti bahwa konvensi yang dihimpunnya jelas tidak jelas dan rusak.
Tapi semua ini jauh dari kata, ya, perekrut mungkin tidak tahu apa artinya ketika mengatakan itu. Saya menduga "framework" hanya terdengar seperti kata yang lebih baik, lebih grokkable daripada "runtime" atau "engine".