JS模块化——AMD、CommonJS和ESModules

这篇具有很好参考价值的文章主要介绍了JS模块化——AMD、CommonJS和ESModules。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JS模块化——AMD、CommonJS和ESModules

前端模块化是指将前端代码拆解成互相独立的小块,每一块完成特定的功能,这些小块被称为模块。通过模块化,可以更好的组织管理代码,实现功能的服用。

方法介绍

传统方法:

在模块化概念出现之前,JS 的脚本通常是通过 script 标签直接嵌入 HTML 中的,但是不同 js 文件里申明的变量都会存在于全局作用域中。不同的开发者维护不同的 js 文件,很难保证不和其它 js 文件冲突。全局变量污染开始成为开发者的噩梦。

立即执行函数:

立即执行函数表达式(IIFE)是用来创建局部作用域,可以避免全局作用域污染。

(function() {
    // 这里的变量和函数都在局部作用域中
    var privateVar = 'I am private';
    function privateFunction() {
        console.log(privateVar);
    }

    // 对外暴露的接口
    window.myModule = {
        publicMethod: function() {
            privateFunction();
        }
    };
})();

异步模块定义AMD:

AMD是"Asynchronous Module Definition",意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
RequireJS是一个流行的实现AMD规范的库,以此为例子:

// 定义一个模块
define(['dependency'], function(dependency) {
    function doSomething() {
        // ...
    }

    return {
        doSomething: doSomething
    };
});

CommonJS:

CommonJS也是一种JS模块化规范,Node.js采用了这种方式。
Node.js 应用由模块组成,每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。
CommonJS 规范还规定,每个模块内部有两个变量可以使用,require 和 module。require 用来加载某个模块,module 代表当前模块,是一个对象,保存了当前模块的信息。exports 是 module 上的一个属性,保存了当前模块要导出的接口或者变量,使用 require 加载的某个模块获取到的值就是那个模块使用 exports 导出的值。

// 引入依赖
var dependency = require('dependency');

function doSomething() {
    // ...
}

// 导出模块接口
module.exports = {
    doSomething: doSomething
};

ES Modules:

ECMAScript 2015(ES6)引入了官方的JavaScript模块化标准,称为ES Modules (ESM)。
模块功能主要由两个命令构成:export 和 import。export 命令用于导出模块的对外接口,import 命令用于导入其他模块导出的内容。

// 导出
export function doSomething() {
    // ...
}

// 导入
import { doSomething } from './module.js';

特点:

  • 静态结构:ESM的设计是静态的,这意味着你不能根据条件动态地导入或导出模块。所有的导入和导出语句都必须位于模块的顶层,并且它们在代码的解析阶段就已经确定,这支持了编译时优化,如“摇树”优化(Tree Shaking),这种优化可以移除未使用的代码,从而减少最终打包文件的大小。
  • 实时绑定:ESM导出的是引用,而不是值的复制。这意味着,如果模块内导出的变量值发生了变化,导入该模块的其他模块也能实时获取到最新的值。
  • 异步加载:ESM支持原生的异步加载模块,使用import()语法可以实现动态导入,这对于按需加载代码、减少初始加载时间非常有用。

CommonJS 和 ES Modules 区别

最大的区别:动态和静态结构。
ES6 模块(ESM)是静态的,这意味着 import 和 export 语句必须出现在模块的顶层作用域,并且不能被包裹在任何结构如 if 语句或函数中。因为它们是静态的,所以模块的结构(依赖关系、导入和导出的变量)在代码的解析阶段就已经确定下来了。这使得工具像是打包器和静态分析工具可以在运行之前进行代码优化,诸如“摇树”(tree-shaking)来移除未使用的代码,更好地进行代码拆分等。
而 CommonJS 模块(如 Node.js 中使用)是动态的。require() 函数可以在模块的任何地方调用,甚至可以在运行时根据条件调用,这意味着你在运行时才能确定导出的接口。这种设计更加灵活,但它限制了静态分析的能力和优化潜力,同时也不支持异步加载,在浏览器端,这可能会导致性能问题,因为需要等待文件下载完成,才能继续执行后续代码。

设计的考虑:
ES6模块:目标是为JavaScript提供一种静态的模块系统,支持编译时优化和更好的静态分析。它的设计鼓励模块的前置声明,使得模块依赖更清晰,也便于各种工具进行分析和打包。
CommonJS:最初是为服务器环境设计的,考虑到服务器端模块的加载一般不会涉及到网络延迟,因此采用了同步加载的方式。它的设计允许更灵活的模块定义和导出方式,适合Node.js这样的环境。文章来源地址https://www.toymoban.com/news/detail-848970.html

