Module Patterns in JavaScript

Module Patterns in JavaScript

January 31, 2023


Module patterns in JavaScript provide a way to organize and share code in a maintainable and reusable way. There are several types of module patterns available in JavaScript, including ES6, AMD, UMD, and FESM. In this blog, we will explore each of these module patterns with code examples and understand their uses and benefits.

ES6 Modules

ES6 Modules: ES6 modules are the standardized way of creating and sharing modules in JavaScript. They allow us to export variables, functions, or classes from a module and import them into another module. This makes it possible to split a large application into smaller and manageable parts, providing better organization and maintainability. The syntax for ES6 modules is simple and straightforward.
// moduleA.js export const message = 'Hello from Module A'; // moduleB.js import { message } from './moduleA.js'; console.log(message); // Output: Hello from Module A

AMD (Asynchronous Module Definition)

AMD is a module pattern that was designed to work with older browsers that did not support ES6 modules. It allows modules to be loaded asynchronously, which is essential for improving the performance of large applications. The syntax for AMD modules is slightly more complex than ES6 modules, but it provides the added benefit of being able to handle dependencies between modules.
// moduleA.js define(function () { return { message: 'Hello from Module A', }; }); // moduleB.js define(['moduleA'], function (moduleA) { console.log(moduleA.message); // Output: Hello from Module A });

UMD (Universal Module Definition):

UMD is a module pattern that combines the features of both ES6 and AMD modules. UMD modules can be used with both modern browsers that support ES6 modules and older browsers that require AMD modules. This makes UMD a great choice for creating modules that need to be compatible with a wide range of environments.
// moduleA.js (function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define([], factory); } else if (typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(); } else { // Browser globals (root is window) root.moduleA = factory(); } })(this, function () { return { message: 'Hello from Module A', }; }); // moduleB.js const moduleA = require('./moduleA'); console.log(moduleA.message); // Output: Hello from Module A

FESM (Flattened ECMAScript Module)

FESM is a module pattern that flattens the dependencies between modules into a single file. This allows for faster loading times and improved performance, especially in large applications. FESM is typically used in production environments, where performance is critical.


In conclusion, each of these module patterns has its own uses and benefits. ES6 modules are the standard for creating and sharing modules in JavaScript, while AMD and UMD provide the added benefits of asynchronous loading and compatibility with older browsers. FESM is ideal for production environments where performance is critical. The choice of which module pattern to use will depend on the specific requirements of your application and the environment in which it will be used.