为什么需要amd规范

今天主要说说AMD规范在Web环境里的应用,以及为什么采用AMD规范.想了解AMD规范的可以点击这里


what AMD?

  • 规定 define 来定义一个模块
  • 规定 require 来请求一个模块
  • 规定 exports 来导出一个模块对外公共的API
  • 约定通用的模块依赖规范

使用AMD之前是怎么实现一个模块的呢?

下面是一个简单模块的例子.

(function(global){
    var module = {
        prop: 'name',
        method: function(){ // do stuff}
    }
    global.moduleName = module;
})(this);

基本上没有使用AMD之前一般都是这样实现一个模块的:

  • 定义一个立即执行的函数来导出一个模块公共API
  • 使用script标签来加载模块
  • 使用一定的script加载顺序来控制模块之前的依赖

当项目很大的时候,这种方式的模块开发几乎不能维护,而且部署的时候也是一个大问题,通常需要对业务进行脚本化来简化部署.

另一个模块规范COMMONJS

这里COMMONJS模块先简写为CJS.

起初CJS规范是在NodeJS里使用的,看下面的一段简单的代码.

var _ = require('underscore');
exports.module = {
    find: function(){ // do stuff use _ }
}

在CJS眼里,模块是阻塞的方式来加载的,这样才能保证后面的代码可以取得模块实例,但是这个跟浏览器是天生的不兼容,因为浏览器端的脚本都是异步加载的,像上面的代码在浏览器端就会报错,假如在exports里的使用_的话。

有人说,可以在浏览器端模拟require来异步加载脚本,确实,使用xhr然后解析脚本内容来获取模块实例,但是这种方式有很多缺点,详情可以看我之前写的文章,为什么需要web模块

说说AMD

先上一个以AMD规范定义的模块代码

define(['underscore'], function(_){
    var module = {
        // do stuff use _
    };
    return module;
});

相比较于普通的立即函数,以define方式定义的模块没有在全局下增加额外的东西,而且是传递数组方式的参数来解决模块依赖的问题,最后一个回调函数是在前面所有的依赖加载完成之后执行.

AMD是上面那种以‘XHR和动态解析脚本内容’方式的改进,提高了可编程性以及调试,方便项目构建

AMD模块支持定义模块名称,默认第一个参数是模块名称,看下面的代码

define('demoMd', ['underscore'], function(_){
    var module = {
        // do stuff use _
    }
    return module;
});

其实最佳的模块定义规范是,模块名称是可以不写的,这样可以提高模块的重用性,而且一个文件最后只定义一个模块,这样相同的模块定义文件可以保证它的独立性,最终的模块名称会根据不同的AMD规范实现在内部定义的.

使用模块名称的地方,其实只有在项目最后构建的时候,合并多个模块文件,构建工具会自动生成模块名称

AMD规范本身也提供了对CJS规范的兼容,看下面以AMD规范定义的CJS兼容的代码.

define(function(require){
    var _ = require('underscore');
    var module = {
        // do stuff use _
    }
    return module;
});

上面的代码其实只是AMD规范的一个语法糖,最终会转变成下面的形式

define(['require','underscore'], function(require, _){
    var _ = require('underscore');
    var module = {
        // do stuff use _
    }
    return module;
});

回调函数的主体代码不会变,只是对它进行了包装,保证是以数组方式提供的依赖

但是这种语法有一个前提,require方法里的参数只能是字符串字面值,而不能是变量,或者有判断逻辑的加载,因为这种转换的原理是通过调用Function.prototype.toString,来转换的,所以不能解析变量或者逻辑,像下面的代码就是错误的

define(['require','underscore'], function(require, _){
    var reqName = 'underscore';
    var _ = require(reqName);
    /*
        or like this
        if (some){
            _ =require('abc');
        }else{
            _ = require('asdf');
        }
    */
    var module = {
        // do stuff use _
    }
    return module;
});

有哪些好用的AMD规范的实现呢?

时间: 2024-12-12 11:47:14

为什么需要amd规范的相关文章

Javascript模块化编程(二):AMD规范

今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种:CommonJS和AMD.我主要介绍AMD,但是要先从CommonJS讲起. 八.CommonJS 200

JavaSript模块规范--AMD规范与CMD规范

模块的规范 有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块;但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则岂不是乱了套;考虑到Javascript模块现在还没有官方规范,这一点就更重要了 目前,通行的Javascript模块规范主要有:CommonJS/AMD/CMD:那么让我先从CommonJS讲起 CommonJS 2009年美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程,这标志"Javascrip

AMD规范与CMD规范的区别是什么?

在比较之前,我们得先来了解下什么是AMD规范?什么是CMD规范?当然先申明一下,我个人也是总结下而已,也是网上看到的资料,自己总结下或者可以说整理下而已,供大家更深入的了解!因为我们都知道 AMD规范:是 RequireJS 在推广过程中对模块定义的规范化产出的,而CMD规范:是SeaJS 在推广过程中对模块定义的规范化产出的. 什么是CMD规范?   在CMD中 一个模块就是一个文件,如下代码所示: //基本格式如:define(id, deps, factory) // 比如如下代码 def

JavaScript模块规范之AMD规范和CMD规范_javascript技巧

模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理.模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式.可以想象一个巨大的系统代码,被整合优化分割成逻辑性很强的模块时,对于软件是一种何等意义的存在.对于软件行业来说:解耦软件系统的复杂性,使得不管多么大的系统,也可以将管理,开发,维护变得"有理可循". 还有一些对于模块化一些专业的定义为:模块化是软件系统的属性,这个系统被分解为一组高内聚,低耦合的模块.那么

《JavaScript框架设计》——第 2 章  模块加载系统2.1 AMD规范

第 2 章 模块加载系统 任何语言一到大规模应用阶段,必然要经历拆分模块的过程,以有利于维护与团队协作.与Java走得最近的dojo率先引入了加载器,早期的加载器都是同步的,使用document.write与同步Ajax请求实现.后来dojo开始以JSONP的方法设计它的每个模块的结构,以script节点为主体加载它的模块,这个就是目前主流的加载器方式.不得不提的是,dojo的加载器与AMD规范的发明者都是James Burke,dojo加载器独立出来就是著名的require加载器.本章将为你深

CommonJS规范与AMD规范的理解

和其他js库类似,首先你需要引入,如下: <script src="js/require.js" async="true" defer="defer" data-main="js/main"></script> 上面代码的data-main主要是指定主代码所在的脚本文件,对应js目录下的main.js,requirejs在读取本地js文件时,可以省 略.js后缀,如果是第三方js,则需要.js后缀,如w

Javascript模块化编程(一)AMD规范(规范使用模块)_基础知识

这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块.  (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种:CommonJS和AMD.我主要介绍AMD,

Javascript模块化编程(二)AMD规范

这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种:CommonJS和AMD.我主要介绍AMD,但

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

这是一篇关于javascript模块化AMD,CMD,CommonJS的学习总结,作为记录也给同样对三种方式有疑问的童鞋们,有不对或者偏差之处,望各位大神指出,不胜感激. 本篇默认读者大概知道require,seajs的用法(AMD,CMD用法),所以没有加入使用语法. 1.为何而生:  这三个规范都是为javascript模块化加载而生的,都是在用到或者预计要用到某些模块时候加载该模块,使得大量的系统巨大的庞杂的代码得以很好的组织和管理.模块化使得我们在使用和管理代码的时候不那么混乱,而且也方