前端模块化CommonJS、AMD、CMD、ES6

在前端开发中,模块化是一种重要的代码组织方式,它有助于将复杂的代码拆分成可管理的小块,提高代码的可维护性和可重用性。CommonJS、AMD(异步模块定义)和CMD(通用模块定义)是三种不同的模块规范,它们在定义模块、加载模块以及依赖管理等方面存在差异,并适用于不同的场景。

CommonJS、AMD、CMD 

一、CommonJS

1. 定义与特点

  • CommonJS是服务器端JavaScript模块化的规范,Node.js是这种规范的实现
  • 一个单独的文件就是一个模块,模块通过module.exports导出接口,通过require()导入其他模块。
  • 加载模块是同步的,即只有加载完成才能执行后面的操作

2. 适用场景

  • 主要用于服务器端JavaScript的模块化开发,如Node.js环境。
  • 适用于模块之间依赖关系明确,且对加载速度要求不高的场景。

二、AMD

1. 定义与特点

  • AMD是RequireJS在推广过程中对模块定义的规范化产出,主要用于浏览器端
  • 使用define()函数定义模块,可以异步加载模块,不会阻塞后续代码的执行。
  • 允许指定回调函数,当所有依赖的模块都加载完成后,会执行这个回调函数

2. 适用场景

  • 适用于浏览器端的大型Web应用,特别是那些需要按需加载模块以减少初始加载时间的场景。
  • 当模块之间的依赖关系复杂,且需要优化加载性能时,AMD是一个不错的选择。

三、CMD

1. 定义与特点

  • CMD是SeaJS在推广过程中对模块定义的规范化产出,也主要用于浏览器端。
  • 与AMD类似,CMD也使用define()函数定义模块,但CMD推崇依赖就近和延迟执行(懒加载)。
  • 只有在真正需要某个模块时,才会去加载和执行它

2. 适用场景

  • 适用于对加载性能有较高要求的浏览器端应用。
  • 当模块数量较多,且大多数模块只在特定条件下才会被使用时,CMD的懒加载特性可以显著减少不必要的加载时间。
CommonJSAMDCMD
定义服务器端JavaScript模块规范浏览器端Javascript模块规范浏览器端JavaScript模块规范
实现Node.jsRequireJSSeaJS
加载方式同步加载异步加载延迟加载(懒加载)
适用场景服务端开发浏览器端大型Web应用,需要优化加载性能浏览器端应用,模块数量多且大多只在特定条件下使用
特点模块定义简单直接依赖前置,异步加载依赖就近,延迟执行

综上所述,CommonJS、AMD和CMD各有其特点和适用场景。在选择模块规范时,需要根据项目的具体需求和目标来决定。例如,对于服务器端JavaScript开发,通常会选择CommonJS;而对于浏览器端的大型Web应用,则可能会考虑使用AMD或CMD来优化加载性能和减少初始加载时间。

ES6(ECMAScript 6)中的模块化语法主要通过importexport两个关键字来实现,这一机制极大地增强了JavaScript代码的组织性、可维护性和可重用性。以下是对ES6模块化语法的详细解析及其优势:

ES6模块化语法

export

export关键字用于规定模块的对外接口,即定义哪些变量、函数、类等可以被其他模块通过import语句导入。其基本用法包括:

直接导出:在模块文件内部,使用export关键字直接导出变量、函数、类等。例如:

export const PI = 3.14;  
export function add(x, y) {  return x + y;  
}

统一导出:使用花括号{}将多个导出项组织在一起。例如: 

const PI = 3.14;  
function add(x, y) {  return x + y;  
}  
export { PI, add };

 默认导出:每个模块只能有一个默认导出,使用export default关键字。默认导出的内容在导入时可以使用任意名称。例如:

function createCircle(radius) {  // ...  
}  
export default createCircle;
import

import关键字用于从其他模块导入功能,即获取其他模块通过export导出的变量、函数、类等。其基本用法包括:

命名导入使用花括号{}明确指定要导入的导出项及其名称。例如

import { PI, add } from './math.js';

 默认导入:使用任意名称导入模块的默认导出项。例如:

import Circle from './circle.js'

整体导入:使用* as语法导入模块的所有导出项,并为它们指定一个命名空间。例如:

import * as math from './math.js';  
console.log(math.PI);  
console.log(math.add(1, 2));

