首页 > 代码库 > requireJS
requireJS
它很适合在浏览器中使用。使用RequireJS载入模块化脚本将提高代码的载入速度和质量。
一、CommonJS和AMD
在介绍requireJS之前。要先说一下模块规范。眼下,通行的Javascript模块规范共同拥有两种:CommonJS和AMD。
1. node.js的模块系统,就是參照CommonJS规范实现的。
var math = require(‘math‘); //载入指定模块 math.add(2,3);
2. 浏览器环境
因为一个重大的局限。使得CommonJS规范不适用于浏览器环境。
var math = require(‘math‘); //载入指定模块 math.add(2,3);第二行math.add(2, 3),在第一行require(‘math‘)之后执行。因此必须等math.js载入完毕。也就是说,假设载入时间非常长,整个应用就会停在那里等。
这对server端不是一个问题。由于全部的模块都存放在本地硬盘。能够同步载入完毕,等待时间就是硬盘的读取时间。
可是。对于浏览器,这却是一个大问题,由于模块都放在server端。等待时间取决于网速的快慢。可能要等非常长时间,浏览器处于"假死"状态。
因此。浏览器端的模块,不能採用"同步载入"(synchronous)。仅仅能採用"异步载入"(asynchronous)。这就是AMD规范诞生的背景。
3. AMD
AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它採用异步方式载入模块。模块的载入不影响它后面语句的执行。
全部依赖这个模块的语句,都定义在一个回调函数中,等到载入完毕之后,这个回调函数才会执行。
require([‘math‘], function (math) { math.add(2, 3); });眼下,主要有两个Javascript库实现了AMD规范:require.js和curl.js。
二、为什么使用requireJS
传统依次载入多个js文件。
<script src="http://www.mamicode.com/1.js"></script> <script src="http://www.mamicode.com/2.js"></script> <script src="http://www.mamicode.com/3.js"></script>缺点:
(1)载入时。浏览器会停止网页渲染;载入文件越多,网页失去响应的时间就会越长。
(2)js文件之间存在依赖关系,必须严格保证载入顺序。并且脚本的载入是同步的。
解决方式:
(1)能够使用async和deferkeyword使得载入异步,但可能因此在载入过程中丢失载入的顺序。
<script src="http://www.mamicode.com/jsFile.js" async="true"></script> <script src="http://www.mamicode.com/jsFile.js" defer></script>(2)还有一个选择是将全部的脚本捆绑打包在一起,但在捆绑的时候你仍然须要把它们依照正确的顺序排序。
(3)requireJS
- 实现js文件的异步载入,避免网页失去响应。
- 管理模块之间的依赖性,便于代码的编写和维护。
- 代码以模块化的方式组织,能够实现按需、并行、延时载入js库。
三、requireJS实现机制
RequireJS使用head.appendChild()将每个依赖载入为一个script标签。
RequireJS等待全部的依赖载入完成。计算出模块定义函数正确调用顺序,然后依次调用它们。
在同步载入的服务端JavaScript环境中,可简单地重定义require.load()来使用RequireJS。
四、requireJS的载入
<pre name="code" class="html"><script src="http://www.mamicode.com/js/require.js"></script>载这个文件。也可能造成网页失去响应,解决方法:一放到网页底部载入;二异步载入
<script src="http://www.mamicode.com/js/require.js" defer async="true"></script>
1. 主模块:data-main
require.js在载入的时候会检察data-main属性。data-main属性的作用是。指定网页程序的主模块。因为requireJS默认的文件后缀名是js,所以能够把main.js简写成main。<script src="http://www.mamicode.com/js/require.js" data-main="js/main"></script> /* main.js */ require([‘jquery‘, ‘underscore‘, ‘backbone‘], function ($, _, Backbone){ // some code here });require.js会先载入jQuery、underscore和backbone,然后再执行回调函数。主模块的代码就写在回调函数中。
2. 模块配置
使用require.config()方法,我们能够对模块的载入行为进行自己定义。能够放到require.config.js文件里。但此js必须在require.js载入后再进行载入!<script data-main="./js/main.js" src="http://www.mamicode.com/js/libs/require.js" ></script> <script src="http://www.mamicode.com/js/require.config.js"></script>
require.config({ // 全部模块的查找根路径 baseUrl: "js/lib", // paths指定各个模块的载入路径 paths: { "jquery": "jquery.min", "underscore": "underscore.min", "backbone": "backbone.min" } });
3. 定义模块:避免全局名称空间污染
require.js载入的模块,採用AMD规范。也就是说,模块必须依照AMD的规定来写。/* math.js */ define(function (){ var add = function (x,y){ return x+y; }; return { add: add }; }); /* main.js 载入方法 */ require([‘math‘], function (math){ console.log(math.add(1,2)); });
4. 载入非规范的模块:shim
理论上。require.js载入的模块。必须是依照AMD规范、用define()函数定义的模块。可是实际上。尽管已经有一部分流行的函数库(比方jQuery)符合AMD规范,很多其它的库并不符合,比方underscore和backbone这两个库。require.config({ shim: { ‘underscore‘:{ // exports值(输出的变量名)。表明这个模块外部调用时的名称 exports: ‘_‘ }, ‘backbone‘: { // deps数组,表明该模块的依赖 deps: [‘underscore‘, ‘jquery‘], exports: ‘Backbone‘ } } });
5. map: 对于给定的模块前缀,使用一个不同的模块ID来载入该模块。
requirejs.config({ map: { ‘some/newmodule‘: { ‘foo‘: ‘foo1.2‘ }, ‘some/oldmodule‘: { ‘foo‘: ‘foo1.1‘ }, ‘*‘: { ‘foo‘: ‘foo1.0‘ } } });foo1.0.js
foo1.1.js
foo1.2.js
some/newmodule.js
some/oldmodule.js
some/module.js
当“some/newmodule”调用了“require(‘foo‘)”。它将获取到foo1.2.js文件;
当“some/oldmodule”调用了“require(‘foo‘)”,它将获取到foo1.1.js;
当其它调用了“require(‘foo‘)”。它将获取到foo1.0.js
6. requireJS插件
(1)domready插件。能够让回调函数在页面DOM结构载入完毕后再执行。
require([‘domready!‘], function (doc){ // called once the DOM is ready });(2)text和image插件,则是同意require.js载入文本和图片文件。
define([ ‘text!review.txt‘, ‘image!cat.jpg‘ ], function(review,cat){ console.log(review); document.body.appendChild(cat); } );(3)json和mdown插件,用于载入json文件和markdown文件。
注意:
(1)RequireJS使用head.appendChild()将每个依赖载入为一个script标签。
(2)RequireJS等待全部的依赖载入完成,计算出模块定义函数正确调用顺序。然后依次调用它们。
(3)在同步载入的服务端JavaScript环境中,可简单地重定义require.load()来使用RequireJS。
(4)require.js要求,每一个模块是一个单独的js文件。这种话,假设载入多个模块,就会发出多次HTTP请求,会影响网页的载入速度。
因此,require.js提供了一个优化工具。当模块部署完成以后,能够用这个工具将多个模块合并在一个文件里,降低HTTP请求数。
转载请写明出处:http://blog.csdn.net/ligang2585116
requireJS