NODE.JS | MEMBUAT MODULE


Cepat atau lambat  ketika kita  menuliskan banyak kode,  kita akan menyadari bahwa logika seharusnya dibagi menjadi beberapa modul yang berbeda. Dalam kebanyakan bahasa membaginya melalui Class, package / paket, atau sintaks. Namun, di JavaScript, kita tidak memiliki kelas secara native, Semuanya adalah obyek.Dalam praktiknya, objek mewarisi objek lainnya. Ada beberapa cara untuk mencapai pemrograman berorientasi objek di dalamJavaScript. Sobat bisa menggunakan prototype inheritance/peewarisan, object literals, atau bermain menggunakan  pemanggilan function/fungsi.


Node.js memiliki standard untuk menentukan modul. dengan menerapkan CommonJS, yang merupakan project yang menentukan sebuah lingkup JavaScript Jika Sobat mempunyai beberapa logika, dan Sobat ingin merangkumnya dengan Metode API , itu adalah langkah yang tepat, Ini  penting, dan mungkin menantang pada pemrograman saat ini. Kemampuan untuk membagi aplikasi kita ke berbagai bagian dan mendelegasikan fungsi /function bukan tugas yang mudah.ada baiknya mendefinisikan modul yang berbeda untuk fungsi yang berbeda karena biasanya Jika modul berisi banyak dependensi / ketergantungan, beroperasi dengan penyimpanan data/storage  yang berbeda, atau memiliki beberapa handling,kadang kode tidak dapat berjalan atau tidak dapat diuji .Dalam konteks Node.js, ini selesai dengan export, yang mana referensi modul export.


Dicontohkan disini kita akan membagun Aplikasi motor, kita membutuhkan modul utama bernama motor dan beberapa modul lainnya yang menangani beberapa bagian yang berbeda (misal :roda ,jok dan lampu).

[code hl="1, 4, 7"] // roda.js var typeOfBan; exports.init = function(type) { typeOfBan = type; } exports.info = function() { console.log("motor uses " + typeOfBan + " Ban."); } [/code]

konten motor.js. Ini berisi dua metode.Metode pertama, init, harus dipanggil dulu dan menerima satu setting, yaitu type dari roda ban '. Metode kedua hanya menghasilkan beberapa informasi. Di File utama, motor.js, kita harus mendapatkan instance dari roda dan menggunakan metode API . Hal ini dapat dilakukan sebagai berikut:


[code hl="1, 4, 7"] // motor.js var roda = require("./roda.js"); roda.init("bridgestone"); roda.info(); [/code]

maka kalau kita run aplikasi node motor.js kita , hasil yang didapatkan adalah


motor uses bridgestone ban




jadi semua yang ingin di tampilkan  harus menggunakan export obect, TypeOfBan adalah variable lokal untuk modul ini.ini hanya available di roda.js bukan di motor.js Ini juga merupakan praktik umum untuk diterapkan objek atau fungsi ke objek ekspor secara langsung, seperti yang ditunjukkan pada kode berikut sebagai contoh:



[code hl="1, 4, 7"] // mesin.js var Class = function() { // ... } Class.prototype = { forward: function() { console.log("Mobil bergerak maju."); }, backward: function() { console.log("Mobil bergerak maju."); } } module.exports = Class; [/code]

Dalam JavaScript, semuanya adalah objek dan objek itu memiliki properti prototip,seperti penyimpanan yang menyimpan variabel dan metode yang ada. Prototipe Properti sangat banyak digunakan saat pewarisan dalam JavaScript, karena menyediakan mekanisme untuk mentransfer logika


Memperjelas perbedaan antara module.exports dan export, Sobat Bisa lihat, file motor.js, kita menugaskan dua fungsi, init dan info, langsung ke export object global , object itu adalah referensi ke module.exports, dan setiap fungsi atau variabel yang melekat tersedia untuk diluarnya. Namun,Jika kita menetapkan objek atau fungsi baru secara langsung ke objek export, seharusnya tidak untuk mendapatkan akses ke sana setelah membutuhkan file tersebut. Ini harus dilakukan dengan module.exports , sebagai contoh:


