17
How to use ES6 import syntax in Node.js
A module is a JavaScript files that can export one or more values. These values can be variables, objects, or even functions.
JavaScript does not have built-in support for modules, but the community has created impressive work-arounds. The two most important standards are:
CommonJs Modules - What we know as the
require()
method for importing modules andmodule.exports
for exporting. This is designed for synchronous loading and mainly used for server.Asynchronous Module Definition (AMD) - The most popular implementation of this standard is RequireJS. This is designed for asynchronous loading and mainly used for browsers.
The goal for ECMAScript 6 modules was to create a format that both users of CommonJS and of AMD are happy with. The syntax for importing modules looks like this..
import Express from 'express'; // for default imports
import { foo } from 'bar'; // for named imports
and exporting with named and default exports like this..
export const MAX_USERS = 20; // Named exports
function sayHi(name) {
console.log(`Hi ${name}!`);
}
export default sayHi; // Default export
If you try to run this code directly then you would get an error something like
SyntaxError: Cannot use import statement outside a module
Now, if you are using Node.js version 14.x.x or above then the simplest fix is to add "type": "module" in your package.json file.
{
"type": "module"
}
However if you are on any version below 14, you would have to use Babel to compile your code before running it.
Note: Babel is not framework or platform opinionated. This means that it can be used in any project that is written in JavaScript and thus, in a Node.js project as well.
Let's start by installing some dev dependencies,
yarn add -D @babel/core @babel/preset-env @babel/node
# OR
npm install -D @babel/core @babel/preset-env @babel/node
Next is to create a babel.config.json
file and add the following config,
{
"presets": ["@babel/preset-env"]
}
Now you just have to use babel-node
instead of node, so your start/dev script may look like this now
{
"scripts": {
"dev": "nodemon --exec babel-node server.js"
}
}
Hope this was helpful. See you in another one 👋
17