JavaScript 模块化详解( CommonJS、AMD、CMD、ES6模块化)

一.CommonJS

1.概念

        CommonJS 规范概述了同步声明依赖的模块定义。这个规范主要用于在服务器端实现模块化代码组 织,但也可用于定义在浏览器中使用的模块依赖。CommonJS 模块语法不能在浏览器中直接运行;在浏览器端,模块需要提前编译打包处理。

2.特点

  • 所有代码都运行在模块作用域,不会污染全局作用域;

  • 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存;

  • 模块加载的顺序,按照其在代码中出现的顺序;

3.基本语法

  • 暴露模块:module.exports = valueexports.xxx = value

  • 引入模块:require(xxx),如果是第三方模块,xxx为模块名;如果是自定义模块,xxx为模块文件路径

// example.js
var x = 5;
var addX = function (value) {return value + x;
};
module.exports.x = x;
module.exports.addX = addX;引入:var example = require('./example.js');//如果参数字符串以“./”开头,则表示加载的是一个位于相对路径
console.log(example.x); // 5
console.log(example.addX(1)); // 6

4.模块的加载机制

        CommonJS模块的加载机制是,输入的是被输出的值的拷贝。也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。这点与ES6模块化有重大差异。

// example.js
var x = 5;
var addX = function (value) {return value + x;
};
module.exports.x = x;
module.exports.addX = addX;引入:var example = require('./example.js');//如果参数字符串以“./”开头,则表示加载的是一个位于相对路径
console.log(example.x); // 5
console.log(example.addX(1)); // 6

二. AMD

1.概念

        AMD异步模块定义,AMD 模块实现的核心是用函数包装模块定义。这样可以防止声明全局变量,并允许加载器库控制 何时加载模块。包装模块的函数是全局 define 的参数,它是由 AMD 加载器库的实现定义的。

// dataService.js文件
// 定义没有依赖的模块
define(function() {let msg = 'www.chenghuai.com'function getMsg() {return msg.toUpperCase()}return { getMsg } // 暴露模块
})//alerter.js文件
// 定义有依赖的模块
define(['dataService'], function(dataService) {let name = 'chenghuai'function showMsg() {alert(dataService.getMsg() + ', ' + name)}// 暴露模块return { showMsg }
})// main.js文件
(function() {require.config({baseUrl: 'js/', //基本路径 出发点在根目录下paths: {//映射: 模块标识名: 路径alerter: './modules/alerter', //此处不能写成alerter.js,会报错dataService: './modules/dataService'}})require(['alerter'], function(alerter) {alerter.showMsg()})
})()// index.html文件
<!DOCTYPE html>
<html><head><title>Modular Demo</title></head><body><!-- 引入require.js并指定js主文件的入口 --><script data-main="js/main" src="js/libs/require.js"></script></body>
</html>
AMD 也支持 require exports 对象,通过它们可以在 AMD 模块工厂函数内部定义 CommonJS
风格的模块。这样可以像请求模块一样请求它们,但 AMD 加载器会将它们识别为原生 AMD 结构,而不是模块定义:

三. UMD

1.概念

        为了统一 CommonJS AMD 生态系统,通用模块定义( UMD Universal Module Definition )规范 应运而生。UMD 可用于创建这两个系统都可以使用的模块代码。本质上, UMD 定义的模块会在启动时 检测要使用哪个模块系统,然后进行适当配置,并把所有逻辑包装在一个立即调用的函数表达式(IIFE ) 中。虽然这种组合并不完美,但在很多场景下足以实现两个生态的共存。
(function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD。注册为匿名模块define(['moduleB'], factory); } else if (typeof module === 'object' && module.exports) { // Node。不支持严格 CommonJS // 但可以在 Node 这样支持 module.exports 的// 类 CommonJS 环境下使用module.exports = factory(require(' moduleB ')); } else { // 浏览器全局上下文(root 是 window)root.returnExports = factory(root. moduleB); } 
}(this, function (moduleB) { // 以某种方式使用 moduleB // 将返回值作为模块的导出// 这个例子返回了一个对象// 但是模块也可以返回函数作为导出值return {}; 
}));

四. ES6 模块

1. 模块标签及定义

        ECMAScript 6 模块是作为一整块 JavaScript 代码而存在的。带有 type="module" 属性的 <script> 标签会告诉浏览器相关代码应该作为模块执行,而不是作为传统的脚本执行。模块可以嵌入在网页中, 也可以作为外部文件引入:
        与传统脚本不同,所有模块都会像<script defer> 加载的脚本一样按顺序执行。解析到 <script
type="module"> 标签后会立即下载模块文件,但执行会延迟到文档解析完成。无论对嵌入的模块代码, 还是引入的外部模块文件,都是这样。<script type="module"> 在页面中出现的顺序就是它们执行 的顺序。与<script defer> 一样,修改模块标签的位置,无论是在 <head> 还是在 <body> 中,只会影 响文件什么时候加载,而不会影响模块什么时候加载。
下面演示了嵌入模块代码的执行顺序:
不管它是如何加载的,实际上都只会加载一次,如下面的代码所示:
ECMAScript 6 模块借用了 CommonJS AMD 的很多优秀特性。下面简单列举一些。
优点:
模块代码只在加载后执行。
模块只能加载一次。
模块是单例。
模块可以定义公共接口,其他模块可以基于这个公共接口观察和交互。
模块可以请求加载其他模块。
支持循环依赖。
ES6 模块系统也增加了一些新行为。
ES6 模块默认在严格模式下执行。
ES6 模块不共享全局命名空间。
模块顶级 this 的值是 undefined (常规脚本中是 window )。
模块中的 var 声明不会添加到 window 对象。
ES6 模块是异步加载和执行的。

2.模块导出

        ES6 模块的公共导出系统与 CommonJS 非常相似。控制模块的哪些部分对外部可见的是 export 关 键字。ES6 模块支持两种导出:命名导出和默认导出。不同的导出方式对应不同的导入方式。
        导出时也可以提供别名,别名必须在 export 子句的大括号语法中指定。因此,声明值、导出值和 为导出值提供别名不能在一行完成。在下面的例子中,导入这个模块的外部模块可以使用 myFoo 访问 导出的值:
        默认导出 default export )就好像模块与被导出的值是一回事。默认导出使用 default 关键字将一 个值声明为默认导出,每个模块只能有一个默认导出。

