当我写这篇文章的时候,sea.js已经逐渐退出历史的舞台,详细链接。不过任何新事物的出现都是对旧事物的取其精华,去其糟粕,所以了解一下以前模块的加载也是一件好事。

js模块化的原因自不比多说,看看HUX同学的js模块加载七日谈就知道了,将的非常详细。

一 .CMD模块加载规范

一个js文件就是一个模块,定义如下:define(factory);

  factory可以使一个函数,一个对象,或者一个字符串。

  1.factory是一个函数

  define(function(require,exports,module){

    var a = reuire('./a');//执行到此处时模块a同步下载并且执行,这个就是和AMD模式的不同之处

    a.dosomething();

    exports.foo = function(){};

  });

  或者

  define(function(require,exports,module){

    var a = reuire('./a');//执行到此处时模块a同步下载并且执行,这个就是和AMD模式的不同之处

    a.dosomething();

    return {

          foo:function(){}

        }

  });

  另外,在require方法中还有一个异步加载方式:

  require.async('./b',function(b){

    b.dosomething();

  });

  这里b模块异步加载,对于那些不是需要及时调用的模块可以考虑。

  2.factory是一个对象,字符串的时候表示该模块的接口就死该对象。

  define({

    name:'leilie',

    say:function(){}

  });或者,

  define("hello ,llei");

  define函数也接受2个以上的参数:

  //id是模块标识符,depends是依赖的模块。

  define(id,[depends],function(require,exports,module){

    //代码

  });

  然而,这种方式的模块定义并不是CMD规范,而是Modules/Transport 规范,也许你也看出来了,既然有了depends参数,为何factory函数还有require,这就是CMD和

  AMD的区别。

  sea.js的用法

  seajs完全遵守CMD规范,可以在官方链接中找到详细的文档。

二.AMD规范

  玉伯大牛有一个链接将的非常好,介绍了模块的发展。

  AMD也是利用define函数来加载的,具体定义如下:

  define(id,[depends],factory);////id是模块标识符,depends是依赖的模块

  模块标识符

  第一个参数,id,是个字符串,它指的是定义中模块的名字,这个参数是可选的。如果没有提供该参数,模块的名字应该默认为模块加载器请求的指定脚本的名字。如果提供了  该参数,模块名必须是“顶级”的和绝对的(不允许相对名字)。

  依赖

  第二个参数,dependencies,是个定义中模块所依赖模块的数组。依赖模块必须根据模块的工厂方法优先级执行,并且执行的结果应该按照依赖数组中的位置顺序以参数的

  依赖的模块名如果是相对的,应该解析为相对定义中模块。换句话来说,相对名解析为相对与模块的名字,并非相对于寻找该模块的名字的路径。

  本规范定义了截然不同的三种特殊的依赖关键字。如果"require","exports", 或 "module"出现在依赖列表中,参数应该按照CommonJS模块规范自由变量去解析。

  依赖参数是可选的,如果忽略此参数,它应该默认为["require", "exports", "module"]。然而,如果工厂方法的长度属性小于3,加载器会选择以函数的长度属性指定的参数个数调用工厂方法。

  工厂方法

  第三个参数,factory,为模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值。

  如果工厂方法返回一个值(对象,函数,或任意强制类型转换为true的值),应该为设置为模块的输出值。

三 二者的不同之处

  define(["require"], function(require) {

     // 在这里,模块 a 已经下载并执行好 //

     var a = require("./a") // 此处仅仅是取模块 a 的 exports,然而,其实你并不想运行a那么这是不合理的

  });

  针对上面的不合理之处,那么直接使用CMD规范不就好了,然而:

  1. 不能直接压缩:require是局部变量,意味着不能直接的通过压缩工具进行压缩,若require这个变量被替换,加载器与自动化工具将无法获取模块的依赖。
  2. 模块书写有额外约定:路径参数不能进行字符串运算,不能使用变量代替,否则加载器与自动化工具无法正确提取路径。

  

