JavaScript(JS) Modules
JavaScript Modules
JavaScript modules provide a way to organize code into reusable, independent, and maintainable units. A module is a self-contained unit of code that defines a specific functionality, and can be used in other parts of the application.
There are two types of JavaScript modules:
ES6 modules: This is the official module format introduced in ECMAScript 6. ES6 modules use the
import
andexport
keywords to define and use modules. ES6 modules are supported in most modern browsers and Node.js.CommonJS modules: This is a module format used in Node.js. CommonJS modules use the
require()
function to import modules, and themodule.exports
object to export modules.
Here's an example of how to define and use a simple ES6 module:
// math.js - define a module that exports a function export function add(a, b) { return a + b; } // app.js - use the module in another file import { add } from './math.js'; console.log(add(2, 3)); // output: 5
In this example, the math.js
file defines a module that exports a add()
function using the export
keyword. The app.js
file imports the add()
function from the math.js
module using the import
keyword, and then uses the function to add two numbers.
Note that in order to use ES6 modules in a browser, you need to include the type="module"
attribute in your script tag:
<script type="module" src="app.js"></script>
Using modules helps you to better organize your code, avoid global namespace pollution, and makes your code more reusable and maintainable.
Export Multiple Objects
In JavaScript, you can export multiple objects from a module using the ES6 module syntax. This allows you to define and export multiple objects in a single module, which can be imported and used in other parts of your application.
Here's an example of how to export multiple objects from a JavaScript module:
// math.js - define a module that exports multiple objects export function add(a, b) { return a + b; } export function subtract(a, b) { return a - b; } export const PI = 3.14159;
In this example, the math.js
module exports three objects: the add()
and subtract()
functions, and the PI
constant. Each object is exported using the export
keyword.
To use the exported objects in another module, you can use the import
keyword to import them:
// app.js - use the exported objects in another module import { add, subtract, PI } from './math.js'; console.log(add(2, 3)); // output: 5 console.log(subtract(5, 2)); // output: 3 console.log(PI); // output: 3.14159
In this example, the add()
, subtract()
, and PI
objects are imported from the math.js
module using the import
keyword, and then used in the app.js
module.
By exporting multiple objects from a module, you can define and organize related functionality in a single module, and make it more easily reusable and maintainable.
Renaming imports and exports
In JavaScript, you can rename imported and exported objects using the ES6 module syntax. This allows you to define aliases for objects that you import or export, which can be useful for avoiding naming conflicts or making your code more readable.
Here's an example of how to rename imported and exported objects in JavaScript:
// math.js - define a module that exports and renames objects export function add(a, b) { return a + b; } export function subtract(a, b) { return a - b; } const PI = 3.14159; export { PI as mathPI };
In this example, the math.js
module exports the add()
and subtract()
functions, and renames the PI
constant to mathPI
using the as
keyword.
To use the renamed objects in another module, you can import them using the new name:
// app.js - use the renamed objects in another module import { add as addNumbers, subtract } from './math.js'; import { mathPI } from './math.js'; console.log(addNumbers(2, 3)); // output: 5 console.log(subtract(5, 2)); // output: 3 console.log(mathPI); // output: 3.14159
In this example, the add()
function is imported and renamed to addNumbers
using the as
keyword. The subtract()
function is imported without renaming. The mathPI
constant is imported using its renamed name.
By renaming imports and exports, you can make your code more readable, avoid naming conflicts, and improve code maintainability.
Default Export
In JavaScript, you can use default exports to export a single object from a module. Default exports allow you to specify a fallback value for a module, which is used when the module is imported without specifying a name.
Here's an example of how to use default exports in JavaScript:
// math.js - define a module that exports a default object export default function add(a, b) { return a + b; }
In this example, the math.js
module exports a default object, which is the add()
function. The default
keyword is used to specify that this is the default export for the module.
To use the default export in another module, you can import it using any name you like:
// app.js - use the default export in another module import myAddFunction from './math.js'; console.log(myAddFunction(2, 3)); // output: 5
In this example, the myAddFunction
name is used to import the default export from the math.js
module. The imported function can be used just like any other function.
You can also use default exports with other objects, such as classes or constants. Here's an example:
// config.js - define a module that exports a default object export default { apiUrl: 'https://api.example.com', timeout: 5000 }
In this example, the config.js
module exports a default object that contains some configuration options. This object can be imported and used in other parts of the application:
// app.js - use the default export in another module import myConfig from './config.js'; console.log(myConfig.apiUrl); // output: "https://api.example.com" console.log(myConfig.timeout); // output: 5000
By using default exports, you can simplify your code and make it more concise, while still providing a flexible and reusable module interface.
Modules Always use Strict Mode
in JavaScript modules, strict mode is always enabled by default. This means that all code inside a module is executed in strict mode, regardless of whether you explicitly enable it with a "use strict" directive.
Strict mode is a set of JavaScript rules and restrictions that provide additional security and prevent common programming errors. It disallows certain features that are prone to errors or considered bad practice, and enforces stricter syntax and semantics.
When strict mode is enabled in a module, the following behaviors are enforced:
- Variables must be declared before use.
- Assignments to non-writable, non-configurable properties will throw an error.
- Deleting non-configurable properties will throw an error.
- Duplicate parameter names are not allowed.
- The
this
keyword is undefined in functions called without an explicit object context. - Octal numeric literals are not allowed.
- The
with
statement is not allowed. - The
eval()
function and thearguments
object have restricted behavior.
These are just a few examples of the strict mode rules. Enabling strict mode in modules is recommended to ensure that your code is more secure and less prone to errors. If you need to disable strict mode for some reason, you can do so by using a separate script file or by wrapping your code in a function that does not use strict mode. However, this is not recommended as it can introduce additional complexity and make your code harder to maintain.
Benefit of Using Module
There are several benefits to using modules in JavaScript:
Encapsulation: Modules provide a way to encapsulate code and data, keeping them private and isolated from the rest of the application. This helps to prevent naming collisions and makes it easier to reason about and maintain the code.
Reusability: Modules can be reused across different parts of the application or in different applications altogether. This saves development time and reduces code duplication.
Organization: Modules allow you to organize your code into logical units that can be easily understood and navigated. This makes it easier to manage and maintain large codebases.
Dependency management: Modules can declare dependencies on other modules, ensuring that they are loaded and executed in the correct order. This helps to prevent errors and make the code more robust.
Performance: Modules can be loaded asynchronously, improving the performance of the application by reducing the startup time and improving the overall user experience.
Security: Modules can provide a way to control access to sensitive code and data, ensuring that only authorized parts of the application can access them. This helps to prevent security breaches and data leaks.