1. AMD

1.1 什么是AMD?

  • AMD 英文名 Asynchronous Module Definition ,中文名 异步模块定义 。这是一个浏览器模块化开发的规范。
  • 由于浏览器环境执行环境的限制,加载js文件相对于服务器端执行环境比较慢,所以采用模块加载的方式,即解释加载依赖的文件时,浏览器不会停止页面渲染或因为加载文件太大而失去响应。
  • AMD不是javascript标准支持的,使用AMD规范进行页面开发需要用到对应的库函数,也就是RequireJS,实际上AMD是RequireJS在推广过程中对模块化定义的规范化的产出。    

1.2 为什么要用RequireJS

早期的时候,所有js代码在一个文件中,浏览器只需加载一个文件就够了,后来,一个文件不够了,必须分成多个文件,依次加载。例如以下代码:
 <script src="1.js"></script>
<script src="2.js"></script>
<script src="3.js"></script>
<script src="4.js"></script>
<script src="5.js"></script>
<script src="6.js"></script>
这样写有很大的缺点,首先,浏览器加载js的时候会停止对html的渲染,文件越多,页面卡住时间越长;其次由于js文件的依赖关系,必须保证加载顺序,当依赖关系变得复杂的时候,代码编写和维护变得非常困难。
RequireJS的诞生,就是为了解决这两个问题
  • 多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器
  • 实现文件异步加载,避免页面失去响应
    
1.2.1 RequireJS模块的加载
  1. 在页面底部加载requirejs.js 文件<script src="/js/require.js"></script>
  2. 加载require.js 后,再加载自定义主文件main.js 按如下写法放在步骤1的后面 <script src="js/require.js" data-main="js/main"></script> 。 data-main 属性指定网页主模块文件路径,main.js 简写为main
  3. main.js 中模块定义:
    require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
         // some code here
       });

    require()函数接受两个参数。第一个参数是一个数组,表示所依赖的模块,上例就是['moduleA', 'moduleB', 'moduleC'],即主模块依赖这三个模块;第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。require()异步加载moduleA,moduleB和moduleC,浏览器不会失去响应;它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。一个实际的例子:假定主模块依赖jquery、underscore和backbone这三个模块,main.js就可以这样写:

    require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
        // some code here
      });

    require.js会先加载jQuery、underscore和backbone,然后再运行回调函数。主模块的代码就写在回调函数中。

1.2.2 require.config()

使用require.config()方法,我们可以对模块的加载行为进行自定义。require.config()就写在主模块(main.js)的头部。参数就是一个对象,这个对象的paths属性指定各个模块的加载路径。

require.config({
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
    }
  });

1.3 AMD 规范写法

模块的定义,必须采用define()函数定义。如果一个模块不依赖其他模块,可以直接定义在define()函数中。

加载非规范的模块,对于不按define()规范定义的模块,通过require,.config()定义后再导入

举例来说,underscore和backbone这两个库,都没有采用AMD规范编写。如果要加载它们的话,必须先定义它们的特征。

require.config({
    shim: {
      'underscore':{
        exports: '_'
      },
      'backbone': {
        deps: ['underscore', 'jquery'],
        exports: 'Backbone'
      }
    }
  });
  
require.config()接受一个配置对象,这个对象除了有前面说过的paths属性之外,还有一个shim属性,专门用来配置不兼容的模块。具体来说,每个模块要定义(1)exports值(输出的变量名),表明这个模块外部调用时的名称;(2)deps数组,表明该模块的依赖性。 
比如,jQuery的插件可以这样定义: 
 

 shim: {
    'jquery.scroll': {
      deps: ['jquery'],
      exports: 'jQuery.fn.scroll'
    }
  }

2. CMD

2.1 概述

CMD Common Module Definition 中文名:通用模块定义,也是浏览器端模块定义的规范。
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出

2.2 AMD&CMD异同:

  • 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
  • CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b') // 依赖可以就近书写
b.doSomething()
// ...
})
// AMD 默认推荐的是
define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
a.doSomething()
// 此处略去 100 行
b.doSomething()
...
})
 

3.CommonJS

3.1 概述

