Asas Node.js – Module Wrapper Function

Baru-baru ni aku ada update post Asas Node.js – Import/export module. Memandangkan aku dah sentuh sikit pasal module kat situ jadi aku nak sentuh juga sedikir mengenai module wrapper function.

Setiap module sebenarnya tidaklah execute kod didalamnya secara terus. Contohnya:

// app.js

var age = 27;

function showAge(){
  console.log(age);
}

“under the hood” sebenarnya content app.js akan di ‘convert’ kepada sesuatu seperti ini:

(function (exports, require, module, __filename, __dirname) {

var age = 27;

function showAge(){
  console.log(age);
}

})

Kod sebenar adalah lebih complex. ini adalah simplified version yang aku buat untuk menerangkan sebenarnya module nodejs tidak execute contentnya secara terus tapi sentiasa di ‘wrap’ dalam ‘Immediately Invoked Function Expression (IIFE)’. Function yang ‘wrap’ content module inilah yang dinamakan sebagai Module Wrapper Function.

Jika kita lihat IFFE at di atas, kita dapat lihat parameter/argument mengandungi:

  • exports
  • require
  • module
  • __filename
  • __dirname

Untuk parameter require & module, kita dah sentuh di post Asas Node.js – Import/export module. Kita dapat lihat disini sebenarnya require berada di skop lokal module tersebut bukannya skop global.

Parameter/argument exports ini adalah sebenarnya hanya reference kepada module.exports. Untuk ringkasnya kita juga boleh lakukan begini.

// logger.js
function log(text){
    console.log(text)
}

exports.log = log;

Disebabkan ia hanyalah satu reference. Kita tak boleh tukar jenisnya dari objek kepada jenis lain. Lihat contoh dibawah:

function log(text){
    console.log(text)
}

exports = log; // SALAH! TIDAK BOLEH!

Contoh diatas ini SALAH & TIDAK BOLEH DIBUAT kerana ianya hanyalah reference kepada module.exports kita tak boleh ubah reference itu. Jadi aku sentiasa recommend untuk selalu gunakan module.exports untuk export.

Parameter seterusnya adalah __filename mewakili nama file module tersebut. Parameter __dirname pula mewakili path file module tersebut.

// logger.js

console.log(__filename);
console.log(__dirname);

Jika kita run node logger.js. Result adalah seperti berikut:

/Users/ceghap/codes/learn_node/logger.js
/Users/ceghap/codes/learn_node

Sekian. 😀

Ulasan