ES6模块化的优势

  1. 显式依赖:ES6模块通过importexport显式地声明了模块之间的依赖关系,这有助于工具进行静态分析,优化加载策略。

  2. 编译时加载:与CommonJS等运行时加载的模块系统不同,ES6模块支持编译时加载这意味着在代码执行之前,模块之间的依赖关系已经确定,有助于提升代码的执行效率

  3. 更好的封装:ES6模块将每个文件视为一个独立的模块,模块内部的所有变量和函数默认都是私有的,只有通过export显式导出的内容才能被其他模块访问,这有助于实现更好的封装和代码隐藏。

  4. 更简洁的语法importexport的语法简洁明了,易于理解和使用,相比CommonJS的requiremodule.exports更加直观。

  5. 支持静态分析:由于ES6模块是静态的,工具可以在不执行代码的情况下分析模块的依赖关系,这有助于实现诸如代码分割、懒加载等优化策略

  6. 支持Tree Shaking:在打包工具(如Webpack、Rollup等)的支持下,ES6模块可以实现Tree Shaking,即自动移除未被引用的代码,从而减小最终打包文件的大小

综上所述,ES6模块化语法通过importexport提供了强大的模块定义和导入功能,不仅提升了代码的组织性和可维护性,还带来了编译时加载、更好的封装、更简洁的语法以及支持静态分析和Tree Shaking等优势。

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

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

相关文章

leetcode-101. 对称二叉树

题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 思路 1) 如果同时root1…

【调试笔记-20240723-Linux-gitee 仓库同步 github 仓库,并保持所有访问链接调整为指向 gitee 仓库的 URL】

调试笔记-系列文章目录 调试笔记-20240723-Linux-gitee 仓库同步 github 仓库,并保持所有访问链接调整为指向 gitee 仓库的 URL 文章目录 调试笔记-系列文章目录调试笔记-20240723-Linux-gitee 仓库同步 github 仓库,并保持所有访问链接调整为指向 gite…

Ubuntu20.04版本升级openssh9.8p1方法

一、问题描述: 8.5p1 和 9.7p1 之间的openssh版本漏洞可能会导致linux系统以root身份进行RCE,所以需安装最新版本 二、解决方法: 将当前openssh版本升级到最新的版本即openssh-9.8p1版本,OpenSSL大版本升级且OpenSSH有新稳定版本…

Zabbix监控应用

一.监控tomcat 1.在tomcat服务器上安装zabbix-agent服务 [rootnode2 etc]#vim zabbix_agentd.conf 94 Server192.168.240.13 #指向当前zabbix server ##### Passive checks related #被动检查相关配置### Option: ListenPort ListenPort10050 #监听端口 默认的无需修改11…

SPF配置教程:如何安全构建邮件发送策略?

SPF配置教程的步骤详解!SPF记录配置方法策略有哪些? SPF通过允许域名所有者指定哪些主机可以代表该域发送邮件,从而减少电子邮件欺诈和垃圾邮件的风险。AokSend将详细介绍SPF配置教程,并指导您如何安全地构建邮件发送策略。 SPF…

《白话机器学习的数学》第4章——评估

4.1模型评估 1.由于像多重回归这样的问题会导致无法在图上展示,所以需要能够够定量地表示机器学习模型的精度。 4.2交叉验证 4.2.1回归问题的验证 1.把获取的全部训练数据分成两份:一份用于测试,一份用于训练。然后用前者来评估模型。 一般…

C# 数组常用遍历方式

// 假设数组Point[] points new Point[2];// 第一种遍历 forfor (int i 0; i < points.Length; i){Point p points[i];Console.WriteLine($"X{p.X},y{p.Y}");}// 第二种遍历 foreachforeach (Point p in points){Console.WriteLine($"X{p.X},y{p.Y}"…

TCP三次握手和四次挥手的理解

三次握手 第一次握手&#xff1a; 客户端发出 请求报文其中SYN应1&#xff0c;选择一个序列号x 第二次握手&#xff1a; 服务端接收到之后回复 确认报文&#xff0c;其中SYN应1&#xff0c;ACK1&#xff0c;确认号是x1&#xff0c;同时为自己初始化序列号y 第三次握手&…

Hadoop架构

