Module
Introduction
As our application grows bigger, we want to split it into multiple files, so called “modules”. A module may contain a class or a library of functions for a specific purpose.
But eventually scripts became more and more complex, so the community invented a variety of ways to organize code into modules, special libraries to load modules on demand.
AMD (Asynchronous Module Definition)
It is invented by RequireJS
Here is an example
// Define moduleA using AMD
define(function() {
// Module implementation
return {
sayHello: function() {
console.log("Hello from moduleA!");
}
};
});
// Load moduleA and use it
require(['moduleA'], function(moduleA) {
moduleA.sayHello();
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AMD Example</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.js"></script>
</head>
<body>
<h1>AMD Example</h1>
<script>
// Configure RequireJS
require.config({
baseUrl: '.',
paths: {
'moduleA': 'moduleA',
}
});
// Load main.js to start the application
require(['main']);
</script>
</body>
</html>
CommonJS
It is mainly designed for NodeJS usage
By default, NodeJS treats JavaScript code as CommonJS modules. Because of this, CommonJS modules are characterized by the
require
statement for module imports andmodule.exports
for module exports.
module.exports.a = "a";
module.exports = "b"
const {a} = require("./a");
const b = require("./n");
console.log(a ,b); // a , b
ECMAScript 6 (ES6)
After javascript comes to version 6, import & export is added
Most of browser support es6, however, NodeJS default is using commonJS
In order to apply es6 on nodejs, it is recommended to use typescript for development, and compile in commonjs
import {a} from "./a";
console.log("123",a);
export const a = 'A';
After compiling into javascript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var a_1 = require("./a");
console.log("123", a_1.a);
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.a = void 0;
exports.a = 'A';
Syntax
Given the view1 module
import view1 from './view1.js';
would basically be equivalent to
import * as temp from './view1.js';
const view1 = temp.default;
In fact the first import above a shorthand for
import { default as view1 } from './view1.js';
ESNext
Targeting ESNext enables module system using the next version of JavaScript is, meaning it includes the latest proposals and features that may not be finalized yet.
References
Last updated
Was this helpful?