3.模块导入

        模块可以通过使用 import 关键字使用其他模块导出的值。与 export 类似, import 必须出现在
模块的顶级:
        导入对模块而言是只读的,实际上相当于 const 声明的变量。在使用 * 执行批量导入时,赋值给别 名的命名导出就好像使用 Object.freeze() 冻结过一样。直接修改导出的值是不可能的,但可以修改 导出对象的属性。同样,也不能给导出的集合添加或删除导出的属性。要修改导出的值,必须使用有内 部变量和属性访问权限的导出方法。
        命名导出和默认导出的区别也反映在它们的导入上。命名导出可以使用* 批量获取并赋值给保存导 出集合的别名,而无须列出每个标识符:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP BBR 的优化

前段时间&#xff0c;老板发了篇资料&#xff0c;下面是我学习的相关记录整理。 https://aws.amazon.com/cn/blogs/china/talking-about-network-optimization-from-the-flow-control-algorithm/ PS&#xff1a;ubuntu24默认使用的tcp控制算法。还是 cubic sysctl net.ipv4.tc…

什么是异步?

什么是异步&#xff1f; 异步是一个术语&#xff0c;用于描述不需要同时行动或协调就能独立运行的流程。这一概念在技术和计算领域尤为重要&#xff0c;它允许系统的不同部分按自己的节奏运行&#xff0c;而无需等待同步信号或事件。在区块链技术中&#xff0c;异步是指网络中…

SSM婚纱摄影网的设计

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 SS…

石头剪刀布游戏

自己写的一个石头剪刀布游戏&#xff0c;如果有需要更改的地方请指出 #define _CRT_SECURE_NO_WARNINGS // scanf_s编写起来太过于麻烦&#xff0c;直接把这个警告关掉&#xff0c;便于编写。 #include <stdio.h> #include <stdlib.h> #include <time.h> //…

大数据系列之:Kerberos

大数据系列之&#xff1a;Kerberos 基本概念工作流程安全特性应用场景总结加密原理Kerberos认证流程更改您的密码授予账户访问权限票证管理Kerberos 票据属性使用 kinit 获取票据使用 klist 查看票据使用 kdestroy 销毁票据.k5identity 文件描述 Kerberos 是一种网络认证协议&a…

WPF 免费UI 控件HandyControl

示例效果和代码 直接可以用 Button 按钮 | HandyOrg 1.安装 , 输入 HandyControl 2.<!--配置HandyControl--> <!--配置HandyControl--> <ResourceDictionary Source"pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/> …

windows部署docker

1.下载docker 打开浏览器&#xff0c;访问 Docker Desktop 下载页面。 2.安装 Docker Desktop 运行安装程序&#xff1a; 双击下载的 Docker Desktop 安装包&#xff0c;启动安装程序。 选择安装选项&#xff1a; 按照屏幕上的指示进行操作。建议选择默认选项&#xff0c;包…

【Linux】远程登录时,使用图形界面报错:MoTTY X11 proxy: Unsupported authorisation protocol