CommonJS 是服务器端模块定义的规范,由Node推广使用,使用方法如下:
//math.js
exports.add = function() {
var sum = 0, i = 0, args = arguments, l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
//increment.js
var add = require('math').add;
exports.increment = function(val) {
return add(val, 1);
}; //index.js
var increment = require('increment').increment;
var a = increment(1); //

3.2 CommonJS规范

  • 一个js文件就是一个模块
  • 输出模块变量最好的办法是export
  • 加载模块是require()方法,返回模块的exports对象
 
 

4. UMD与ES6 Module

  Universal Module Definition 统一模块定义
  ES6 从语法层面对模块化进行了支持,编写方式借鉴了流行的JavaScript模块加载器(AMD, CommonJS)。由宿主环境的默认加载器定义模块运行时的行为,采取隐式异步模式——在模块可以被获取和加载前不会有代码执行。

// lib/math.js
export function sum(x, y) { return x + y; }
export var pi = 3.141593; //app.js
import * as math from "lib/math";
console.log("2π = " + math.sum(math.pi, math.pi));
// other App.js
import {sum, pi} from "lib/math";
console.log("2π = " + sum(pi, pi));
//其他功能包括:export default and export *:
// lib/mathplusplus.js
export * from "lib/math"; export var e = 2.71828182846;
export default function(x) { return Math.exp(x); }
// app.js
import exp, {pi, e} from "lib/mathplusplus";
console.log("e^π = " + exp(pi));

以上内容只是只为个人学习总结,部分摘自网络,如有侵权,联系即删。

参考:
 
 
 

js模块化规范AMD、CMD、CommonJS...的更多相关文章

  1. js模块化开发 AMD CMD Commonjs

    在es6全面实行开来之前  js实现模块开发方案有: 1.AMD 异步模块开发定义  依赖前置,requireJs应用了这一规范 require([module], callback); 加载完后回调 ...

  2. js模块系统 - amd|cmd|commonjs|esm|umd

    写过前端代码大概率听说过amd cmd umd commonjs esm这些名词, 想当初我第一次看到这些的时候, 人都麻了, 都是些啥啊. 后来我知道了, 这些都是js的模块规范. amd - 浏览 ...

  3. JS模块之AMD, CMD, CommonJS、UMD和ES6模块

    CommonJS 传送门 同步加载,适合服务器开发,node实现了commonJS.module.exports和require 判断commonJS环境的方式是(参考jquery源码): if ( ...

  4. 深度扫盲JavaScript的模块化(AMD , CMD , CommonJs 和 ES6)

    原文地址 https://blog.csdn.net/haochangdi123/article/details/80408874 一.commonJS 1.内存情况 对于基本数据类型,属于复制.即会 ...

  5. js模块化规范—AMD规范

    AMD规范说明 AMD全称是:Asynchronous Module Definition(异步模块定义),github地址 是专门用于浏览器端, 模块的加载是异步的 AMD规范基本语法 定义暴露模块 ...

  6. JS模块化规范AMD之RequireJS

    1.基本操作 加载 JavaScript 文件(入口文件) RequireJS以一个相对于baseUrl的地址来加载所有的代码 <script data-main="scripts/m ...

  7. js 模块化规范

    模块规范 CommonJS module.exports, exports 导出模块 require 加载模块, CommonJS 同步,服务端.实践者: nodejs ES6 export, exp ...

  8. 再唠叨JS模块化加载之CommonJS、AMD、CMD、ES6

    Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. Javascript社区做了很多努力,在现有的运行环境中,实现” ...

  9. 兼容多种模块规范(AMD,CMD,Node)的代码

    在JavaScript模块化开发中,为了让同一个模块可以运行在前后端,以及兼容多种模块规范(AMD,CMD,Node),类库开发者需要将类库代码包装在一个闭包内. AMD规范 AMD,即“异步模块定义 ...

随机推荐

  1. 三种主流的Web服务实现方案(REST+SOAP+XML-RPC)简述及比较

    目前知道的三种主流的Web服务实现方案为:REST:表象化状态转变 (软件架构风格)SOAP:简单对象访问协议 XML-RPC:远程过程调用协议 下面分别作简单介绍: REST:表征状态转移(Repr ...

  2. 客户端实现负载均衡:springCloud Ribbon的使用

    Netfilx发布的负载均衡器,是一个基于http.tcp的客户端负载均衡工具,具有控制http.tcp客户端的行为,为ribbon配置服务提供者的地址后,ribbon就 可以经过springClou ...

  3. [Python爬虫] 之三十:Selenium +phantomjs 利用 pyquery抓取栏目

    一.介绍 本例子用Selenium +phantomjs爬取栏目(http://tv.cctv.com/lm/)的信息 二.网站信息 三.数据抓取 首先抓取所有要抓取网页链接,共39页,保存到数据库里 ...

  4. iOS开发之使用UICollectionView实现美团App的分类功能【偶现大众点评App的一个小bug】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  5. PHP5.3下加速器ZendGuardLoader安装 (LNMP/lnmpa)

    PHP5.3下加速器ZendGuardLoader安装 (LNMP/lnmpa) 由于Zend新产品ZendGuardLoader的面世,Zend Optimizer已经不支持php5.3了,官方给出 ...

  6. 在笛卡尔坐标系上描绘函数(x*x+1)/(x*x-1)曲线

    代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...

  7. 在笛卡尔坐标系上描绘函数2*x+Math.sqrt(5-x*x)及其共轭函数2*x-Math.sqrt(5-x*x)曲线

    代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Ty ...

  8. 使用JRadioButton 示例

    代码如下: JRadioButton useCache=new JRadioButton("Use cache");// 初始化单选框 useCache.setFont(new F ...

  9. easyui中combotree只能选子选项,父级不被选中

    前言 前几天面试遇到一个需求(easyui中combotree只能选子选项,父级不被选中),回来特意整理下,大概的思想是如果该tree的节点被选中是判定一下是否有子节点,如果没有就说明是最终节点了,步 ...

  10. PHP上传文件功代码练习(单文件)

    前端: <html> <head><title>upload file</title> <meta http-equiv="Conten ...