YUI的模塊化開發

隨着互聯網應用愈來愈重,js代碼愈來愈龐大,如何有效的去組織本身的代碼,變得很是重要。咱們應該學會去控制本身的代碼,而不是到最後一堆bug徹底不知道從哪冒出來。前端的模塊化開發能夠幫助咱們有效的去管理代碼,特別是多人開發的時候,提升開發效率。javascript

這篇文章主要介紹YUI模塊化開發的原理,適合有必定基礎的朋友閱讀,若是對前端模塊化開發不是很熟的話,能夠先看看阮一峯的博文,http://www.ruanyifeng.com/blog/2012/10/javascript_module.htmlhtml

 

YUI生成模塊的方式是:前端

YUI.add('module1', function (Y) { ... }, '1.0.0', requires: ['module2']);java

YUI 是全局變量,相似於jquery中的$。add方法中第一個參數是模塊的名稱module1,第二個參數是一個匿名函數,裏面是模塊內容,第三個參數是版本名,第四個requires表示的是模塊的依賴關係,如上是module1 依賴於module2(即module2要先於module1 執行)。jquery

一般每一個模塊存放在一個js文件中,文件以模塊名來命名,即模塊module1存放在module1.js 文件中,module2存放在mudule2.js 文件中。api

加載模塊module1:服務器

// 加載YUI seed 文件,包含了YUI全部的依賴關係app

<scriptsrc="http://yui.yahooapis.com/3.13.0/build/yui/yui-min.js"></script>模塊化

<script>函數

  YUI().use('module1', function (Y) { ... });

</script>

下面就分析下上面這行代碼會發生什麼事。

1)YUI 首先會分析module1 模塊存在的依賴關係,建立一個URL: http://localhost:3000/yui/combo?mudule2.js&module1.js。注意module2.js 在modul1.js 前面。

2)建立動態script標籤,向服務器端請求js文件

  var script = document.createElement('script');

  script.src = '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;

        //預留

      } 

    };

  } else {

    //非IE

    script.onload = function () {

      //預留

    };

  }

  document.body.append(script);

3)服務器端檢測客戶端傳來的到請求,解析URL,而後開始尋找module2.js 和 module1.js 兩個js文件,並將兩個文件按順序拼成一個文件,返回給客戶端。最後傳回的js文件內容以下:

  //module2.js 中的內容

  YUI.add('module2', function (Y) { Y.module2 = {}; Y.module2.name = 'module2'; }, '1.0.0', requires: []);

  //module1.js 中的內容

  YUI.add('module1', function (Y) { Y.module1 = {}; Y.module1.name = 'module1'; }, '1.0.0', requires: ['module2']);

4)客戶端接受到返回的js,開始解析,即執行裏面的YUI下的add方法,執行過程大體以下:

  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)解析完成後,自動觸發步驟2中onload方法(IE中爲onreadystatechange方法),下面是步驟2中「預留」處的代碼:

  for(var i = 0, len = YUI.modules.length; i < len; i++) {

    //將模塊中須要export出的api註冊在this下面;this是YUI的一個實例, this = new YUI();

    YUI.modules[i](this);

  }

  //callback 是YUI().use 中的回掉函數

  //此時模塊解析完成,傳入this參數,在callback 就能夠任意調用module1 和 module2 中輸出的api了

  callback(this);

 

以上是藉助YUI對模塊化開發作一個簡單的介紹,YUI實際的過程比上面要複雜的多。想了解更多能夠看YUI官方文檔:http://yuilibrary.com/yui/docs/yui/。也能夠看看《JavaScript.Patterns》第五章 Sandbox Pattern,裏面對這種開發模式有比較詳細的介紹。

 

---------------剛開始寫博客,不少方面都不足,但願各位志同道合的朋友多提意見~

相關文章
相關標籤/搜索