文档介绍:1 JavaSript 模块化在了解 AMD , CMD 规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理。模块化是一种处理复杂系统分解为代码结构更合理, 可维护性更高的可管理的模块的方式。可以想象一个巨大的系统代码, 被整合优化分割成逻辑性很强的模块时, 对于软件是一种何等意义的存在。对于软件行业来说: 解耦软件系统的复杂性, 使得不管多么大的系统,也可以将管理,开发,维护变得“有理可循”。还有一些对于模块化一些专业的定义为:模块化是软件系统的属性,这个系统被分解为一组高内聚, 低耦合的模块。那么在理想状态下我们只需要完成自己部分的核心业务逻辑代码,其他方面的依赖可以通过直接加载被人已经写好模块进行使用即可。首先,既然是模块化设计,那么作为一个模块化系统所必须的能力: 1. 定义封装的模块。 2. 定义新模块对其他模块的依赖。 3. 可对其他模块的引入支持。好了,思想有了,那么总要有点什么来建立一个模块化的规范制度吧,不然各式各样的模块加载方式只会将局搅得更为混乱。那么在 JavaScript 中出现了一些非传统模块开发方 2 monJS 的模块规范, AMD ( Asynchronous Module Definition ), CMD ( Common Module Definition )等。 AMD 与 RequireJS AMD Asynchronous Module Definition , 用白话文讲就是异步模块定义, 对于 JSer 来说, 异步是再也熟悉不过的词了,所有的模块将被异步加载,模块加载不影响后面语句运行。所有依赖某些模块的语句均放置在回调函数中。 AMD 规范定义了一个自由变量或者说是全局变量 define 的函数。 define( id?, dependencies?, factory ); AMD 规范 https:///amdjs/amdjs-api/wiki/AMD 第一个参数 id 为字符串类型,表示了模块标识,为可选参数。若不存在则模块标识应该默认定义为在加载器中被请求脚本的标识。如果存在, 那么模块标识必须为顶层的或者一个绝对的标识。第二个参数, dependencies ,是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。第三个参数, factory ,是一个需要进行实例化的函数或者一个对象。 3 创建模块标识为 alpha 的模块,依赖于 require , export ,和标识为 beta 的模块 1. define ( "alpha" ,[ "require" , "exports" , "beta" ], function ( require , expor ts , beta ){ 2. export . verb = function (){ 3. return beta . verb (); 4. // or: 5. return require ( "beta" ). verb (); 6.} 7. }); 一个返回对象字面量的异步模块 1. define ([ "alpha" ], function ( alpha ){ 2. return { 3. verb : function (){ 4. return alpha . verb () +1; 5.} 6.} 7. }); 无依赖模块可以直接使用对象字面量来定义 1. define ({ 2. add : function (x,y ){ 3. return x+y; 4.} 5.} );4 monJS 方式定义 1. define ( function ( require , exports , module ){ 2. var a= require ( 'a' ), = require ( 'b' ); 4. 5. exports . action = function (){}; 6.} ); require(); require API 介绍 https:///amdjs/amdjs-api/wiki/require 在 AMD 规范中的 require monJS 中的 require 不同。由于动态检测依赖关系使加载异步,对于基于回调的 require 需求强烈。局部与全局的 require 局部的 require 需要在 AMD 模式中的 define 工厂函数中传入 require 。 1. define ([ 'require' ], function ( require ){ 2. // ... 3.} ); 4. or : 5. define ( funct