Chào các bạn, trong bài viết này chúng ta cùng tìm hiểu về Module Wrapper Function trong NodeJS nhé!

Như các bạn đã biết, trong môi trường trình duyệt, các biến hoặc hàm được khai báo sẽ được thêm vào đối tượng window (global scope), một file JS có thể gọi một hàm, hoặc thay đổi giá trị của một biến được khai báo ở một file khác.

Ví dụ:

// a.js
var x = 1;
function f() {}

// b.js
console.log(x); // oke
f(); // oke

Tuy nhiên trong Node, mọi file được coi là một module, các biến hoặc hàm được khai báo chỉ tồn tại trong module đó. Để sử dụng được chúng trong một module khác, cần phải sử dụng cú pháp exportsrequire để sử dụng

Ví dụ:

var x = 1;
function f() {}
module.exports.x = x;
module.exports.f = f;

// b.js
const {x, f} = require("a"); // cú pháp destructuring assignment
console.log(x); // oke
f(); // oke

Tuy nhiên, bạn có thắc mắc tại sao NodeJS làm được như thế? Thực ra, Node không thực thi mã JS trong các module một cách trực tiếp, nó bọc đoạn mã trong các module trong một hàm như thế này:

(function (exports, require, module, __filename, __dirname) {
// code của bạn
})(...)

Cho bạn nào chưa biết, cú pháp này được gọi là IIFE (Immediately Invoked Function Expression), có nghĩa là khai báo một hàm và thực thi nó ngay lập tức.

Các biến khai báo bên trong một hàm sẽ chỉ tồn tại bên trong phạm vi của hàm đó, bởi vậy, trong Node, biến mà các bạn khai báo sẽ chỉ tồn tại trong module đó.

Các tham số mà hàm wrapper nhận vào là các đối tượng đặc biệt, ví dụ với module:

Module {
  id: '.',
  path: '/home/banx9x/Documents/node',
  exports: {},
  parent: null,
  filename: '/home/banx9x/Documents/node/app.js',
  loaded: false,
  children: [],
  paths: [
    '/home/banx9x/Documents/node/node_modules',
    '/home/banx9x/Documents/node_modules',
    '/home/banx9x/node_modules',
    '/home/node_modules',
    '/node_modules'
  ]
}

Mình sẽ không bàn đến chi tiết các tham số khác, ở đây mình chỉ quan tâm đến module.exports, cũng là một object, khi gọi hàm require, nó sẽ gọi đến module được chỉ định, lấy các giá trị trong module.exports và cho phép sử dụng các giá trị được khai báo trong module khác.

Tham khảo khoá Lộ trình Node.js 4.5 tháng của Techmaster