[code hl="1, 4, 7"] // file.js module.exports.a = 10; exports.b = 20; // app.js var file = require('./file'); console.log(file.a, file.b); [/code]

Misalnya, file, app.js, dan file.js ada di direktori yang sama. Jika kita run app.js , kita akan mendapatkan 10 20 sebagai hasilnya. 





Namun, pertimbangkan apa yang akan terjadi terjadi jika kita mengubah kode file.js menjadi kode berikut :




mendapatkan 10 undefined sebagai hasilnya. Itu karenamodule.exports memiliki objek baru yang ditugaskan dan ekspor masih menunjuk ke yang lama.
Katakanlah bahwa modul di engine.js mengendalikan motordan memiliki method untuk bergerak motor maju dan mundur. Ini sedikit berbeda karena logika didefinisikan di dalamnya kelas terpisah dan kelas itu langsung dilewatkan sebagai nilai module.exports.Selain itu, karena kita mengekspor sebuah fungsi, dan bukan hanya sebuah objek, contoh kita seharusnya dibuat dengan kata kunci baru Kita akan melihat bagaimana mesin motor bekerja dengan kata kunci baru seperti yang ditunjukkan pada kode berikut:

[code hl="1, 4, 7"] var Engine = require("./engine.js"); var e = new Engine(); e.forward(); [/code]

Ada perbedaan yang signifikan antara penggunaan fungsi JavaScript sebagai konstruktor dan memanggil secara langsung. Bila kita sebut fungsi sebagai konstruktor, kita akan mendapatkan yang baru objek dengan prototype sendiri. Jika kita kehilangan kata kunci baru, nilai yang kita dapatkan akhir adalah hasil dari fungsi invokasi . 


Node.js menyimpan modul yang dikembalikan oleh metode yang diperlukan. Hal itu dilakukan untuk mencegahnya pemblokiran even loop dan meningkatkan kinerjanya. Ini adalah asinkron operasi, dan jika tidak ada cache, Node.js harus melakukan pekerjaan yang sama berulang-ulang.Ini juga bagus untuk diketahui bahwa kita bisa memanggil metode ini hanya dengan nama folder, tapi juga Harus ada package.json atau file index.js di dalam direktori. Semua Mekanisme ini dijelaskan dengan baik dalam dokumentasi resmi Node.js di http://nodejs.org/. yang kita butuhkan adalah implementasi asli ke dalamsistem, dan kita tidak harus menggunakan solusi pihak ketiga yang menyediakan modularitas. Seperti pada kode sisi klien, setiap modul Node.js dapat diperpanjang. Sekali lagi, seperti kitasedang menulis kode di JavaScript biasa, kita bisa menggunakan pendekatan yang terkenal inherit/warisan. Sebagai contoh, lihat kode berikut ini:





[code hl="1, 4, 7"] var Class = function() { } Class.prototype = new require('./engine.js')(); Class.prototype.constructor = Class; [/code]

Node.js bahkan menawarkan metode pembantu untuk tujuan ini. Katakanlah kita menginginkannya Perpanjang kelas engine.js tambahkan metode API untuk memindahkan motor di sebelah kiri danarah yang benar Kita bisa melakukan ini dengan kode berikut:
[code hl="1, 4, 7"] // control.js var util = require("util"); var Engine = require("./engine.js"); var Class = function() { } util.inherits(Class, Engine); Class.prototype.left = function() { console.log("The motor is moving to left."); }; Class.prototype.right = function() { console.log("The motor is moving to right."); } module.exports = Class; [/code]
Baris pertama mendapatkan referensi ke modul native element native Node.js. Ini fungsi yang sangat berguna . Baris keempat adalah di mana magic terjadi. Dengan memanggil pewarisnya metod, kita sebenarnya telah menetapkan prototype baru dari objek Kelas kita. setiap metode baru harus menggunakan prototipe yang sudah diterapkan. Itu sebabnya dan metode yang benar didefinisikan setelah pewarisan. Pada akhirnya, motor  kita akan masuk empat arah, seperti yang ditunjukkan pada potongan kode berikut

[code hl="1, 4, 7"] var Control = require("./control.js"); var c = new Control(); c.forward(); c.right(); [/code]

Memahami komunikasi  antar modul

