前端面试之模块化-2、AMD规范和CommonJS规范

web前端面试-- 模块化的几种规范CMD、COMMONJS、AMD、ESM以及UMD模块化解决方案,export *的写法 JavaScript 目前有四种模块规范:CMD、COMMONJS、AMD 和 ESM。CMD 是 JavaScript 最早的模块规范,它使用 require 函数来导入模块。CMD 模块是 JavaScript 最早的模块规范,但它存在一些缺陷,比如模块的导入顺序不受控制,模块的依赖关系无法被管理,等等。COMMONJS 是 JavaScript 模块的另一种,它使用 require 函数来导入模块。COMMONJS 模块在解决CMD。 阅读详情

原文链接:http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html

先想一想,为什么模块很重要?

因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。
但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了。

目前,通行的Javascript模块规范共有两种:CommonJS和AMD。我主要介绍AMD,但是要先从CommonJS讲起。

CommonJS

2009年,美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程。

这标志"Javascript模块化编程"正式诞生。因为老实说,在浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限;但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程。
node.js的模块系统,就是参照CommonJS规范实现的。在CommonJS中,有一个全局性方法require(),用于加载模块。假定有一个数学模块math.js,就可以像下面这样加载。

var math = require('math');

然后,就可以调用模块提供的方法:

var math = require('math');
math.add(2,3); // 5

因为这个系列主要针对浏览器编程,不涉及node.js,所以对CommonJS就不多做介绍了。我们在这里只要知道,require()用于加载模块就行了。

浏览器环境

有了服务器端模块以后,很自然地,大家就想要客户端模块。而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行。
但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器环境。还是上一节的代码,如果在浏览器中运行,会有一个很大的问题,你能看出来吗?


var math = require('math');
math.add(2, 3);
第二行math.add(2, 3),在第一行require('math')之后运行,因此必须等math.js加载完成。也就是说,如果加载时间很长,整个应用就会停在那里等。
这对服务器端不是一个问题,因为所有的模块都存放在本地硬盘,可以同步加载完成,等待时间就是硬盘的读取时间。但是,对于浏览器,这却是一个大问题,因为模块都放在服务器端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于"假死"状态。
因此,浏览器端的模块,不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous)。这就是AMD规范诞生的背景。

AMD

AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数:
require([module], callback);
第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式,就是下面这样:
require(['math'], function (math) {
    math.add(2, 3);
});

math.add()与math模块加载不是同步的,浏览器不会发生假死。所以很显然,AMD比较适合浏览器环境。
目前,主要有两个Javascript库实现了AMD规范:require.js和curl.js。本系列的第三部分,将通过介绍require.js,进一步讲解AMD的用法,以及如何将模块化编程投入实战。


【高频考点精讲】模块化开发的四种方案,你了解 CommonJS、AMD、CMD 和 ES6 模块吗? 模块化发展史就像前端工程化的缩影:从混乱到规范,从各自为政到标准统一。作为现代前端开发者,ES6 Modules是必须掌握的,但对历史方案的理解能帮助你在维护老项目时游刃有余。我是全栈老李,下期我们聊聊"Tree Shaking原理与实战",别忘了关注我,一起进阶全栈开发! 阅读详情

相关推荐

JS模块化的理解与开发

模块化是一种解决问题的方法,它将复杂系统划分为多个独立、可组合、可分解和可更换的模块。在编程领域,模块化意味着遵守一定规则,将大文件拆分成多个相互依赖的小模块。每个模块封装不同的功能并提供使用接口,它们之间互不影响,按需加载。模块化的主要好处包括:高内聚低耦合:有利于团队协作开发。当项目复杂时,可以划分为子模块分给不同人开发,最后组合在一起。这降低了模块间的依赖关系,体现了低耦合;同时,每个模块有特定功能,体现了高内聚。

hhhhhhkdg的博客 1234

Javascript模块化编程(二):AMD规范

这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块。 (接上文) 七、模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这...

weixin_30372371的博客 316

Javascript模块化编程(一)AMD规范(规范使用模块)

个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块,先想一想,为什么模块很重要?接下来为您详细介绍,感兴趣的朋友可以了解下啊

Javascript模块化编程(一):模块的写法

随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂。 网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑。 Javascript模块化编程,已经成为一个迫切的需求。理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块。 但是,Javascript...

weixin_30851867的博客 509

【学习笔记】人群归因分数 PAF 以及combined PAF

