参考http://ourjs.com/detail/52ad26ff127c76320300001f

Offcial Site http://requirejs.org/

下载http://requirejs.org/docs/download.html  需要require.js才能正确执行require 和 define

为什么需要模块化JS  下面是ourJS的说法

这样的写法有很大的缺点。首先,加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。

有了<script src="js/require.js"></script>这个  接下来JS就能使用 defined 和 require了

不过我们一般这么用

<script src="js/require.js" data-main="js/main"></script>

main理解为主函数  表示的是在加载了require.js之后就去加载的函数(这里main.js的后缀js是可以省去的  因为使用require的话 默认加载的是js)

既然我希望main作为主函数 那么它一定要调用很多其他的函数(模块)  也就是说它依赖于很多模块  所以一般来说 main.js 是这样的形式

  require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){

    // some code here

  });

如果main.js依赖jquery underscore backbone这三个模块  main.js 可以这样写

  require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
    // some code here
  });

这里默认jquery underscore backbone 这三个模块的文件名字就是 jquery.js  underscore.js  backbone.js 且和main.js在同一目录下

([]中就是路径  不过可以省去js扩展后缀)

同时这三个库都有返回值  在require的回调函数中可以调用这个返回的对象

回调函数中参数的顺序和require的顺序一样  所以这里写为$ _ Backbone

=================================================

//require([moduleID,...],function(...){});
//指定模块的时候 无需指定.js后缀 因为默认是加载js文件
//这里在寻找文件的时候 默认根据baseUrl + paths的方式
//baseUrl已经在index.html中指定
//如果是以 .js结尾 / "http"开头 将会以index.html文件为baseUrl

//依赖一个原始的库 //比如jQuery
//这里会根据moduleID去加载文件 也根据这个名字去寻找模块
//所以文件中应当将模块命名和这里一致
//比如当前目录下有个jQuery库 文件名为jQuery2.1.1
//你可能想要这么做
// require(["jQuery2.1.1"],function($){
// console.log('jQuery2.1.1=============');
// console.log($);//undefined
// });
//这样错误 因为jQuery库自己定义自己的模块名为jquery(全部是小写)

//所以很容易想到把文件名改为jquery.js
require(["jquery"],function($){
console.log('jquery=============');
console.log($);
});

//但是这样的规定太限制不是嘛 如果jQuery不在同级目录下 而是在别的地方怎么办?
//可以使用path来指定路径 其中的key就是模块名
//我还是想引用jquery这个模块 但是我甚至连模块名都想换! 使用shim
//参考http://www.zfanw.com/blog/require-js.html && http://requirejs.org/docs/jquery.html
//所以我们需要一个配置 这样jQuery的库的文件名就比较随意了

require.config({
paths: {
'jquery2': 'lib/jQuery2.1.1',
'jquery':'lib/jQuery'
},
shim: {
'jquery2': {
exports: 'jQuery' //设置可以选择全局变量名 $或者 jQuery
}
}
});

require(['jquery'],function($){
console.log('path jquery=================================');
console.log($);
});
//在config中为jQuery库设置了模块名
require(["jquery2"],function(jQuery){
console.log('shim jQuery2.1.1=============');
console.log(jQuery);//undefined//这里jQ文件就是原始的jquery库 名字必须是jquery//即使是jQuery也不行
});

//依赖一个define的模块
//[]中是模块的文件路径 写了.js后缀的话 表示baseDir是index.html文件所在路径
//PS ./表示当前目录 可以省去 所以没必要写为./lib/zepto
//这里路径为lib/zepto 也就是加载lib/zepto.js
//且zepto.js中定义的模块名也是lib/zepto

//PS Require JS 会自动根据文件名(不含后缀名,即不含 ".js")来给定义的模块命名
//如果zepto.js没有写模块名的话 默认模块名就是lib/zepto
//如果zepto.js中定义的模块名不是lib/zepto 虽然zepto.js文件被加载
//但是回调函数参数得不到值 因为require是在lib/zepto.js 中加载lib/zepto模块

//PS 这个函数在所依赖的模块加载完成之前不会执行
require(['lib/zepto'], function ($) {
console.log('zepto=============================');
console.log($);
});

//PS define会在require之前执行
//PS 一个JS中只能有一个define
//如果当前目录下存在jQuery2.1.1文件
// define(["jQuery2.1.1"],function($){
// console.log('jQuery2.1.1==def===========');
// console.log($);//undefined//原因和上面一样 模块名字不对
// });

//如果当前目录下存在jquery
// define(["jquery"],function($){
// console.log('jquery==def===========');
// console.log($);//ok
// });

