1. Module wrapper function in Node.js
When you write a module in Node.js, the code is internally wrapped in this function:
(function (exports, require, module, __filename, __dirname) {
// Your module code here
});
Purpose of the Wrapper Function
Node.js uses this wrapper function to provide certain key variables and functionalities to each module. These variables include exports, require, module, __filename, and __dirname, which are essential for the module system in Node.js.
Let’s break it down:
1. exports
- Type: Object
- Purpose: This is a shortcut for
module.exportsand is used to export properties or methods from a module. - Example:
Equivalent to:exports.myFunction = () => { console.log('Hello'); };module.exports.myFunction = () => { console.log('Hello'); };
2. require
- Type: Function
- Purpose: This function is used to import modules. It can load both core modules (like
fs,path) and custom modules. - Example:
const fs = require('fs'); // Core module const myModule = require('./myModule'); // Custom module
3. module
- Type: Object
- Purpose: The
moduleobject represents the current module, andmodule.exportsis the object that gets returned when a module is required. You can assign anything tomodule.exportsto define what will be exported from the module. - Example:
module.exports = function() { console.log('Exporting a function directly.'); };
4. __filename
- Type: String
- Purpose: This variable contains the full path to the current module file, including the file name. It’s useful for getting the file’s location.
- Example:
console.log(__filename); // Outputs the full path to the current file
5. __dirname
- Type: String
- Purpose: This variable contains the directory name of the current module, i.e., the folder path without the file name. It's useful for creating absolute paths relative to the current file.
- Example:
console.log(__dirname); // Outputs the full directory path of the current file
Why is the Module Wrapped?
Node.js wraps modules in this function to:
- Provide Scope Isolation: It ensures that each module has its own private scope, preventing variable collisions between different modules.
- Pass Essential Variables: This is how Node.js passes the
exports,require,module,__filename, and__dirnameto each module automatically. - Implement the Module System: It allows Node.js to manage how modules are imported/exported and run.
Example of a Full Module in Action
Imagine you write the following code in myModule.js:
console.log(__filename); // Full path to myModule.js
console.log(__dirname); // Directory path to myModule.js
exports.hello = () => {
console.log('Hello from myModule');
};
When Node.js executes this module, it internally wraps the file's content like this:
(function (exports, require, module, __filename, __dirname) {
console.log(__filename); // Full path to myModule.js
console.log(__dirname); // Directory path to myModule.js
exports.hello = () => {
console.log('Hello from myModule');
};
});
This function is executed, and the appropriate values for exports, require, module, __filename, and __dirname are provided.
Summary
- The function
(function (exports, require, module, __filename, __dirname) { ... })is an internal mechanism in Node.js that wraps every module. - It gives each module the necessary tools (
exports,require,module, etc.) to export and import functionality and access module-specific paths. - This mechanism allows Node.js to maintain modularity, scope isolation, and provide essential information like the file and directory path.
1. CommonJS Module System (Default in Node.js)
CommonJS is the default module system in Node.js (before Node.js added support for ES6 modules). It uses require() for importing and module.exports or exports for exporting.
Exporting in CommonJS
// file: math.js
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
// Exporting functions
module.exports = { add, subtract };
Importing in CommonJS
// file: app.js
const { add, subtract } = require('./math');
console.log(add(2, 3)); // Output: 5
console.log(subtract(5, 3)); // Output: 2
2. ES6 Modules (ECMAScript Modules)
Starting from Node.js 12+, you can use ES6 modules, which use import and export syntax. To enable this, you need to either:
- Use the
.mjsfile extension. - Add
"type": "module"in yourpackage.json.
Exporting in ES6 Modules
// file: math.mjs or with package.json "type": "module"
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
Importing in ES6 Modules
// file: app.mjs or with package.json "type": "module"
import { add, subtract } from './math.JMS';
console.log(add(2, 3)); // Output: 5
console.log(subtract(5, 3)); // Output: 2
Key Differences
Syntax:
- CommonJS:
require()andmodule.exports. - ES6 Modules:
importandexport.
- CommonJS:
Default Exports:
In CommonJS, you can export a single value usingmodule.exports:// CommonJS default export module.exports = add; const add = require('./math');In ES6, you use the
defaultkeyword:// ES6 default export export default add; import add from './math.mjs';Asynchronous Loading:
ES6 modules support asynchronous loading natively, while CommonJS is synchronous.
Choosing Between CommonJS and ES6 Modules
- If you're working in modern environments or front-end codebases, use ES6 modules (
import/export). - For older Node.js projects or where compatibility is required, use CommonJS (
require/module.exports).
No comments:
Post a Comment