人群归因风险比例(Population Attributable Fraction,PAF)是一个流行病学指标,它估计了在总体中,如果能消除一个特定的危险因素,能预防多少百分比的疾病或健康结果。简单来说,PAF回答的是:“如果没有这个风险因素,总体中会有多少病例是可以避免的?

weixin_53499537的博客 4905

Unity 升级引擎版本后构建报错:script class layout is incompatible between the editor and the player

Unity升级引擎版本后,项目报错:script class layout is incompatible between the editor and the player。

学习与分享 595

js的简单模块化(AMD)标准

通过requireJS语句将各个模块的地址载入调用 <script src = 'Ja-vascript\require.js' async='true' defer data-main="Ja-vascript/xxxx"></script> 这个上面的地址是存放requ...

a86669的博客 301

14 ABSOLUTE评估肿瘤纯度

14 ABSOLUTE评估肿瘤纯度 Absolute介绍 ABSOLUTE可以直接从体细胞突变和拷贝数变异的结果中推断肿瘤纯度和倍性的计算方法。 通常来说,我们取肿瘤组织进行测序,往往是一个混合样品,既包括肿瘤细胞也包括正常细胞,因此需要进行肿瘤纯度 purity 的评估。当从混合样品中提取 DNA 进行测序后,得到的也是一个混合样品的结果。肿瘤不一定是单纯的二倍体了,其本身异质性高,存在部分突变部分不突变的情况,直接分析拷贝数变异,得到的结果并不准确,评估肿瘤倍性 ploidy 也更加必要。而 ABSO

qq_23435961的博客 4215

面试题JavaScript篇(二)

JavaScript面试题,自用

weixin_43526403的博客 1125

某瓜数据app 获取达人直播商品信息接口 Sign

某瓜数据app 获取达人直播商品列表接口 Sign

自成背后的博客 6040

thinkphp6/8 - 实现评论区发表评论、回复评论功能数据库表设计与整个逻辑思路过程分析,tp5 评论盖楼等功能(附带源码稍加改造即可使用)

tp5评论区数据库表设计,tp5发表回复评论功能设计,thinkphp5如何做评论功能,tp5 php评论区实现发表回复删除评论,tp5评论区盖楼源码及数据表设计思路,thinkphp评论功能详细教程,thinkphp实现评论与回复功能,thinkphp实现文章评论和回复评论功能,tp5实现评论回复功能,thinkphp如何实现评论区,tp5网站PC移动端h5怎么做评论区发表留言及回复功能,thinkphp实现评论区插件,thinkphp评论区相互发表回复功能详细教程,thinkphp有没有评论区的组件插件

✅ 精选推荐文章 3160

前端面试题

前端面试大全(3)

jia嘉ioo的博客 1029

dify进阶:使用 FastAPI 的 StreamingResponse 实现高效的数据流传输

在 FastAPI 框架中,是一个非常有用的工具,它允许你以流的方式发送数据给客户端,而不是一次性加载所有内容到内存中再发送。这对于处理大型文件下载、视频流或者任何需要长时间处理的任务特别有用。

xiezhipu的博客 1434

弄懂前端模块化,CommonJS,AMD,CMD及ES6模块化

前言 之前一直对于前端的模块化理解的不太透彻,平常一直用的也只有ES6模块化,对于其他几种模块化规范用的也少,理解不够深,但是经常会见到一些面试题是问这几种模块化规范的区别,所以这次做一个整理总结 一、对于模块化的理解 什么是模块化? 模块化开发是一种管理方式,是一种生产方式,一种解决问题的方案,一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块,但是模块开发需要遵循一定的规范,否则就都乱套了,因此,才有了后来大家熟悉的AMD规范,CMD规范,以及ES

index_zhao的博客 787

从数字后端角度谈谈occ电路(一)

摘要:本文介绍了芯片测试中OCC(On-Chip Clock Control)电路的设计与应用。随着工艺进步,芯片制造面临Stuck-at、Bridging和Delay等故障类型,需要不同时钟频率进行测试。OCC电路通过Clock Selection、Clock Chopping Control和Clock Gating三个模块,实现ATE时钟与PLL时钟的切换控制,支持慢速时钟检测Stuck-at故障和快速时钟检测Delay故障。文章详细解析了OCC电路结构及各模块功能,包括同步单元、移位寄存器等关键组件

芯冰乐 586

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

fe-interview前端模块化:CommonJS/ES Module/AMD对比

