Default exports enable developers to export only a single class, function, variable, object, array, constant, etc. You write module.exports
and assign a component that you want to export as default exports.
Note: If you are interested in learning what is named exports in Node.js, then visit Node.js export modules.
//template.js file function add(a, b){ return a+b; } var msg = 'Hello, World!'; let arr = [21, 5, 69]; class Rectangle{ constructor(length, width){ this.length = length; this.width = width; } area(){ return this.length*this.width; } } let person = { firstName: 'Mohit', lastName: 'Natani' } module.exports = Rectangle; console.log(module);
In the code, the Rectangle
class is exported as default exports. You can even see this by printing the module
object.
Module { id: '.', path: '/home/runner/DroopyDefiantIntegers', exports: [class Rectangle], parent: null, filename: '/home/runner/DroopyDefiantIntegers/template.js', loaded: false, children: [], paths: [ '/home/runner/DroopyDefiantIntegers/node_modules', '/home/runner/node_modules', '/home/node_modules', '/node_modules' ] }
You can see that exports
key's value is a Rectangle
class. The benefit of using default exports is that you can import the exported component with any name.
//app.js file const anyName = require('./template'); let rect = new anyName(10, 20); console.log(`Area of rectangle: ${rect.area()}`);
Output
Area of rectangle: 200
Here, the Rectangle
class is imported with the name anyName
.
It is recommended that you use default exports only once in the module. If you use it for more than once, then the last executed default exports statement will be considered the final default exports. Let me explain you with the help of an example.
//template.js file function add(a, b){ return a+b; } var msg = 'Hello, World!'; let arr = [21, 5, 69]; class Rectangle{ constructor(length, width){ this.length = length; this.width = width; } area(){ return this.length*this.width; } } let person = { firstName: 'Mohit', lastName: 'Natani' } module.exports = Rectangle; module.exports = add; console.log(module);
In the above code, Rectangle
class and add
function are exported as default exports. When you console.log
module
object, you will find that only add
function is exported as the default exports because it is the last statement executed for default exports.
Module { id: '.', path: '/home/runner/DroopyDefiantIntegers', exports: [Function: add], parent: null, filename: '/home/runner/DroopyDefiantIntegers/template.js', loaded: false, children: [], paths: [ '/home/runner/DroopyDefiantIntegers/node_modules', '/home/runner/node_modules', '/home/node_modules', '/node_modules' ] }
//app.js file const anyName = require('./template'); console.log(`Sum of 2 and 3 is ${anyname(2, 3)}`);
Output
Sum of 2 and 3 is 5
When you use named and default exports together, make sure that you use default exports first and then use named exports; otherwise, you will get a weird result. Also, it will be better to log the module object of the module that you want to import. By doing this, you will get a better picture of the exported components.
//template.js file function add(a, b){ return a + b; } var msg = 'Hello, World!'; let arr = [21, 5, 69]; class Rectangle{ constructor(length, width){ this.length = length; this.width = width; } area(){ return this.length*this.width; } } let person = { firstName: 'Mohit', lastName: 'Natani' } module.exports = Rectangle; module.exports.ar = arr; module.exports.person = person; console.log(module);
Here, Rectangle
class is exported as the default export. Array arr
is exported as ar
and person
object is exported as person
.
There are two ways of importing named and default exports together in Node.js:
//app.js file const anyName = require('./template'); const {person, ar} = require('./template'); let rect = new anyName(10, 20); console.log(`Area of rectangle: ${rect.area()}`); console.log(`Array: ${ar}`); console.log(`Full Name: ${person.firstName} ${person.lastName}`);
In this method, you have imported named and default exports separately. Rectangle
class is imported as default import, whereas person
object and array ar
are imported as named imports.
Output
Area of rectangle: 200 Array: 21,5,69 Full Name: Mohit Natani
If you want to import in a single statement, then follow the below code:
//app.js file const anyName = require('./template'); let rect = new anyName(10, 20); console.log(`Area of rectangle: ${rect.area()}`); console.log(`Array: ${anyName.ar}`); console.log(`Full Name: ${anyName.person.firstName} ${anyName.person.lastName}`);
Here, you have imported the entire module and access exported components using dot notation. Also, default exported component is accessed using anyName
.