requireJS的学习
官方文档 http://www.requirejs.cn/
参考链接 http://www.w3cschool.cc/w3cnote/requirejs-tutorial-1.html http://www.ruanyifeng.com/blog/2012/11/require_js.html
http://www.zhihu.com/question/20351507
进入主题:
一 前奏, 让我们看一下为什么引入requireJs
JS不是一种模块化编程语言,因此呢,我们用一堆函数去实现具有特定功能的模块
function f1(){ //... }
function f2(){ //.... }
这是我们新手或者传统的做法,但是会有很多问题啦,首先,这么多函数变量,很明显污染了全局变量,说不定会和其他模块中的变量冲突呢。其次,他们之前的关系很不明确,js严格的读取顺序,多个文件互相依赖,依赖性最小的文件必须放在最前面,否则代码会报错。最后,多个js加载,若采用同步模式,无疑会影响浏览器的性能。
① 对于前者,我们有采用多层命名空间的嵌套,把模块定义为对象,这样新的命名空间解决了冲突问题
var mod = new Object({ a:0; f1:function(){} f2:function(){} });
这个做法不是很好,因为对象里面的属性我们可以随意更改,不安全
然后有了立即执行函数的方法
var mod = (function(){ a:0; var f1=function(){} var f2=function(){} return{ f1:f1; f2:f2; } })();
关于模块的知识 请看http://www.ruanyifeng.com/blog/2012/10/javascript_module.html
<script type="text/javascript" src="a.js"></script> <script type="text/javascript" src="b.js"></script> <script type="text/javascript" src="c.js"></script> <script type="text/javascript" src="d.js"></script>
③看一下加载对网页性能的影响
index.html <!DOCTYPE html> <html> <head> <script type="text/javascript" src="a.js"></script> </head> <body> <span>body</span> </body> </html> a.is (function(){ function fun1(){ alert("it works"); } fun1(); })()
CMD 规范在这里:https://github.com/seajs/seajs/issues/242
AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
类似的还有 CommonJS Modules/2.0 规范,是 BravoJS 在推广过程中对模块定义的规范化产出。
还有不少??
这些规范的目的都是为了 JavaScript 的模块化开发,特别是在浏览器端的。
目前这些规范的实现都能达成浏览器端模块化开发的目的。
区别:
1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
2. CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:
// CMD define(function(require, exports, module) { var a = require(‘./a‘) a.doSomething() // 此处略去 100 行 var b = require(‘./b‘) // 依赖可以就近书写 b.doSomething() // ... }) // AMD 默认推荐的是 define([‘./a‘, ‘./b‘], function(a, b) { // 依赖必须一开始就写好 a.doSomething() // 此处略去 100 行 b.doSomething() ... })
虽然 AMD 也支持 CMD 的写法,同时还支持将 require 作为依赖项传递,但 RequireJS 的作者默认是最喜欢上面的写法,也是官方文档里默认的模块定义写法。
3. AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹。
4. 还有一些细节差异,具体看这个规范的定义就好,就不多说了。
index.html <!DOCTYPE html> <html> <head> <script type="text/javascript" src="require.js"></script> <script type="text/javascript"> require(["a"]); </script> </head> <body> <span>body</span> </body> </html> a.js define(function(){ function fun1(){ alert("it works"); } fun1(); })
<script src="js/require.js" defer async="true" ></script>(IE支持defer 没有async) <script src="js/require.js" data-main="js/main"></script> (入口模块main.js)
define([‘myLib‘], function(myLib){ // define([依赖的模块],定义模块) function foo(){ myLib.doSomething(); } return { foo : foo }; });
require([‘jquery‘, ‘underscore‘, ‘backbone‘], function ($, _, Backbone){// require([依赖的模块], 定义函数 // some code here });
require.config({ paths: { "jquery": "lib/jquery.min", "underscore": "lib/underscore.min", "backbone": "lib/backbone.min" } });
index.html <html> <head> <title>hi test!</title> </head> <body> <p>p1</p> <p>p2</p> <script type="text/javascript" src="a.js"></script> <script src="js/require.js" data-main="js/main" defer async="true" ></script> </body> </html> main.js // main.js require.config({ paths: { "math": "math" } }); require([‘math‘], function (math){ alert(math.add(1,1)); }); math.js // math.js define(function (){ var add = function (x,y){ return x+y; }; return { add: add }; });
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。