在早期Web开发中,JavaScript代码通常以全局变量的形式存在,随着项目规模扩大,这种开发方式带来了诸多问题: - **命名冲突**:全局变量污染,不同脚本间的变量相互覆盖 - **依赖管理困难**:手动维护脚本加载顺序,依赖关系不明确 - **代码复用性差**:难以在不同项目间共享代码 - **维护成本高**:代码组织混乱,难以进行单元测试 模块化编程通过将代码分割为独立的模块(Mod...

gitblog_00741的博客 1180

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JavaScript进阶(十二):JS 模块化编程规范-CommonJS、AMD、CMD(1)

对于框架原理只能说个大概,真的深入某一部分具体的代码和实现方式就只能写出一个框架,许多细节注意不到。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】算法方面还是很薄弱,好在面试官都很和蔼可亲,擅长发现人的美哈哈哈…(最好多刷一刷,不然影响你的工资和成功率???在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。

2401_84419009的博客 1090

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

(新手总结)前端模块化,AMD,CMD 面试总结

最近在群里看到一些小伙伴讨论到面试题,楼主在面试时遇到的面试问题,恶补一下。 commonJS,CMD/AMD对应类似的实现是 noedJs(webpack)/RequireJs/SeaJs  AMD/CMD主要针对浏览器端。 模块化 一个模块化实现特定功能,组织JS中的业务逻辑,都可以称为模块化。这种模块化类似于 java中的包 直接引入,即插即用,不会产生变量冲突,就是如此便捷。 c...

Miss_GL的博客 7233

2024年最全JavaScript进阶(十二):JS 模块化编程规范-CommonJS、AMD、CMD,2024年阿里前端岗面试必问

define([‘./a’, ‘./b’], function(a, b) { // 依赖必须一开始就写好。var b = require(‘./b’) // 依赖可以就近书写。(jsx可以进行更多的js逻辑和操作)5)vue:组件之间的通信(props,callback,emit)(jsx可以进行更多的js逻辑和操作)5)vue:组件之间的通信(props,callback,emit)4)如何区分数组对象,普通对象,函数对象。11)js延迟加载的方式有哪些?7)XML和JSON的区别?

2401_84619565的博客 1119

nodejs--nodejs模块化规范:CommonJS

概念:将一个复杂的程序依据一定的规则(规范)封装成几个块(文件),并组合在一起。模块的内部数据、实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信。最早的时候,我们会把所有的代码都写在一个js文件里,那么,耦合性会很高(关联性强),不利于维护;而且会造成全局污染,很容易命名冲突。CommonJS:是 Node.js 使用的模块化规范。也就是说,Node.js 就是基于 CommonJS 这种模块化规范来编写的。CommonJS 规范规定:每个模块内部,module 变量代表当前模块。

热情、奔放、快乐编程! 1149

前端模块化简单梳理(AMD,CMD,CommonJS,ES6)

最近面试总是被问到前端模块化,即AMD,CMD,CommonJs,还有ES6 Module这些东西之间的差异,对此我也是一知半解,所以我花了一天时间查阅了不少资料,对各种模块化的方式也有了个大概的了解,在这梳理记录一下免得以后又忘记~~

laishaojiang的博客 1127

当你被问到前端模块化

最近一个前同事和我聊天,聊到他去面试的时候,被面试官问到前端模块化的问题,他的回答换来的是面试官的一句“你说了,但是好像又没说”,他备受打击,怀疑人生的问我前端模块化到底是啥?说他好像知道,又好像说不出所以然来,所以就有了这一份关于模块化的内容,来一起捋一捋问问题一般是从总体追问到细节如果面试问到关于模块化的问题,要有清晰的条理去回答,先回答总体的概念,如果有追问,再根据细节回答即可提示:面试你的人其实不一定需要你一口气说完多深的理解,你可以用简单易懂的大白话,条理清晰即可,先抛一下。

Web面试那些事儿的博客 930

04 【nodejs模块化规范:CommonJS】

04 【nodejs模块化规范:CommonJS】

DSelegent的博客 1300

npm使用及commonjs规范(六),前端开发热门前沿知识

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》)**《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》[外链图片转存中…(img-SrleXVuO-1711713279919)]

m0_60229361的博客 764

【Nodejs】nodejs模块化规范:CommonJS

nodejs模块化规范:CommonJS

DomCode 596
上一篇: 圣杯布局
下一篇: 前端面试之模块化-3、require.js的用法
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值