js模块加载之AMD和CMD的更多相关文章

  1. 前端模块加载规范AMD与CMD小记

    AMD代表:requirejs:    CMD代表:seajs:   AMD CMD 代表 requirejs seajs  执行  提前加载,不管是否调用模块,先解析所以模块 提前加载,在真正需要使 ...

  2. js模块化/js模块加载器/js模块打包器

    之前对这几个概念一直记得很模糊,也无法用自己的语言表达出来,今天看了大神的文章,尝试根据自己的理解总结一下,算是一篇读后感. 大神的文章:http://www.css88.com/archives/7 ...

  3. 实现简单的 JS 模块加载器

    实现简单的 JS 模块加载器 1. 背景介绍 按需加载是前端性能优化的一个重要手段,按需加载的本质是从远程服务器加载一段JS代码(这里主要讨论JS,CSS或者其他资源大同小异),该JS代码就是一个模块 ...

  4. nodejs js模块加载

    本文地址:http://www.cnblogs.com/jasonxuli/p/4381747.html nodejs的非核心模块(core module)加载主要使用的就是module.js. 项目 ...

  5. sea.js模块加载工具

    seajs的使用 seajs是一个jS模块加载器,由淘宝前端架构师玉伯开发,它可以解决命名空间污染,文件依赖的问题.可以在一个js文件中引入另外一个js.require('a.js') 1.安装 np ...

  6. JS模块加载器加载原理是怎么样的?

    路人一: 原理一:id即路径 原则.通常我们的入口是这样的: require( [ 'a', 'b' ], callback ) .这里的 'a'.'b' 都是 ModuleId.通过 id 和路径的 ...

  7. 【 js 模块加载 】深入学习模块化加载(node.js 模块源码)

    一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须按照一定的格式编写.AMD,CMD,CommonJS 是目前最常用的三种模块化书写规范.  1.AMD(Asy ...

  8. 【 js 模块加载 】【源码学习】深入学习模块化加载(node.js 模块源码)

    文章提纲: 第一部分:介绍模块规范及之间区别 第二部分:以 node.js 实现模块化规范 源码,深入学习. 一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须 ...

  9. 彻底搞清楚javascript中的require、import和export(js模块加载规范的前世今生)

    为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...

随机推荐

  1. 使用wget下载JDK8

    每次去官网下载JDK有点烦 但是直接使用wget 又得同意协议所以 使用如下的wget就好了(注意是64位的哦) 先去官网看一下地址变化 没有如下 :修改后面的下载地址即可 注意哦~ 2.然后使用下面 ...

  2. React-Native集成到已有项目中的总结

    安装Python 从官网下载并安装python 2.7.x(3.x版本不行) 安装node.js 从官网下载node.js的官方V6.X.X版本或更高版本.安装完成后检测是否安装成功:node -v ...

  3. 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)

    前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...

  4. Linux SSH安全技巧

    SSH服务器配置文件是/etc/ssh/sshd_conf.在你对它进行每一次改动后都需要重新启动SSH服务,以便让改动生效. 1.修改SSH监听端口默认情况下,SSH监听连接端口22,攻击者使用端口 ...

  5. 在VMware上安装ubuntu,并且SecureCRT远程连接

     工具: VMware:VMware-workstation-full_12.5.5.17738.exe Ubuntu镜像:ubuntu-16.04-server-amd64.iso 远程连接工具-- ...

  6. jsp传到java的control层的方法

    jsp传到java的control层的方法1.form表单 用<input type="submit">提交,提交到后台的参数在form表单内<form meth ...

  7. EF架构~codeFirst从初始化到数据库迁移

    一些介绍 CodeFirst是EntityFrameworks的一种开发模式,即代码优先,它以业务代码为主,通过代码来生成数据库,并且加上migration的强大数据表比对功能来生成数据库版本,让程序 ...

  8. 行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗?

    块级元素(block)特性: 总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示; 宽度(width).高度(height).内边距(padding)和外边距(margin)都可控制; ...

  9. mybatis if test 解决页面 升序和降序的问题

    <if test="status !=null and status !='' and status =='1'.toString()"> ORDER BY tag.c ...

  10. 详解ES6中的 let 和const

      前  言 JRedu ECMAScript 6 是 JavaScript 语言教程,全面介绍 ECMAScript 6 新引入的语法特性. ES6 与上一个版本 ES5 的所有不同之处,对涉及的语 ...