Getting started with Node.js modules: require, exports, imports and beyond

2019-02-10 05:24 PM

43

Getting started with Node.js modules: require, exports, imports and beyond. Modules are a crucial concept to understand Node.js projects.

Modules are a crucial concept to understand Node.js projects. In this post, we cover Node modules: require, exports and, the future import.

Node modules allow you to write reusable code. You can nest them one inside another. Using the Node Package Manager (NPM), you can publish your modules and make them available to the community. Also, NPM enables you to reuse modules made by other developers.

In this section, we are going to cover how to create Node modules and each one of its components:

Require

Exports

Module.exports

We are using Node 10.x for the examples and ES6 syntax. However, the concepts are valid for any version.

Require

require are used to consume modules. It allows you to include modules in your programs. You can add built-in core Node.js modules, community-based modules (node_modules) and local modules.

Let’s say we want to read a file from the filesystem. Node has a core module called ‘fs’:

In the code below, we are exporting the area and circumference functions. We defined the PI constant, but this is only accessible within the module. Only the elements associated with exports are available outside the module.

We have already covered exports and require. Notice the relationship between module.exports and exports. They point to the same reference. But, if you assign something directly to exports you will break its link to module.exports. More on that in the next section.

For our convenience __filename and __dirname are defined. They provide the full path to the current file and directory. The latter excludes the filename and print out the directory path.

For instance, for our ./circle.js module, it would be something like this:

__filename: /User/adrian/code/circle.js

__dirname: /User/adrian/code

Ok, we have covered exports, require, __filename, and __dirname. The only one we haven’t cover is module. Let’s go for it!

Module.exports vs Exports

The module is not global; it is local for each module. It contains metadata about a module like id, exports, parent, children, and so on.

exports is an alias of module.exports. Consequently, whatever you assign to exports is also available on module.exports. However, if you assign something directly to exports, then you lose the shortcut to module.exports. E.g.

And, finally you can run it using the experimental module feature flag:

node --experimental-modules main.mjs

If you don’t like experimental modules, another alternative is to use a transpiler. That converts modern JavaScript to older versions for you. Good options are TypeScript, Babel, and Rollup.

Summary

We learned about how to create Node.js modules and used it in our code. Modules allow us to reuse code easily. They provide functionality that is isolated from other modules. The require function is used to load modules. The exports and module.exports allow us to define what parts of our code we want to expose. We also explored the difference between module.exports and exports. Finally, we took a quick pick about what’s coming up for modules using imports.