`
frank1998819
  • 浏览: 763946 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

AMD:浏览器中的模块规范(转)

    博客分类:
  • JS
 
阅读更多

Snandy

Stop, thinking is the essence of progress.

 

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

 

1
2
3
4
5
6
define(function() {
    return {
        mix: function(source, target) {
        }
    };
});

 

 

 

ui.js

 

1
2
3
4
5
6
7
define(['base'], function(base) {
    return {
        show: function() {
            // todo with module base
        }
    }
});

 

 

 

page.js

 

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

 

 

 

data.js

 

1
2
3
4
define({
    users: [],
    members: []
});

 

 

 

以上同时演示了define的三种用法

 

  1. 定义无依赖的模块(base.js)
  2. 定义有依赖的模块(ui.js,page.js)
  3. 定义数据对象模块(data.js)

 

 

 

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

 

 

 

4,具名模块

 

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

 

 

 

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

 

 

 

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

 

 

 

5,包装模块

 

1
2
3
4
5
6
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 、bdLoadJSLocalnet 、Nodules 等。
也有很多库支持AMD规范,即将自己作为一个模块存在,如MooTools 、jQuery 、qwery 、bonzo  甚至还有 firebug 。

 

分享到:
评论

相关推荐

    JS中的模块规范(CommonJS,AMD,CMD

    ### JS中的模块规范(CommonJS, AMD, CMD) #### 一、CommonJS CommonJS 是一种模块化标准,最初被设计用于服务器端JavaScript环境,特别是针对Node.js这样的平台。CommonJS 的核心理念是允许开发者将代码组织成独立...

    模块编程AMD规范

    AMD(Asynchronous Module Definition)规范就是一种处理模块化编程的方法,尤其在浏览器环境中广泛应用。RequireJS是实现AMD规范的一个著名库,它使得在浏览器端进行模块化加载变得可能。 AMD规范主要解决的是...

    符合AMD规范的简单模块化加载工具

    AMD规范由RequireJS提出并广泛推广,旨在解决JavaScript在浏览器环境中由于脚本加载顺序问题导致的依赖关系难题。 在JavaScript开发中,包管理器扮演着重要的角色。它们帮助我们组织代码,管理依赖,以及自动化构建...

    JS中的模块规范(CommonJS,AMD,CMD(少用))

    ### JS中的模块规范详解 #### 一、CommonJS **CommonJS** 是为了解决JavaScript在实际应用中缺乏模块化支持的问题而诞生的一种规范。它最初是为了让JavaScript能够在服务器端运行,尤其是为了适应Node.js这样的...

    Javascript模块化编程(二)AMD规范共3页.pd

    6. **AMD与CommonJS的区别**:与CommonJS(Node.js中使用的模块系统)相比,AMD更适合浏览器环境,因为它支持异步加载,而CommonJS则适用于服务器端,其模块加载是同步的。 7. **工具支持**:RequireJS是实现AMD...

    ESL浏览器端的模块加载器支持延迟定义和AMD

    AMD是JavaScript模块化的一种设计模式,它解决了在浏览器环境中并行加载多个模块的问题。AMD允许模块和它们的依赖关系同时加载,而不是等待一个模块完全加载后再加载下一个。这在处理多个脚本文件时非常有效,尤其是...

    Javascript模块化编程(一)AMD规范(规范使用模块)

    然而,随着技术的发展,目前ES6模块规范(ES Modules)已经被ECMAScript官方标准化,并得到了现代浏览器的广泛支持。ES Modules提供了更现代化的模块导入导出语法,它将逐渐成为主流的JavaScript模块化解决方案。

    浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结.docx

    本文将重点介绍三种主流的JavaScript模块化规范:CommonJS、AMD(Asynchronous Module Definition)以及CMD(Common Module Definition),并通过对比分析它们的特点和应用场景。 #### 二、为何而生 这三个规范都...

    Javascript模块化编程(三):模块化编程实战,试用SeaJS

    2. CommonJS 规范: CommonJS 是服务器端JavaScript模块化的一个标准,允许开发者通过`require()`函数引入模块,并通过`module.exports`或`exports`导出模块。SeaJS虽然在浏览器环境中使用,但其设计思路和API很大...

    NodeJS模块与ES6模块系统语法及注意点详解

    社区模块规范: 1.CommonJS规范 规范实现者: NodeJS 服务端 Browserify 浏览器 2.AMD规范 全称 异步模块定义 规范实现者: RequireJS 浏览器 3.CMD规范 通用模块定义 规范实现者: seaJS 服务端和浏览器通用...

    JTaroModule遵循ES6模块规范的前端模块管理工具

    这种方式相比CommonJS或AMD等早期模块规范,更符合静态类型语言的设计理念,可以进行静态分析,从而提高编译时优化的可能性。 **二、JTaroModule的核心功能** 1. **模块加载**:JTaroModule能自动扫描并加载项目中...

    AMD 模块定义规范

    异步模块定义(AMD)的编程接口提供了定义模块,及异步加载该模块的依赖的机制。它非常适合于使用于浏览器环境,浏览器的同步加载模块机制会带来性能,可用性,调试和跨域访问的问题。

    JavaScript模块规范之AMD规范和CMD规范

    在实际应用中,开发者可以根据项目需求和团队习惯选择合适的模块规范,同时也可以考虑使用Browserify、Webpack等现代前端打包工具,这些工具提供了将CommonJS、AMD、CMD等多种模块规范转换为浏览器兼容的代码的能力...

    OYE AMD模块化开发部署实践 共18页.ppt

    1. **模块化开发**:OYE遵循AMD规范,允许开发者创建和组织模块化的JavaScript代码。 2. **插件支持**:OYE支持自定义插件,扩展其功能以适应不同的应用场景。 3. **构建工具**:OYE Builder提供了一整套构建流程,...

    前端开源库-tapc-amd-wrap

    在前端开发领域,模块化是代码组织和管理的重要方式,AMD(Asynchronous Module Definition)就是一种常见的模块化规范。TAPC(可能是某个团队或项目的缩写)AMD-wrap是针对TAPC项目的一个特定实现,它将CommonJS...

    __babel-bug-dollar-amd:带$和amd模块插件的Babel错误示例

    AMD(Asynchronous Module Definition)是一种常见的模块加载规范,它允许异步加载模块,特别适用于浏览器环境。Babel则是一个广泛使用的JavaScript编译器,它能将ES6+的新特性转换为广泛支持的JavaScript版本,以便...

    Javascript模块化编程

    - **CommonJS**和**AMD**是两种主要的JavaScript模块规范,分别适用于服务器端和浏览器端。 - **异步加载**(如AMD规范所支持的)对于优化浏览器端的应用体验非常重要。 - **库支持**:通过使用如Require.js这样的库...

    AMD_DEMO.zip

    AMD,即Asynchronous Module Definition(异步模块定义),是一种JavaScript模块化开发的规范,它允许在浏览器环境中异步加载和管理模块。AMD规范主要由RequireJS提出并推广,旨在解决JavaScript代码的组织、依赖...

Global site tag (gtag.js) - Google Analytics