js概念之AMD-浏览器中的模块规范

感觉好凌乱,对于一些js领域出现的名词都不是很清楚其概念,更别说深入了解原理和应用了。今后将加深这方面的知识,同时也会分享js方面的各种名词和框架,首先我觉得作为一个专业人员,这是一个知识的累积,其次就是领域的需要,最后就是苦逼的前端需要用到这些技术。

前面提到,为实现与NodeJS相同方式的模块写法,大牛们做了很多努力。

但由于浏览器环境不同于服务器端,它的模块有一个HTTP请求过程。这个请求过程多数使用script tag,script tag默认的异步性导致很难实现与NodeJS一模一样的模块格式。

Modules/Wrappings 使得实现变为现实。虽然和NodeJS的模块写法不完全一致,但也有很多相似之处,使得熟悉NodeJS的程序员有一些亲切感。

但NodeJS终究是服务器端的JavaScript,没有必要把这些条条框框放到浏览器JavaScript环境中。这时AMD 诞生了,它的全称为异步模块定义。从名称上看便知它是适合script tag的。也可以说AMD是专门为浏览器中JavaScript环境设计的规范。它吸取了CommonJS的一些优点,但又不照搬它的格式。开始AMD作为CommonJS的transport format 存在,因无法与CommonJS开发者达成一致而独立存在。它有独立的wiki讨论组

AMD设计出一个简洁的写模块API:define
define(id?, dependencies?, factory);
其中:

  • id: 模块标识,可以省略。
  • dependencies: 所依赖的模块,可以省略。
  • factory: 模块的实现,或者一个JavaScript对象。
id遵循CommonJS Module Identifiers 。dependencies元素的顺序和factory参数一一对应。
以下是使用AMD模式开发的简单三层结构(基础库/UI层/应用层):
base.js
Js代码  收藏代码
  1. define(function() {
  2.     return {
  3.         mix: function(source, target) {
  4.         }
  5.     };
  6. });
ui.js
Js代码  收藏代码
  1. define([‘base’], function(base) {
  2.     return {
  3.         show: function() {
  4.             // todo with module base
  5.         }
  6.     }
  7. });
page.js
Js代码  收藏代码
  1. define([‘data’, ‘ui’], function(data, ui) {
  2.     // init here
  3. });
data.js
Js代码  收藏代码
  1. define({
  2.     users: [],
  3.     members: []
  4. });
以上也演示了define的三种用法,
1,定义无依赖的模块 (base.js)
2,定义有依赖的模块 (ui.js,page.js)
3,定义数据对象模块 (data.js)
细心的会发现,还有一种没有出现,即具名模块
4,具名模块
Js代码  收藏代码
  1. define(‘index’, [‘data’,’base’], function(data, base) {
  2.     // todo
  3. });
具名模块多数时候是不推荐的,一般打包工具合并多个模块到一个js文件中时会使用。
前面提到dependencies元素的顺序和factory一一对应,其实不太严谨。AMD开始为摆脱CommonJS的束缚,开创性的提出了自己的模块风格。但后来又做了妥协,兼容了 CommonJS Modules/Wrappings 。即又可以这样写
5,包装模块
Js代码  收藏代码
  1. define(function(require, exports, module) {
  2.     var base = require(‘base’);
  3.     exports.show = function() {
  4.         // todo with module base
  5.     }
  6. });
不考虑多了一层函数外,格式和NodeJS还比较象的。使用require获取依赖模块,使用exports导出API。
除了define外,AMD还保留一个关键字require。require 作为规范保留的全局标识符,可以实现为 module loader。也可以不实现。
目前,实现AMD的库有RequireJScurlDojobdLoadJSLocalnetNodules 等。
也有很多库支持AMD规范,即将自己作为一个模块存在,如MooToolsjQueryqwerybonzo  甚至还有 firebug
原文来自:sandy

关注我

我的微信公众号:前端开发博客,在后台回复以下关键字可以获取资源。

  • 回复「小抄」,领取Vue、JavaScript 和 WebComponent 小抄 PDF
  • 回复「Vue脑图」获取 Vue 相关脑图
  • 回复「思维图」获取 JavaScript 相关思维图
  • 回复「简历」获取简历制作建议
  • 回复「简历模板」获取精选的简历模板
  • 回复「加群」进入500人前端精英群
  • 回复「电子书」下载我整理的大量前端资源,含面试、Vue实战项目、CSS和JavaScript电子书等。
  • 回复「知识点」下载高清JavaScript知识点图谱

每日分享有用的前端开发知识,加我微信:caibaojian89 交流