Kita telah menemukan cara memasukkan logika kode ke modul. Sekarang, kita perlu tahu bagaimana membuat modul berkomunikasi satu sama lain. Node.js sebagai sistem event-driven. Ini juga disebut non-blocking karena di awal Node.js , bisa menerima permintaan baru bahkan sebelum sebelumnya permintaan sudah selesai Itu sangat efisien dan sangat scalable Katakanlah kita memiliki lampu, dan kita perlu tahu kapan dimulai. Pelaksanaan Logika semacam itu terdiri dari dua bagian. Yang pertama adalah modul pengkondisian lampu. Kita harus mengirimkan Caption yang menunjukkan dimulainya aksinya. Bagian kedua adalah kode lain yang mendengarkan caption tersebut. Kita akan membuat file baru bernama saklar.js berisi logika yang bertanggung jawab untuk Lampu, sebagai berikut:




[code hl="1, 4, 7"] // saklar.js var util = require("util"); var EventEmitter = require('events').EventEmitter; var Class = function() { } util.inherits(Class, EventEmitter); Class.prototype.start = function() { this.emit("started"); }; module.exports = Class [/code]
Kelas kita perluas modul Node.js yang disebut EventEmitter. Ini berisi metod seperti memancarkan atau menghidupkan, yang membantu kita membangun komunikasi berbasis event. Sana hanya satu metode kustom yang didefinisikan: start. Ini hanya mengirim sebuah caption yang menunjukkan bahwa lampu dihidupkan.
Kode berikut menunjukkan bagaimana kita bisa melampirkan listener

[code hl="1, 4, 7"] // motor.js var Lampu = require("./saklar.js"); var saklar = new Lampu(); saklar.on("started", function() { console.log("saklar conditioning started"); }); saklar.start(); [/code]

Contoh baru dari kelas lampu dibuat. Kita melampirkan sebuah acara listener dan menembakkan metode awal. Pawang dipanggil, dan pesannya adalah dicetak ke konsol Contohnya sederhana tapi menunjukkan bagaimana dua menyampaikan modul. Ini adalah pendekatan menawarkan enkapsulasi. Modul mengetahui tanggung jawabnya dan tidak tertarik pada operasi di pihak lain bagian dari sistem Ini hanya melakukan tugasnya dan mengirimkan notifikasi (kejadian). Untuk Misalnya, pada kode sebelumnya, kelas Lampu tidak tahu bahwa kita akan melakukannya keluaran pesan saat dimulai. Hanya tahu bahwa satu peristiwa tertentu seharusnya dikirim Sangat sering, kita perlu mengirim data saat memancarkan sebuah acara. Ini sangat mudah. Kita hanya harus melewati parameter lain bersamaan dengan nama acara. Disini adalah bagaimana kita mengirim properti status:
[code hl="1, 4, 7"] Class.prototype.start = function() { this.emit("started", { status: "cold" }); }; [/code]
Objek yang dilampirkan pada acara tersebut berisi beberapa informasi lampu modul. Objek yang sama akan tersedia di listener. Following
kode menunjukkan kepada kita bagaimana untuk mendapatkan nilai dari variabel status yang disebutkan sebelumnya:
[code hl="1, 4, 7"] saklar.on("started", function(data) { console.log("Status: " + data.status); }); [/code]

Ada pola desain yang menggambarkan proses sebelumnya. Ini disebut Observer. Dalam konteks pola itu, modul Lampu  disebut subjek, dan modul motor disebut pengamat. Subjek menyiarkan pesan atau kejadian kepada pengamatnya, memberi tahu mereka bahwa ada sesuatu yang berubah.Jika kita perlu menghapus Listener, Node.js memiliki metode untuk memanggilnya removeListener kita mengizinkan sejumlah pengamat tertentusetMaxListeners Secara keseluruhan, even adalah salah satu cara terbaik untuk mengirim wire bagian logic.Manfaat utamanya adalah Sobat mengisolasi modul, tapi tetap saja sangat komunikatif dengan rest aplikasi Sobat


Baca Juga


IDIARSO
IDIARSO

Menulis adalah kegiatan saya disela rutinitas kerja,silahkan berkomentar dibawah ini sebagai bahan masukan

Tidak ada komentar:

Posting Komentar