Node Module System

Every file in a Node application is considered a module.

Values defined are scoped in their file. If you want to use a value, you must explicitly export it from its file and then import it into another file.

This is the same as in ES6 modules. The only difference is the syntax of exports and imports.

Nodes default module system is based on CommonJS.1

// acount.js file
const INTEREST_RATE = 0.2;

class Account {
  constructor(balance) {
    this.balance = balance;
  }

  deposit(amount) {
    this.balance += amount;
  }

  widthraw(amount) {
    this.balance -= amount;
  }
}

module.exports.interest = INTEREST_RATE;
module.exports.Account = Account;

Notice the use of module.exports instead of the export keyword in ES6 modules.

The module.exports is a JavaScript object. Any value which you want to export can be added as a property to the exports object.

To load a module, we use the require function (instead of ES6 import statements).

// index.js file
const { Account } = require("./account.js");

const checking = new Account(100);
checking.deposit(20);

console.log(checking.balance);
  • The require function takes the location of the module relative to the current file.
  • It returns the module.exports object from the module file. In the code snippet above, I have used Destructuring assignment to destruct the exports object.
  • The require statement can be placed anywhere in a file but it is typically put at the top. (Consider this a good practice and follow it!)
1

You can also use the ES6 module system with Node. Please refer to Node's document on ECMAScript 2015 (ES6) and beyond.