我们都知道,虽然我们可以通过原型和继承来使javascript面向对象。但是,当js代码和逻辑过多时,代码的维护和扩展会变的很不方便。这时,nodejs做的非常好,但是在浏览器端模块化的js编程一直都是个难题。而requireJS就是来帮助我们解决这个问题的。requireJS遵循amd规范,所以让我们先了解下关于AMD规范的事情。

一、AMD规范

  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
define(function() {return {mix: function(source, target) {}};
});

  

ui.js

define(['base'], function(base) {return {show: function() {// todo with module base}}
});

page.js

define(['base'], function(base) {
    return {
        show: function() {
            // todo with module base
        }
    }
});

data.js

define({
    users: [],
    members: []
});

以上同时演示了define的三种用法
  1. 定义无依赖的模块(base.js)
  2. 定义有依赖的模块(ui.js,page.js)
  3. 定义数据对象模块(data.js)
细心的会发现,还有一种没有出现,即具名模块
4,具名模块
define('index', ['data','base'], function(data, base) {
    // todo
});

具名模块多数时候是不推荐的,一般由打包工具合并多个模块到一个js文件中时使用。
前面提到dependencies元素的顺序和factory一一对应,其实不太严谨。AMD开始为摆脱CommonJS的束缚,开创性的提出了自己的模块风格。但后来又做了妥协,兼容了 CommonJS Modules/Wrappings 。即又可以这样写
5,包装模块
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 、bdLoad、JSLocalnet 、Nodules 等。
也有很多库支持AMD规范,即将自己作为一个模块存在,如MooTools 、jQuery 、qwery 、bonzo  甚至还有 firebug 。
二、CMD规范
与AMD规范类似的还有CMD规范,

在CMD中,一个模块就是一个文件,格式为:
define( factory );
全局函数define,用来定义模块。
参数 factory  可以是一个函数,也可以为对象或者字符串。
当 factory 为对象、字符串时,表示模块的接口就是该对象、字符串。
定义JSON数据模块:
  1. define({ "foo": "bar" });
通过字符串定义模板模块:
  1. define('this is {{data}}.');
factory 为函数的时候,表示模块的构造方法,执行构造方法便可以得到模块向外提供的接口。
  1. define( function(require, exports, module) {
  2. // 模块代码
  3. });
define( id?, deps?, factory );
define也可以接受两个以上的参数,字符串id为模块标识,数组deps为模块依赖:
  1. define( 'module', ['module1', 'module2'], function( require, exports, module ){
  2. // 模块代码
  3. } );
其与 AMD 规范用法不同。
require 是 factory 的第一个参数。
require( id );
接受模块标识作为唯一的参数,用来获取其他模块提供的接口:
  1. define(function( require, exports ){
  2. var a = require('./a');
  3. a.doSomething();
  4. });
require.async( id, callback? );
require是同步往下执行的,需要的异步加载模块可以使用 require.async 来进行加载:
  1. define( function(require, exports, module) {
  2. require.async('.a', function(a){
  3. a.doSomething();
  4. });
  5. });
require.resolve( id )
可以使用模块内部的路径机制来返回模块路径,不会加载模块。
exports 是 factory 的第二个参数,用来向外提供模块接口。
  1. define(function( require, exports ){
  2. exports.foo = 'bar'; // 向外提供的属性
  3. exports.do = function(){}; // 向外提供的方法
  4. });
当然也可以使用 return 直接向外提供接口。
  1. define(function( require, exports ){
  2. return{
  3. foo : 'bar', // 向外提供的属性
  4. do : function(){} // 向外提供的方法
  5. }
  6. });
也可以简化为直接对象字面量的形式:
  1. define({
  2. foo : 'bar', // 向外提供的属性
  3. do : function(){} // 向外提供的方法
  4. });
与nodeJS中一样需要注意的是,一下方式是错误的:
  1. define(function( require, exports ){
  2. exports = {
  3. foo : 'bar', // 向外提供的属性
  4. do : function(){} // 向外提供的方法
  5. }
  6. });
需要这么做
  1. define(function( require, exports, module ){
  2. module.exports = {
  3. foo : 'bar', // 向外提供的属性
  4. do : function(){} // 向外提供的方法
  5. }
  6. });
传入的对象引用可以添加属性,一旦赋值一个新的对象,那么值钱传递进来的对象引用就会失效了。开始之初,exports 是作为 module.exports 的一个引用存在,一切行为只有在这个引用上 factory 才得以正常运行,赋值新的对象后就会断开引用,exports就只是一个新的对象引用,对于factory来说毫无意义,就会出错。
    module 是factory的第三个参数,为一个对象,上面存储了一些与当前模块相关联的属性与方法。
module.id 为模块的唯一标识。
module.uri 根据模块系统的路径解析规则得到模块的绝对路径。
module.dependencies 表示模块的依赖。
module.exports 当前模块对外提供的接口。

转载于:https://www.cnblogs.com/dunken/p/4524093.html

深入浅出requireJS-1相关推荐

  1. 深入浅出 RequireJS

    简介 一个复杂的应用,其编程语言也必须要有模块机制,方能更好的组织代码.在前端 js 模块中,RequireJS 是一个非常小巧的 JavaScript 模块载入框架,是 AMD 规范最好的实现者之一 ...

  2. Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战

    上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度.以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集. Python --深入浅出Apriori关联分析算法(一) 这次 ...

  3. MSDN Webcast“深入浅出ASP.NET AJAX系列”

    课程: ASP.NET AJAX深入浅出系列课程(1):ASP.NET AJAX 概述(3月13日):对于ASP.NET AJAX的大致功能进行概述和演示,通过简单的演示让听众了解到ASP.NET A ...

  4. 5.3Role和Claims授权「深入浅出ASP.NET Core系列」

    5.3Role和Claims授权「深入浅出ASP.NET Core系列」 原文:5.3Role和Claims授权「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁. ...

  5. 深入浅出开源性能测试工具 Locust (使用篇 1)

    在<[LocustPlus序]漫谈服务端性能测试>中,我对服务端性能测试的基础概念和性能测试工具的基本原理进行了介绍,并且重点推荐了Locust这一款开源性能测试工具.然而,当前在网络上针 ...

  6. 《深入浅出iPhone/iPad开发(第2版)》——在Xcode中建立你的界面

    本节书摘来自异步社区<深入浅出iPhone/iPad开发(第2版)>一书中的在Xcode中建立你的界面,作者 [美]Dan Pilone , Tracey Pilone,更多章节内容可以访 ...

  7. 基于angularJS和requireJS的前端架构

    1.概要描述 1.1.angularJS描述:angularJS是可以用来构建WEB应用的,WEB应用中的一种端对端的完整解决方案.通过开发者呈现一个更高层次的抽象来简化应用的开发.最适合的就是用它来 ...

  8. RequireJS学习笔记(转)

    前言 进入移动前端是很不错的选择,这块也是我希望的道路,但是不熟悉啊... 现在项目用的是require+backbone,整个框架被封装了一次,今天看了代码搞不清楚,觉得应该先从源头抓起,所以再看看 ...

  9. 【组队学习】【35期】深入浅出Pytorch

    深入浅出Pytorch 航路开辟者:李嘉骐.牛志康.刘洋.陈安东 领航员:朱松青 航海士:管柯琴.宋泽山.林旭升 基本信息 开源内容:https://github.com/datawhalechina ...

  10. 深入浅出Pytorch:02 PyTorch基础知识

    深入浅出Pytorch 02 PyTorch基础知识 内容属性:深度学习(实践)专题 航路开辟者:李嘉骐.牛志康.刘洋.陈安东 领航员:叶志雄 航海士:李嘉骐.牛志康.刘洋.陈安东 开源内容:http ...

最新文章

  1. 以太坊智能合约开发第七篇:智能合约与网页交互
  2. windows 下执行mysql脚本_Windows下批处理执行MySQL脚本文件
  3. hbase集群无法重启的可能原因之一及解决办法
  4. Windows CE下驱动程序开发基础
  5. 第二章 认识计算机硬件
  6. Android 要收费?周鸿祎:这是迟早的事!
  7. 可能是世界上最快、最先进的密码恢复程序!
  8. Vin码车架号识别技术已经很成熟了
  9. mysql的tps是什么意思_Mysql数据库的QPS和TPS的意义和计算方法
  10. java bigdecimal.round_down,java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑...
  11. FCPX插件:15种棱镜折射图文展示介绍动画效果 Prism Slideshow
  12. 论Fidderler抓包wegame查询召唤师战绩是否可行?
  13. PS改变图片像素大小(一寸照片变二寸)
  14. BootStrap---day02、03微金所项目
  15. [个人开发者赚钱九]做一个日收入10元的APP!
  16. 关于图形的一些基础知识
  17. TRW破解计量器具管理系统MEMS2.0
  18. U盘防拷贝选择隐大师
  19. 天津海河英才学历型三无调档落户具体流程
  20. 【正点原子STM32连载】第四十章 DHT11数字温湿度传感器 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

热门文章

  1. 数据结构之图:用图解决案例,Python代码实现——24
  2. Vue动态组件和组件缓存
  3. Nodejs ejs模板引擎
  4. LeetCode 2059. 转化数字的最小运算数(BFS)
  5. LeetCode 246. 中心对称数(哈希)
  6. 程序员面试金典 - 面试题 01.03. URL化(字符串)
  7. LeetCode 461. 汉明距离(异或^ 与)
  8. python拆分合并文件_Python 视频文件的分割和合并
  9. oracle磁盘组故障组的概念,ASM中理解的问题大家帮忙!!(asm的外部冗余,为什么也有故障组呢?)...
  10. asp.net接受表单验证格式后再提交数据_如何解析 el-form-renderer 表单渲染器1.14.0...