js模块化编程(二):模块的规范

为什么要有规范?

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

一、CommonJS规范

2009年,美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程。这标志"Javascript模块化编程"正式诞生。
因为老实说,在浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限;但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程。
node.js的模块系统,就是参照CommonJS规范实现的。在CommonJS中,有一个全局性方法require(),用于加载模块。

假定有一个数学模块math.js,就可以像下面这样加载和调用。

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

CommonJS的最大特点:模块是同步加载的
导致的问题:在服务器端同步加载的方式并不会造成多大影响,都是从你的服务器硬盘读取数据。但是在浏览器端同步加载会导致页面失去响应

二、AMD规范

官方AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD

  • AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
  • 对于依赖的模块,AMD 是提前执行
  • 不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。
// AMD 默认推荐的是
define(['./a', './b'], function(a, b) {  // 依赖必须一开始就写好  
     a.doSomething()    // 此处略去 100 行   
     b.doSomething()
     ...
})

三、CMD规范

官方CMD 规范在这里:https://link.zhihu.com/?target=https%3A//github.com/seajs/seajs/issues/242

  • CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
  • 对于依赖的模块,CMD 是延迟执行
  • CMD 推崇 as lazy as possible.
define(function(require, exports, module) {   
    var a = require('./a') 
    a.doSomething()   // 此处略去 100 行   
    var b = require('./b')  // 依赖可以就近书写   
    b.doSomething()   // 
    ... 
})

四、差异

AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹。
另外,SeaJS 和 RequireJS 的差异,可以参考:https://github.com/seajs/seajs/issues/277

请写出各规范的优缺点以及代表性框架,可额外补充

http://www.cnblogs.com/chenguangliang/p/5856701.html
http://zccst.iteye.com/blog/2215317
http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html
https://imququ.com/post/amd-simplified-commonjs-wrapping.html
https://www.zhihu.com/question/20351507/answer/14859415

你可能感兴趣的:(js模块化编程(二):模块的规范)