How to use ES6 import syntax in Node.js

Published on

Introduction

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 and module.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.

ES6 Import

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

How to use it

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 👋

Updates straight in your inbox!

A periodic update about my life, recent blog posts, TIL (Today I learned) related stuff, things I am building and more!

Share with others

Liked it?

Views

You may also like

  • nodejshomelab

    Get Up and Running with the Latest Version of Node.js on Raspberry Pi

    Do you want to run the latest version of Node.js on your Raspberry Pi? This guide will take you through the process of installing the latest version of Node.js on armhf architecture using binary packages.

    2 min read
  • nodejs

    How to manage multiple Node.js versions on your system

    Learn how to manage multiple versions of Node.js on your local system with ease.

    6 min read
  • nodejs

    API Rate Limit for Production Ready Applications in Node.js

    Learn how to quickly rate limit your API endpoints for small and large size applications

    8 min read