// define(["lib/zepto"],function($){
// console.log('zepto===def==========');
// console.log($);
// });

//带有模块名字的define
//如果该文件是index中data-main中引用的文件 而且还想使用define来定义一个非匿名模块的话
//模块的名字要和文件名相同
//否则不执行模块
// define('main2',["jquery"],function($){
// console.log('my jquery===========');
// console.log($);
// });

//你肯定会想 这样的话 define 和 require有什么区别
//define总共有三步 参考http://www.adobe.com/devnet/html5/articles/javascript-architecture-requirejs-dependency-management.html
// Loads the specified dependencies
// Calls the callback function
// Registers the return value from the callback function as the module
//require就是前2个

AMD模块化JS的更多相关文章

  1. Dojo初探之1:AMD规范,编写符合AMD规范(异步模块加载机制)的模块化JS(其中dojo采用1.11.2版本)

    一.AMD规范探索 1.AMD规范(即异步模块加载机制) 我们在接触js的时候,一般都是通过各种function来定义一些方法,让它们帮我们做一些事情,一个js可以包含很多个js,而这些functio ...

  2. 模拟实现AMD模块化规范

    目录 引子 再谈什么是闭包(闭包的产生)? 词法作用域 回到闭包 利用闭包编写模块 实现AMD模块化规范 写在最后 引子 本文最后的目的是模拟实现AMD模块化规范,而写下本文的原因是今天阅读到了< ...

  3. Javascript AMD模块化规范-备用

    AMD是"Asynchronous Module Definition"的缩写,意思是"异步模块定义". 模块定义define(id?, dependencie ...

  4. webpack打包非模块化js

    本文主要记录了非模块化js如何使用webpack打包 模块化打包实现方式 webpack是模块打包工具,通过入口文件递归遍历其依赖图谱,绝对是打包神器. bar.js export default f ...

  5. Javascript模块化编程系列三: CommonJS & AMD 模块化规范描述

    CommonJS Module 规范 CommonJS 的模块化规范描述在Modules/1.1.1 中 目前实现此规格的包有: Yabble,CouchDB,Narwhal (0.2), Wakan ...

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

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

  7. 使用require.js编写模块化JS

    layout: post title: 使用requirejs编写模块化代码 category: javascript date: 2016-10-22 00:00:00 tags: javascri ...

  8. JavaScript AMD模块化规范

    浏览器环境 有了服务器端模块以后,很自然地,大家就想要客户端模块.而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行. 但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器 ...

  9. js模块化规范—AMD规范

    AMD规范说明 AMD全称是:Asynchronous Module Definition(异步模块定义),github地址 是专门用于浏览器端, 模块的加载是异步的 AMD规范基本语法 定义暴露模块 ...

随机推荐

  1. Linux下的经常使用性能查询命令top、vmstat、gprof、pidstat之对照

    (1)查看各个CPU核的使用情况 sudo top -d 1 进入之后,按1,会出现以下的CPU使用情况,当中us列反映了各个CPU核的使用情况,百分比大说明该核在进行紧张的任务. (2)查看哪个进程 ...

  2. Linux 内核优化

    声明:本文档来自互联网整理部份加自已实验部份所得: TCP 相关部份   经常使用名词说明: retries(再试).   TCP server <---> client通信状态      ...

  3. <学习>.NET的反射基础

    关键词 Assembly 使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例. Module 通过它可以获取包含模块的程序集以及模块中的类等, ...

  4. 链表的实现 -- 数据结构与算法的javascript描述 第六章

    链表 链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链 结构示意图 : 链表头需要我们标识 head { element:head,next:obj1 ...

  5. <转>ASP.NET学习笔记之理解MVC底层运行机制

    ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制 今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET ...

  6. ES6 JavaScript Promise的感性认知

    http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-感性认知/ 这篇文章讲的很透彻 http://www.zhangx ...

  7. BZOJ 1406: [AHOI2007]密码箱( 数论 )

    (x+1)(x-1) mod N = 0, 枚举N的>N^0.5的约数当作x+1或者x-1... ------------------------------------------------ ...

  8. [C#参考]UI和线程(一)

    Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程. 什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包 ...

  9. C++学习之友元类和友元函数

    C++学习之友元类和友元函数       模板类声明也可以有友元,模板的友元可以分为以下几类:        1.非模板友元:        2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...

  10. 5G关键技术研究方向

    对于还没体验4G移动通信魅力的国内的移动通信用户而言,5G也许还是镜中花,雾中月:但对于科研界而言,5G研究已经启程,三星电子5月份宣布,率先开发出了首个基于5G核心技术的移动传输网络,实现每秒1Gb ...