关于JavaScript模块范例之CommonJS\AMD\CMD

本篇文章来自对文章《js模块化编程之完全弄懂CommonJS和AMD/CMD!》的总结,大部分摘自文章原话,本人只是为了进修轻易做的笔记,今后有新的体会会实时补充。若有侵权,联络必删,致敬先辈!

在最先之前,先回复我:为何模块很重要?

答:因为有了模块,我们就可以更轻易地运用他人的代码,想要什么功用,就加载什么模块。然则,如许做有一个条件,那就是人人必需以一样的体式格局编写模块,不然你有你的写法,我有我的写法,岂不是乱了套!

因而下面三个模块范例出来了,这篇文章也出来了。提早申明一下,CommonJS范例的完成是node.js,AMD(Asynchronous Module Definition)范例的完成是require.js和curl.js,CMD范例的完成是Sea.js。

JS中的模块范例(CommonJS,AMD,CMD),假如你听过js模块化这个东西,那末你就应该听过或CommonJS或AMD以至是CMD这些范例咯,我也听过,但之前也真的是听听罢了。 如今就看看吧,这些范例究竟是啥东西,干吗的。本文包含这三个范例的泉源及对应的产品的道理。

一、CommonJS范例

1.一最先人人都以为JS是辣鸡,没什么用,官方定义的API只能构建基于浏览器的运用顺序,逗我呢,这太狭窄了吧(用了个高端词,嘎嘎),CommonJS就按耐不住了,CommonJS API定义许多一般运用顺序(重要指非浏览器的运用)运用的API,从而填补了这个空缺。它的终极目标是供应一个相似Python,Ruby和Java规范库。如许的话,开辟者可以运用CommonJS API编写运用顺序,然后这些运用可以运转在差别的JavaScript诠释器和差别的主机环境中。

在兼容CommonJS的体系中,你可以运用JavaScript开辟以下顺序:

(1).服务器端JavaScript运用顺序
(2).命令行东西
(3).图形界面运用顺序
(4).夹杂运用顺序(如,Titanium或Adobe AIR)

2009年,美国顺序员Ryan Dahl制造了node.js项目,将javascript言语用于服务器端编程。这标志”Javascript模块化编程”正式降生。因为老实说,在浏览器环境下,没有模块也不是迥殊大的题目,毕竟网页顺序的复杂性有限;然则在服务器端,一定要有模块,与操作体系和其他运用顺序互动,不然基础没法编程。NodeJS是CommonJS范例的完成,webpack 也是以CommonJS的情势来誊写。

node.js的模块体系,就是参照CommonJS范例完成的。在CommonJS中,有一个全局性要领require(),用于加载模块。假定有一个数学模块math.js,就可以像下面如许加载。

var math = require(‘math’);

然后,就可以挪用模块供应的要领:

  var math = require(‘math’);

  math.add(2,3); // 5

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

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

虽然说Node遵照CommonJS的范例,然则比拟也是做了一些弃取,填了一些新东西的。

不过,说了CommonJS也说了Node,那末我以为也得先了解下NPM了。NPM作为Node的包管理器,不是为了协助Node处理依靠包的装置题目嘛,那它一定也要遵照CommonJS范例啦,它遵照包范例(照样理论)的。CommonJS WIKI讲了它的汗青,还引见了modules和packages等。

下面讲讲commonJS的道理以及浅易完成:

1、道理
浏览器不兼容CommonJS的基础原因,在于缺乏四个Node.js环境的变量。

module
exports
require
global

只需可以供应这四个变量,浏览器就可以加载 CommonJS 模块。

下面是一个简朴的示例。

var module = {
  exports: {}
};

(function(module, exports) {
  exports.multiply = function (n) { return n * 1000 };
}(module, module.exports))

var f = module.exports.multiply;
f(5) // 5000 

上面代码向一个马上实行函数供应 module 和 exports 两个外部变量,模块就放在这个马上实行函数内里。模块的输出值放在 module.exports 当中,如许就完成了模块的加载。

二、AMD范例

基于commonJS范例的nodeJS出来今后,服务端的模块观点已构成,很自然地,人人就想要客户端模块。而且最好二者可以兼容,一个模块不必修正,在服务器和浏览器都可以运转。然则,因为一个严重的范围,使得CommonJS范例不适用于浏览器环境。照样上面的代码,假如在浏览器中运转,会有一个很大的题目,你能看出来吗?

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

第二行math.add(2, 3),在第一行require(‘math’)今后运转,因而必需等math.js加载完成。也就是说,假如加载时候很长,全部运用就会停在那边等。您会注意到 require 是同步的。

这对服务器端不是一个题目,因为一切的模块都存放在当地硬盘,可以同步加载完成,等待时候就是硬盘的读取时候。然则,关于浏览器,这倒是一个大题目,因为模块都放在服务器端,等待时候取决于网速的快慢,能够要等很长时候,浏览器处于”假死”状况。

因而,浏览器端的模块,不能采纳”同步加载”(synchronous),只能采纳”异步加载”(asynchronous)。这就是AMD范例降生的背景。

CommonJS是重要为了JS在后端的表现制订的,他是不合适前端的,AMD(异步模块定义)涌现了,它就重要为前端JS的表现制订范例。

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重要供应define和require两个要领来举行模块化编程,前者用来定义模块,后者用来挪用模块。RequireJS就是完成了AMD范例的呢。

三、CMD范例

大名远扬的玉伯写了seajs,就是遵照他提出的CMD范例,与AMD蛮邻近的,不过用起来觉得越发轻易些,最重要的是中文版,无奇不有:seajs官方doc

define(function(require,exports,module){...});

前面说AMD,说RequireJS完成了AMD,CMD看起来与AMD彷佛呀,那RequireJS与SeaJS像不像呢?虽然CMD与AMD蛮像的,但区分照样挺显著的,官方非官方都有论述和明白,我以为吧,说的都挺好:

官方论述SeaJS与RequireJS异同
SeaJS与RequireJS的最大异同(这个说的也挺好)

    原文作者:Hunter818
    原文地址: https://segmentfault.com/a/1190000017063681
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