AMD与CMD与Common.js

简介: 先从commomJS说起,因为在网页端没有模块化编程知识网页jsvascript逻辑复杂度也可以工作下去,但是在服务器端一定要有模块化,所虽然javascript在web端发展这么多年,第一个流行的模块化规范却由服务端的javascript应用带来,commonjs规范是由NodeJs发扬光大,这标志着javascript模块化编程正式登上舞台。

先从commomJS说起,因为在网页端没有模块化编程知识网页jsvascript逻辑复杂度也可以工作下去,但是在服务器端一定要有模块化,所虽然javascript在web端发展这么多年,第一个流行的模块化规范却由服务端的javascript应用带来,commonjs规范是由NodeJs发扬光大,这标志着javascript模块化编程正式登上舞台。

一、commonJS

commonJS就是为JS的表现制定规范,因为js没有模块化的功能,所以commonjs应运而生,它希望js可以在任何地方运行,不只是在浏览器中。

commonjs能有一定的影响力,绝对离不开node的人气

CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}

1、定义模块

根据commonjs规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性。

2、输出模块

模块只有一个出口,module.exports对象,我们需要把模块希望输出的内容放入该对象

3、加载模块:

加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象

require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。

img_a60e358e1458ccdc86ab970ffa7fedf7.png

二、AMD

AMD即 Asynchronous Module Definition,中文名是异步模块定义的意思。它是一个在浏览器端模块化开发的规范,由于不是js原生的支持,使用AMD规范进行页面开发需要用对应的库函数,也就是requirejs,实际上AMD就是requirejs在推广过程中对模块定义的模块化产出。

requirejs主要解决两个问题

1、对个js文件可能存在依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器;

2、js加载的时候浏览器会停止页面渲染,加载文件越多,页面持续响应时间越长

img_fc68e512eb69ecff8d6ee40cc5e52953.png

三、CMD

CMD 即Common Module Definition通用模块定义,CMD规范是国内发展出来的,就像AMD有个requireJS,CMD有个浏览器的实现SeaJS,SeaJS要解决的问题和requireJS一样,只不过在模块定义方式和模块加载(可以说运行、解析)时机上有所不同

语法

seajs推崇一个模块一个文件,遵循统一的写法,因为CMD推崇一个文件一个模块,所以经常就用一个文件名作为一个id,CMD推崇就近依赖,所以一般不再define的参数中写依赖,在factory中写,factory是一个函数,有三个参数function(require,exports,module),require是一个方法,接受模块标志作为唯一参数,用来获取其他模块提供的接口require(id),export是一个对象,用来向外提供模块接口,module是一个对象,上面存储了与当前模块相关的一些属性和方法

img_9c707eb7e96fbf1f49352e23c5d1cad0.png

四、AMD与CMD的区别

最明显的区别就是在模块定义时对依赖的处理不同

1、AMD推崇依赖前置,在定义模块的时候就要 声明其依赖的模块;

2、CMD推崇就近依赖,只有在用到某个模块的时候再去require

这两种区别各有优势,只是语法上的差异,而且requirejs和seajs都支持对方的写法。AMD和CMD最大的区别是对依赖模块的执行时机处理不同,注意不是加载的时机或者方式。

requirejs和seajs都是一部加载模块,只不过AMD依赖前置,js可以方便知道依赖的是谁,立即加载。而CMD就近依赖,需要使用把模块变为字符串解析一边才知道依赖了哪些模块,这也是很多人诟病CMD的一点,牺牲性能来带来开发的便利性,实际上解析模块用到的时间短到可以忽略。

同样都是异步加载模块,AMD在加载模块完成后就会执行该模块,所有模块都加载执行完后会进入require的回调函数,执行主逻辑,这样的效果就是依赖模块的执行顺序和书写顺序不一定一致,看网速效果,哪一个先下载下来,哪个先执行,但是主逻辑一定在依赖加载完成后才执行。

CMD在加载完某个依赖之后并不执行,只是下载而已,在所有依赖模块加载完成后进入主逻辑,遇到require语句的时候才执行对应模块,这样模块的执行顺序和书写顺序是完全一致的。这也是很多人说AMD用户的体验号,因为没有延迟,依赖模块提前执行了,CMD性能好,因为只有用户需要的时候才执行。

相关文章
|
4月前
|
JavaScript
TS,编写TS文件,编写hello.ts文件,cmd下打开终端,输入tsc hello.ts会生成一个hello.js文件,简化命令,npm i -g ts-node,ts-node hello.ts
TS,编写TS文件,编写hello.ts文件,cmd下打开终端,输入tsc hello.ts会生成一个hello.js文件,简化命令,npm i -g ts-node,ts-node hello.ts
|
JavaScript 前端开发 UED
JavaScript中的AMD和CMD规范
JavaScript中的AMD和CMD规范
|
JavaScript 前端开发
说说你对JavaScript模块化方案的理解和 CommonJS、AMD、CMD、ES6 Module 分别是什么?
模块化是指将一个复杂问题,自顶向下逐层把系统划分为若干模块的过程。对于整个系统来说,这些模块可组合,分解和更换的单元。对于编程领域的模块化就是遵守固定的原则,将一个大文件拆分成多个独立且相互依赖的小模块。简单理解模块化就是在一个js文件中能够引入另一个js文件
139 0
|
JavaScript 前端开发
js 模块化基础和模块规范AMD、CMD、ES6模块
js 模块化基础和模块规范AMD、CMD、ES6模块
115 0
|
JavaScript 前端开发
js 模块化基础和模块规范AMD、CMD、ES6模块
js 模块化基础和模块规范AMD、CMD、ES6模块
85 0
|
JavaScript 前端开发 Java
【Node.js】【CMD命令行】垫底的后端(我)来垫底node了,搞了个命令行互动翻译
「本文正在参与技术专题征文Node.js进阶之路,点击查看详情」
167 0
【Node.js】【CMD命令行】垫底的后端(我)来垫底node了,搞了个命令行互动翻译
|
Web App开发 缓存 前端开发
正式发布一款可cmd命令安装的React.js项目脚手架——FastReactApp
正式发布一款可cmd命令安装的React.js项目脚手架——FastReactApp
正式发布一款可cmd命令安装的React.js项目脚手架——FastReactApp
|
JavaScript 前端开发
JavaScript模块化-CommonJS、AMD、CMD、UMD、ES6
JavaScript模块化-CommonJS、AMD、CMD、UMD、ES6
167 0
|
JavaScript
JS模块化(三):CMD规范
JS模块化(三):CMD规范
127 0
JS模块化(三):CMD规范
x3d
|
前端开发 JavaScript API
【整理】 JavaScript模块化规范AMD 和 CMD 的区别有哪些?
根据玉伯等人在知乎上的回答整理。整理中。。。 AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 规范在这里:https://github.com/seajs/seajs/issues/242 背景 要想将JavaScript提升到和其他编程语言一个级别的编程体验,包管理是一个必须之物。
x3d
1082 0