一、案列分析 1.1案例概述 现在已经进入了大数据(Big Data)时代&#xff0c;数以万计用户的互联网服务时时刻刻都在产生大量的交互&#xff0c;要处理的数据量实在是太大了&#xff0c;以传统的数据库技术等其他手段根本无法应对数据处理的实时性、有效性的需求。HDFS顺应时代…

Linux(CentOS)的“应用商城” —— yum

Linux&#xff08;CentOS&#xff09;的“应用商城” —— yum 关于 yum 和软件包Linux 系统&#xff08;CentOS&#xff09;的生态yum 相关操作yum 本地配置yum 安装 lrzsz.x86_64 关于 yum 和软件包 首先 yum 是软件下载安装管理的客户端&#xff0c;类似各种手机里的“应用…

WEB前端10- Fetch API(同步/异步/跨域处理)

Fetch API Fetch API 可以用来获取远程数据&#xff0c;用于在 Web 应用程序中发起和处理 HTTP 请求。它基于 Promise&#xff0c;提供了一种简单而强大的方式来处理网络通信&#xff0c;替代了传统的 XMLHttpRequest。 Promise对象 Promise 对象是 JavaScript 中处理异步操…

0723,UDP通信(聪明小辉聪明小辉),HTTP协议

我就是一个爱屋及乌的人&#xff01;&#xff01;&#xff01;&#xff01; #include "network_disk_kai.h" 昨天的epoll&#xff1a; 可恶抄错代码了 epoll_s.csockect return listenfdsetsockoptsockaddr_in bind listenfd & serveraddr…

Ubuntu 中默认的 root 用户密码

场景&#xff1a;想要切换root用户&#xff0c;发现得输入密码&#xff0c;以为是以前设置过然后一直尝试都是错误【认证失败】最后发现根本没设置过root用户&#xff0c;默认会随机生成root用户的密码&#x1f605; Ubuntu 中默认的 root 密码是随机的&#xff0c;即每次开机都…

用51单片机或者stm32能否开发机器人呢?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;能的。但是由于单片机和st…

MATLAB练习题——矩阵(2)

逻辑运算 a [5 0.2 0 -8 -0.7 ]&#xff0c;在进行逻辑运算时&#xff0c;a 相当于什么样的逻辑量。 相当于 a[1 1 0 1 1] 角度运算 在 sin(x)运算中&#xff0c;x 是角度还是弧度&#xff1f; 在 sin(x)运算中&#xff0c;x 是弧度&#xff0c;MATLAB 规定所有…

盘点2024年大家都在使用的AI智能写作工具

在科技发达的现在社会&#xff0c;AI已经悄悄的渗入我们生活的各种角落。不知道你有没有尝试过用ai智能写作来完成一些文章创作呢&#xff1f;这次我介绍几个可以提升效率的ai智能写作工具给你试试吧。 1.笔&#xff5c;灵AI写作 CSDN 传送门&#xff1a;https://ibiling.cn…

OpenAI发布GPT-4 Mini的深度分析及中国大模型的弯道超车机会

引言 在OpenAI封禁中国IP访问其API后&#xff0c;紧接着推出了GPT-4 Mini&#xff0c;这是一个引发广泛关注和讨论的新举措。此举不仅让人们质疑OpenAI的战略方向&#xff0c;更引发了对中国大模型是否能弯道超车的讨论。本文将详细分析GPT-4 Mini的特点、市场影响及中国大模型…

谷粒商城实战笔记-50-51-商品分类的删除

文章目录 一&#xff0c;50-商品服务-API-三级分类-删除-逻辑删除1&#xff0c;逻辑删除的配置1.1 配置全局的逻辑删除规则&#xff08;可省略&#xff09;1.2 配置逻辑删除Bean&#xff08;可省略&#xff09;1.3 Bean相应字段上加上注解TableLogic 2&#xff0c;后台接口开发…

分享:大数据信用报告查询平台哪个好?

大数据信用也就是我们常说的大数据&#xff0c;相信很多朋友对这个词都不陌生&#xff0c;特别是在银行申贷的时候&#xff0c;听过比较多&#xff0c;因为在银行做信用贷款的时候都会审查申贷人的大数据信用&#xff0c;贷前提前了解自己的大数据很有必要&#xff0c;那大数据…

基于Java+SpringMvc+Vue技术的慈善捐赠平台设计与实现(源码+LW+部署讲解)

项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows 8 开发语言&#xff1a;java 前端技术&#xff1a;JavaScript、VUE.j…