为实现与Node.js相同方式的模块写法,大牛们做了很多努力。但浏览器环境不同于服务器端,它的模块有一个HTTP请求过程(而Node.js的模块文件就在本地),这个请求过程多数使用script tag,script 默认的异步性导致很难实现与Node.js一模一样的模块格式。Modules/Wrappings 使得实现变为现实。虽然和Node.js的模块写法不完全一致,但也有很多相似之处,使得熟悉Node.js的程序员有一些亲切感。但Node.js终究是服务器端的JavaScript,没有必要把这些条条框框放到浏览器JavaScript环境中。
这时AMD 诞生了,它的全称为异步模块定义。从名称上看便知它是适合script tag的。也可以说AMD是专门为浏览器中JavaScript环境设计的规范。它吸取了CommonJS的一些优点,但又不照搬它的格式。开始AMD作为CommonJS的transport format 存在,因无法与CommonJS开发者达成一致而独立出来。它有自己的wiki 和讨论组 。

AMD设计出一个简洁的写模块API:

define(id?, dependencies?, factory);

其中:

id: 模块标识,可以省略。
dependencies: 所依赖的模块,可以省略。
factory: 模块的实现,或者一个JavaScript对象。
id遵循CommonJS Module Identifiers 。dependencies元素的顺序和factory参数一一对应。

以下是使用AMD模式开发的简单三层结构(基础库/UI层/应用层):

base.js

define(function() {
return {
mix: function(source, target) {
}
};
});

ui.js

define(['base'], function(base) {
return {
show: function() {
// todo with module base
}
}
});

page.js

define(['data', 'ui'], function(data, ui) {
// init here
});

data.js

define({
users: [],
members: []
});

以上同时演示了define的三种用法,
1,定义无依赖的模块(base.js)
2,定义有依赖的模块(ui.js,page.js)
3,定义数据对象模块(data.js)

细心的会发现,还有一种没有出现,即具名模块

4,具名模块

define('index', ['data','base'], function(data, base) {
// todo
});

具名模块多数时候是不推荐的,一般由打包工具合并多个模块到一个js文件中时使用。

前面提到dependencies元素的顺序和factory一一对应,其实不太严谨。AMD开始为摆脱CommonJS的束缚,开创性的提出了自己的模块风格。但后来又做了妥协,兼容了 CommonJS Modules/Wrappings 。即又可以这样写

5,包装模块

define(function(require, exports, module) {
var base = require('base');
exports.show = function() {
// todo with module base
}
});

不考虑多了一层函数外,格式和Node.js是一样的:使用require获取依赖模块,使用exports导出API。

除了define外,AMD还保留一个关键字require。require 作为规范保留的全局标识符,可以实现为 module loader,也可以不实现。

目前,实现AMD的库有RequireJS 、curl 、Dojo 、bdLoad、JSLocalnet 、Nodules 等。
也有很多库支持AMD规范,即将自己作为一个模块存在,如MooTools 、jQuery 、qwery 、bonzo 甚至还有 firebug 。

AMD:浏览器中的模块规范相关推荐

  1. 再谈 JS中的模块规范(CommonJS,AMD,CMD)来自玉伯的seajs分析

    随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做 ...

  2. Javascript模块规范(CommonJS规范AMD规范)

    Javascript模块化编程(AMD&CommonJS) 前端模块化开发的价值:https://github.com/seajs/seajs/issues/547 模块的写法 查看 AMD规 ...

  3. JavaSript模块规范 - AMD规范与CMD规范介绍[转]

    原文地址:http://blog.chinaunix.net/uid-26672038-id-4112229.html JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什 ...

  4. 前端模块规范AMD/UMD/CommonJs

    .babelrc文件中的:module设置为false,为什么会要设置成false? 解释:使ES6模块语法转换到另一个模块类型(默认启用"commonjs"). 设置为假则不变换 ...

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

    前言 昨天,公司同事问了我如下一个问题: 说他在看一个插件时,看到了源码结构如截图所示,他知道(function(){})()是一种立即执行函数,但是在截图中,最后的那个圆括号里又写了一个函数func ...

  6. AMD,CMD,UMD 三种模块规范 写法格式

    一下三块均以 foo.js 为示例文件名,以 jQuery,underscore 为需求组件 ADM:异步模块规范, RequireJs 的支持格式 1 // 文件名: foo.js 2 define ...

  7. 通过 Browserify 在浏览器中使用 NodeJS 模块

    NodeJS 把 JavaScript 的使用从浏览器端扩展到了服务器端,使得前端开发人员可以用熟悉的语言编写服务器端代码.这一变化使得 NodeJS 很快就流行起来.在 NodeJS 社区中有非常多 ...

  8. 浅析JS模块规范:AMD,CMD,CommonJS

    from:https://www.jianshu.com/p/09ffac7a3b2c 随着JS模块化编程的发展,处理模块之间的依赖关系成为了维护的关键. 模块化 AMD,CMD,CommonJS是目 ...

  9. 跟着 Event loop 规范理解浏览器中的异步机制

    原文发自我的 GitHub blog,欢迎关注 前言 我们都知道 JavaScript 是一门单线程语言,这意味着同一事件只能执行一个任务,结束了才能去执行下一个.如果前面的任务没有执行完,后面的任务 ...

最新文章

  1. python一次性读取整个文件-Python逐行读取文件内容
  2. DL之FAN:基于人工智能算法偶像和明星渐变卡通形象
  3. 在线服务器和客户端聊天,实验三、客户端和服务器能实现简单的聊天功能
  4. Android中LocalSocket使用
  5. ActiveMQ学习总结(9)——Linux中安装ActiveMQ
  6. [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列
  7. 我与潘家园金爷的对话
  8. 日期格式 java_Java日期格式转换
  9. Unity3D快速入门超详细视频教程(全套免费送)
  10. excel粘贴时出现故障_Excel常见问题及解决办法汇总
  11. 再见北理工:忆北京研究生的编程时光
  12. 灰度共生矩阵(GLCM)并计算能量、熵、惯性矩、相关性(matlab)(待总结)
  13. 短信网关平台选型推荐
  14. 智能音箱音效哪个好_智能音箱这么多,哪个智能音箱,才是现在最好的
  15. ifup,ifdown命令详解
  16. 现在计算机怎样读硬盘端口,组装电脑之硬盘识别篇
  17. ADCIRC模式与Python融合技术应用
  18. 埃瓦里斯特·伽罗瓦Évariste Galois
  19. 车载诊断数据库ODX——ODX参数解析类型(下)
  20. 阿里云入门级服务器和企业级服务器有什么区别?

热门文章

  1. mysql 主主同步配置_MySQL 主主同步配置
  2. winforms 动态画折线 不用chart_QT charts 动态刷新曲线图
  3. 利用OLED构成可控点光源: SSD1306
  4. 2021年的疫情下的智能车竞赛
  5. 吹灭蛋糕上蜡烛的节能小车
  6. 双轮摩托车模安装测试
  7. 计算机考试八页PPT,第八章节授课ppt-江苏省计算机等级考试.ppt
  8. vue异步数据 报错_vue中异步请求数据,异步请求还没完成,文件就执行了就会报错,怎么解决?...
  9. c语言直接插入排序步骤,经典排序之直接插入排序(C语言)
  10. linux i2c 设备 操作说明