1、问题描述 使用 MobaXterm 远程登录Ubuntu后,使用sudo权限运行图形界面程序报错: MoTTY X11 proxy: Unsupported authorisation protocol (gpartedbin:10518): Gtk-WARNING **: 22:01:34.377: cannot open display: localhost:10.02、查看SSH配置 修改 SSH 服务端配置,…

解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案

问题背景 在使用 Hugging Face 的 SentenceTransformer 加载预训练模型 all-MiniLM-L6-v2 时&#xff0c;遇到了以下错误&#xff1a; 代理连接失败&#xff08;ProxyError / SSLError: KRB5_S_TKT_NYV&#xff09;大文件下载中断&#xff08;unexpected EOF while reading&a…

MySQL——DQL的单表查询

1、查询表中所有的字段&#xff08;列&#xff09; 语法&#xff1a;select * from 表名; * 是通配符&#xff0c;用来表示所有的字段&#xff08;列&#xff09;。 select 表示查询哪些列。 from 表示从哪张表中查询。 2、查询表中指定的字段 语法&#xff1a;select 列…

开源RuoYi AI助手平台的未来趋势

近年来&#xff0c;人工智能技术的迅猛发展已经深刻地改变了我们的生活和工作方式。 无论是海外的GPT、Claude等国际知名AI助手&#xff0c;还是国内的DeepSeek、Kimi、Qwen等本土化解决方案&#xff0c;都为用户提供了前所未有的便利。然而&#xff0c;对于那些希望构建属于自…

[WUSTCTF2020]CV Maker1

进来是个华丽的界面&#xff0c;我们先跟随这个网页创造一个用户 发现了一个上传端口&#xff0c;尝试上传一个php文件并抓包 直接上传进不去&#xff0c;加个GIF89A uploads/d41d8cd98f00b204e9800998ecf8427e.php 传入 并且报告了 上传路径&#xff0c;然后使用蚁剑连接

Spring 中的 IOC

&#x1f331; 一、什么是 IOC&#xff1f; &#x1f4d6; 定义&#xff08;通俗理解&#xff09;&#xff1a; IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09; 是一种设计思想&#xff1a;对象不再由你自己创建和管理&#xff0c;而是交给 Spring 容器…

Vue2-实现elementUI的select全选功能

文章目录 使用 Element UI 的全选功能自定义选项来模拟全选 在使用 Element UI 的 el-select组件时&#xff0c;实现“全选”功能&#xff0c;通常有两种方式&#xff1a;一种是使用内置的全选功能&#xff0c;另一种是通过自定义选项来模拟全选。 使用 Element UI 的全选功能…

小菜Go:Ubuntu下Go语言开发环境搭建

前置要求Ubuntu环境搭建 文章推荐 此处推荐一个比较好的文章&#xff0c;基本按部就班就欧克~ 安装虚拟机&#xff08;VMware&#xff09;保姆级教程&#xff08;附安装包&#xff09;_vmware虚拟机-CSDN博客 安装可能遇到的问题 虚拟机安装遇到的问题如&#xff1a;Exception…

安卓中app_process运行报错Aborted,怎么查看具体的报错日志

我在pc端生成了一个jar包&#xff0c;可以正常执行&#xff0c;但是导入到安卓的/data/local/tmp下面执行就会报错 执行命令如下&#xff1a; adb shell cd /data/local/tmp app_process -Djava.class.path/data/local/tmp/demo.jar /data/local/tmp com.example.demo.Hello然…

Python 面向对象 - 依赖倒置原则 (DIP)

1. 核心概念 依赖倒置原则(Dependency Inversion Principle, DIP) 是SOLID原则中的"D"&#xff0c;包含两个关键点&#xff1a; 高层模块不应依赖低层模块&#xff0c;二者都应依赖抽象抽象不应依赖细节&#xff0c;细节应依赖抽象 2. 使用场景 典型应用场景 系…

centos7 yum install docker 安装错误

1、错误信息&#xff1a; [rootlocalhost atguigu]# yum install docker 已加载插件&#xff1a;fastestmirror, langpacks Repository base is listed more than once in the configuration Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http:…

【Gorm】模型定义

intro package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite" // GORM 使用该驱动来连接和操作 SQLite 数据库。 )type Product struct {gorm.Model // 嵌入GORM 内置的模型结构&#xff0c;包含 ID、CreatedAt、UpdatedAt、DeletedAt 四个字段Cod…

R语言从专家到小白

文章目录 下载安装R下载安装R StudioCRAN 下载安装R Index of /bin https://cran.r-project.org/ 下载安装R Studio https://posit.co/download/rstudio-desktop/ CRAN R综合档案网络。 CRAN 镜像是一个提供 R 语言软件和包的在线服务&#xff0c;用户可以从不同的地区选择…