YUI模塊開發(fā)原理詳解
隨著互聯(lián)網(wǎng)應(yīng)用越來越重,js代碼越來越龐大,如何有效的去組織自己的代碼,變得非常重要。我們應(yīng)該學(xué)會(huì)去控制自己的代碼,而不是到最后一堆bug完全不知道從哪冒出來。前端的模塊化開發(fā)可以幫助我們有效的去管理代碼,特別是多人開發(fā)的時(shí)候,提高開發(fā)效率。
YUI生成模塊的方式是:
YUI.add('module1', function (Y) { ... }, '1.0.0', requires: ['module2']);
YUI 是全局變量,類似于jquery中的$。add方法中第一個(gè)參數(shù)是模塊的名稱module1,第二個(gè)參數(shù)是一個(gè)匿名函數(shù),里面是模塊內(nèi)容,第三個(gè)參數(shù)是版本名,第四個(gè)requires表示的是模塊的依賴關(guān)系,如上是module1 依賴于module2(即module2要先于module1 執(zhí)行)。
通常每個(gè)模塊存放在一個(gè)js文件中,文件以模塊名來命名,即模塊module1存放在module1.js 文件中,module2存放在mudule2.js 文件中。
加載模塊module1:
// 加載YUI seed 文件,包含了YUI所有的依賴關(guān)系
<scriptsrc="http://yui.yahooapis.com/3.13.0/build/yui/yui-min.js"></script>
<script>
YUI().use('module1', function (Y) { ... });
</script>
下面就分析下上面這行代碼會(huì)發(fā)生什么事。
1)YUI 首先會(huì)分析module1 模塊存在的依賴關(guān)系,創(chuàng)建一個(gè)URL: http://localhost:3000/yui/combo?mudule2.js&module1.js。注意module2.js 在modul1.js 前面。
2)創(chuàng)建動(dòng)態(tài)script標(biāo)簽,向服務(wù)器端請(qǐng)求js文件
var script = document.createElement('script');
script = 'http://localhost:3000/yui/combo?mudule2.js&module1.js';
if(script.readyState) {
//IE
script.onreadystatechange = function () {
if (script.readyState == "loaded" || script.readyState == "complete"){
script.onreadystatechange = null;
//預(yù)留
}
};
} else {
//非IE
script.onload = function () {
//預(yù)留
};
}
document.body.append(script);
3)服務(wù)器端檢測客戶端傳來的到請(qǐng)求,解析URL,然后開始尋找module2.js 和 module1.js 兩個(gè)js文件,并將兩個(gè)文件按順序拼成一個(gè)文件,返回給客戶端。最后傳回的js文件內(nèi)容如下:
//module2.js 中的內(nèi)容
YUI.add('module2', function (Y) { Y.module2 = {}; Y.module2.name = 'module2'; }, '1.0.0', requires: []);
//module1.js 中的內(nèi)容
YUI.add('module1', function (Y) { Y.module1 = {}; Y.module1.name = 'module1'; }, '1.0.0', requires: ['module2']);
4)客戶端接受到返回的js,開始解析,即執(zhí)行里面的YUI下的add方法,執(zhí)行過程大致如下:
YUI.modules = {};
//module2
YUI.modules.push(function (Y) { Y.module2 = {}; Y.module2.name = 'module2'; });
//module1
YUI.modules.push(function (Y) { Y.module1 = {}; Y.module1.name = 'module1'; });
5)解析完成后,自動(dòng)觸發(fā)步驟2中onload方法(IE中為onreadystatechange方法),下面是步驟2中“預(yù)留”處的代碼:
for(var i = 0, len = YUI.modules.length; i < len; i++) {
//將模塊中需要export出的api注冊(cè)在this下面;this是YUI的一個(gè)實(shí)例, this = new YUI();
YUI.modules[i](this);
}
//callback 是YUI().use 中的回掉函數(shù)
//此時(shí)模塊解析完成,傳入this參數(shù),在callback 就可以任意調(diào)用module1 和 module2 中輸出的api了
callback(this);
以上是借助YUI對(duì)模塊化開發(fā)做一個(gè)簡單的介紹,YUI實(shí)際的過程比上面要復(fù)雜的多。
相關(guān)文章
JavaScript onkeydown事件入門實(shí)例(鍵盤某個(gè)按鍵被按下)
這篇文章主要介紹了JavaScript onkeydown事件入門實(shí)例,onkeydown事件捕捉鍵盤上某個(gè)按鍵被按下的情況,需要的朋友可以參考下2014-10-10關(guān)于javascript中的parseInt使用技巧
前面好幾次遇到JavaScript中parseInt函數(shù)把字串轉(zhuǎn)為數(shù)字,前面遇到過幾次問題,然后就換其它方法進(jìn)行比較。2009-09-09深入了解JavaScript中的this關(guān)鍵字指向
這篇文章主要介紹了深入了解JavaScript中的this關(guān)鍵字指向,在大多情況下,this出現(xiàn)在函數(shù)中,this指向什么,跟函數(shù)定義的位置無關(guān),跟函數(shù)調(diào)用方式有關(guān),需要的朋友可以參考下2023-07-07JavaScript入門教程(6) Window窗口對(duì)象
他是JavaScript中最大的對(duì)象,它描述的是一個(gè)瀏覽器窗口。一般要引用它的屬性和方法時(shí),不需要用“window.xxx”這種形式,而直接使用“xxx”。一個(gè)框架頁面也是一個(gè)窗口。2009-01-01javascript scrollLeft,scrollWidth,clientWidth,offsetWidth 完全
javascript scrollLeft,scrollWidth,clientWidth,offsetWidth 完全詳解,實(shí)例修正版。2009-07-07