到了这里,关于JS模块化——AMD、CommonJS和ESModules的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • JavaScript:模块化【CommonJS与ES6】

    在 JavaScript 编程中,随着项目的复杂性增加,代码的组织和管理变得至关重要。模块化是一种强大的编程概念,它允许我们将代码划分为独立的模块,提高了可维护性和可扩展性。本文将详细介绍 CommonJS 和 ES6 模块,帮助你理解它们的特点和用法。 1. CommonJS 模块化 CommonJS 是

    2024年02月13日
    浏览(47)
  • NodeJs(一):初识nodejs、模块化、CommonJS、ESModule等

    NodeJs(一):初识nodejs、模块化、CommonJS、ESModule等

    目录 (一)Nodejs简介 1.nodejs是什么 2.nodejs架构 3.nodejs的应用场景 (二)准备工作 1.安装nodejs 2.nodejs版本管理工具 (三)nodejs的使用 1.node的输入 2.node的输出 3.其他的console方法 (四)全局对象 1.常见的全局对象 2.特殊的全局对象 3.global和window的区别  (五)模块化*** 1.什么是模块化 2.Comm

    2024年02月04日
    浏览(10)
  • 23年,我又学习了一次amd模块化,模块化思想

    src/view1/index.html src/view1/main.js plugins/module.js 源码链接: https://gitee.com/littleboyck/front/tree/master/front-module 联系方式:QQ: 1187253007

    2024年02月07日
    浏览(15)
  • JS模块化系统

    随着 JavaScript 开发变得越来越广泛,命名空间和依赖关系变得越来越难以处理。人们已经开发出不同的解决方案以模块系统的形式来解决这个问题。 CommonJS 是一种同步加载模块的规范,主要用于服务器端的 Node.js 环境。 top:CommonJS 加载的是一个对象(即 module.exports 属性),

    2024年02月19日
    浏览(13)
  • js模块化开发

    js模块化开发

    ◼ 到底什么是模块化、模块化开发呢?  事实上模块化开发最终的目的是将程序划分成一个个小的结构;  这个结构中编写属于自己的逻辑代码,有自己的作用域,定义变量名词时不会影响到其他的结构;  这个结构可以将自己希望暴露的变量、函数、对象等导出给其结

    2024年02月13日
    浏览(17)
  • js 模块化

    模块化主要是用来抽离公共代码,隔离作用域,避免变量冲突等。 模块化的整个发展历史如下: IIFE :使用自执行函数来编写模块化,特点:在一个单独的函数作用域中执行代码,避免代码冲突。 AMD :使用 require 来编写模块化,特点:依赖必须提前声明好。 CMD :使用 seaJS

    2024年02月14日
    浏览(12)
  • Node.js模块化

    说明:将复杂的程序文件,拆分多个文件的过程。模块的内部数据是私有的,不过模块可以暴露内部数据供其他模块使用。 说明:编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目。 3.模块化的优势 说明: 提高代码的复用性:模块化可以将代码分解为可重

    2024年02月12日
    浏览(11)
  • Node.js--模块化

    1.1 什么是模块化与模块 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据都是私有的,不过模块可以暴露内部数据以便其他模块使用 1.2 什么是模块化项目 编码时是按照模块一个一个编码

    2024年02月16日
    浏览(27)
  • 10-Node.js模块化

    10-Node.js模块化

    目标 了解模块化概念和好处,以及 CommonJS 标准语法导出和导入 讲解 在 Node.js 中每个文件都被当做是一个独立的模块,模块内定义的变量和函数都是独立作用域的,因为 Node.js 在执行模块代码时,将使用如下所示的函数封装器对其进行封装 ​ 而且项目是由多个模块组成的,

    2024年02月07日
    浏览(9)
  • 【node.js】04-模块化

    【node.js】04-模块化

    目录 一、什么是模块化 二、node.js中的模块化 1. node.js中模块的分类 2. 加载模块 3. node.js 中的模块作用域 4. 向外共享模块作用域中的成员 4.1 module对象  4.2 module.exports 对象 4.3 exports对象 5. node.js 中的模块化规范          模块化是指解决一个复杂问题时,自顶向下逐层

    2024年02月15日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包