Skip to main content

Command Palette

Search for a command to run...

JavaScript Modules: Import and Export Explained

Published
5 min read
JavaScript Modules: Import and Export Explained

As JavaScript applications grow, managing code becomes more challenging. A small script might fit comfortably inside one file, but real-world projects quickly expand to hundreds or even thousands of lines. Without a clear structure, everything ends up mixed together, making the code difficult to read and maintain.

This is where JavaScript modules come in.

Modules allow developers to split code into smaller, organized pieces that can be reused across different parts of an application. Instead of writing everything in one large file, you can separate logic into multiple files and connect them using import and export.


Why Modules Are Needed

Imagine building a simple application with the following features:

  • User authentication

  • Utility functions

  • API requests

  • UI components

If all of this code lives inside a single file, it quickly becomes hard to navigate.

Example of a messy structure:

// authentication logic
// utility functions
// API calls
// UI logic
// more helper functions

Finding a specific function in a large file can take time, and modifying one part of the code might accidentally affect another.

Modules solve this problem by allowing developers to organize related functionality into separate files.

For example:

auth.js
utils.js
api.js
main.js

Each file focuses on one responsibility, making the project easier to manage.


Exporting Functions or Values

For a module to be useful, it must expose some functionality that other files can use. This is done with the exportkeyword.

Example:

// math.js

export function add(a, b) {
  return a + b;
}

Here, the function add is exported from the file. Other modules can now import and use it.

You can also export variables or constants.

export const pi = 3.14159;

Multiple exports can exist in the same file.

export function subtract(a, b) {
  return a - b;
}

export function multiply(a, b) {
  return a * b;
}

Importing Modules

Once a function or value has been exported, it can be imported into another file using the import keyword.

Example:

// main.js

import { add } from "./math.js";

console.log(add(5, 3));

Output:

8

Here’s what happens step by step:

  1. math.js exports the add function.

  2. main.js imports that function.

  3. The function can now be used as if it were defined in the same file.

Modules allow developers to reuse code across different parts of an application without rewriting it.


Default vs Named Exports

JavaScript supports two types of exports: named exports and default exports.

Understanding the difference helps when organizing modules.


Named Exports

Named exports allow a file to export multiple functions or values.

Example:

// math.js

export function add(a, b) {
  return a + b;
}

export function subtract(a, b) {
  return a - b;
}

Importing them requires matching names:

import { add, subtract } from "./math.js";

The curly braces indicate that you are importing specific named exports.


Default Exports

A default export is used when a module exports one main feature.

Example:

// logger.js

export default function logMessage(message) {
  console.log(message);
}

Importing a default export looks slightly different.

import logMessage from "./logger.js";

logMessage("Hello World");

Notice that there are no curly braces.

Another difference is that the imported name can be changed if needed.

import log from "./logger.js";

log("Test message");

Benefits of Modular Code

Using modules provides several important advantages.

Better Organization

Breaking code into separate files keeps each module focused on a single responsibility.

Example:

math.js → calculations
api.js → server requests
auth.js → login logic

This makes projects easier to navigate.


Code Reusability

Functions written in one module can be reused across multiple parts of the application.

Instead of duplicating logic, developers simply import the needed function.


Easier Maintenance

When code is modular, fixing bugs or updating functionality becomes easier. Changes can be made in one module without affecting unrelated parts of the project.


Improved Readability

Smaller files are easier to understand than one large file containing everything.

Developers can quickly locate the code they need.


A Simple Example of Modular Code

Suppose you want to organize utility functions.

math.js

export function add(a, b) {
  return a + b;
}

export function multiply(a, b) {
  return a * b;
}

main.js

import { add, multiply } from "./math.js";

console.log(add(2, 3));
console.log(multiply(4, 5));

Output:

5
20

By separating the logic into modules, the project stays organized and easier to expand later.


Final Thoughts

JavaScript modules are an essential tool for managing larger applications. By splitting code into smaller files and connecting them with import and export, developers can build systems that are easier to read, maintain, and scale.

Modules encourage good project structure and reduce duplication, making them a fundamental concept in modern JavaScript development. As projects grow, modular design becomes increasingly valuable for keeping code clean and manageable.