AMD:浏览器中的模块规范
为实现与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:浏览器中的模块规范相关推荐
- 再谈 JS中的模块规范(CommonJS,AMD,CMD)来自玉伯的seajs分析
随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做 ...
- Javascript模块规范(CommonJS规范AMD规范)
Javascript模块化编程(AMD&CommonJS) 前端模块化开发的价值:https://github.com/seajs/seajs/issues/547 模块的写法 查看 AMD规 ...
- JavaSript模块规范 - AMD规范与CMD规范介绍[转]
原文地址:http://blog.chinaunix.net/uid-26672038-id-4112229.html JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什 ...
- 前端模块规范AMD/UMD/CommonJs
.babelrc文件中的:module设置为false,为什么会要设置成false? 解释:使ES6模块语法转换到另一个模块类型(默认启用"commonjs"). 设置为假则不变换 ...
- 兼容多种模块规范(AMD,CMD,Node)的代码
前言 昨天,公司同事问了我如下一个问题: 说他在看一个插件时,看到了源码结构如截图所示,他知道(function(){})()是一种立即执行函数,但是在截图中,最后的那个圆括号里又写了一个函数func ...
- AMD,CMD,UMD 三种模块规范 写法格式
一下三块均以 foo.js 为示例文件名,以 jQuery,underscore 为需求组件 ADM:异步模块规范, RequireJs 的支持格式 1 // 文件名: foo.js 2 define ...
- 通过 Browserify 在浏览器中使用 NodeJS 模块
NodeJS 把 JavaScript 的使用从浏览器端扩展到了服务器端,使得前端开发人员可以用熟悉的语言编写服务器端代码.这一变化使得 NodeJS 很快就流行起来.在 NodeJS 社区中有非常多 ...
- 浅析JS模块规范:AMD,CMD,CommonJS
from:https://www.jianshu.com/p/09ffac7a3b2c 随着JS模块化编程的发展,处理模块之间的依赖关系成为了维护的关键. 模块化 AMD,CMD,CommonJS是目 ...
- 跟着 Event loop 规范理解浏览器中的异步机制
原文发自我的 GitHub blog,欢迎关注 前言 我们都知道 JavaScript 是一门单线程语言,这意味着同一事件只能执行一个任务,结束了才能去执行下一个.如果前面的任务没有执行完,后面的任务 ...
最新文章
- python一次性读取整个文件-Python逐行读取文件内容
- DL之FAN:基于人工智能算法偶像和明星渐变卡通形象
- 在线服务器和客户端聊天,实验三、客户端和服务器能实现简单的聊天功能
- Android中LocalSocket使用
- ActiveMQ学习总结(9)——Linux中安装ActiveMQ
- [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列
- 我与潘家园金爷的对话
- 日期格式 java_Java日期格式转换
- Unity3D快速入门超详细视频教程(全套免费送)
- excel粘贴时出现故障_Excel常见问题及解决办法汇总
- 再见北理工:忆北京研究生的编程时光
- 灰度共生矩阵(GLCM)并计算能量、熵、惯性矩、相关性(matlab)(待总结)
- 短信网关平台选型推荐
- 智能音箱音效哪个好_智能音箱这么多,哪个智能音箱,才是现在最好的
- ifup,ifdown命令详解
- 现在计算机怎样读硬盘端口,组装电脑之硬盘识别篇
- ADCIRC模式与Python融合技术应用
- 埃瓦里斯特·伽罗瓦Évariste Galois
- 车载诊断数据库ODX——ODX参数解析类型(下)
- 阿里云入门级服务器和企业级服务器有什么区别?
热门文章
- mysql 主主同步配置_MySQL 主主同步配置
- winforms 动态画折线 不用chart_QT charts 动态刷新曲线图
- 利用OLED构成可控点光源: SSD1306
- 2021年的疫情下的智能车竞赛
- 吹灭蛋糕上蜡烛的节能小车
- 双轮摩托车模安装测试
- 计算机考试八页PPT,第八章节授课ppt-江苏省计算机等级考试.ppt
- vue异步数据 报错_vue中异步请求数据,异步请求还没完成,文件就执行了就会报错,怎么解决?...
- c语言直接插入排序步骤,经典排序之直接插入排序(C语言)
- linux i2c 设备 操作说明