SlideShare a Scribd company logo
1 of 135
Download to read offline
YUI IS SEXY
使用	 YUI Library	 作為開發基礎




              講者 - josephj

 http://www.slideshare.net/josephj/yui-is-sexy-yui
Who am I?
    ·•將近	 7	 年的前端工程師經驗

    ·•曾開發知識+、無名小站,擔
     任	 YDN	 傳教士與校園徵才。

    ·•目前任職於	 miiiCasa.com

    ·•專注	 YUI	 開發、喜好架構建
     設

    ·•Github:   josephj

    ·•Blog:   josephj.com
對於 SEXY、每個人的解讀都不一樣
對於 SEXY、每個人的解讀都不一樣
 謝謝美國 Yahoo! 的工程師 Huge Huang 提醒我要做這⼀一頁 XD
對於 SEXY、每個人的解讀都不一樣
    謝謝美國 Yahoo! 的工程師 Huge Huang 提醒我要做這⼀一頁 XD


熱情如火型
對於 SEXY、每個人的解讀都不一樣
    謝謝美國 Yahoo! 的工程師 Huge Huang 提醒我要做這⼀一頁 XD


熱情如火型




                                         高雅上流型
對於 SEXY、每個人的解讀都不一樣
    謝謝美國 Yahoo! 的工程師 Huge Huang 提醒我要做這⼀一頁 XD


熱情如火型




    嗲聲嗲氣型
                                         高雅上流型
YUI


   一黨不能獨大、媒體不能壟斷
JavaScript 函式庫當然也要多一些選擇啦
               http://www.flickr.com/photos/freestylee/5399124878/
Absolute Tower




若在意的是架構、完整性、團隊開發、軟體堆疊
   	 YUI 3 是非常	 Sexy	 的函式庫	 
               http://www.flickr.com/photos/picturenarrative/5474702933/in/pool-39804613888@N01/
Part I

Architecture
  Module / Loader / OOP
Modularization
 將功能分門別類、要用的時候挑選組合

               http://www.flickr.com/photos/bdesham/2432400623
NASA Space Station




除了樂高積木、國際太空站也是	 Modularization	 的好範例

                         http://www.flickr.com/photos/nasamarshall/4546245011/
NASA Space Station




由	 7	 個不同國家所提供的	 50	 多個模組
                   http://astronomy.wikia.com/wiki/International_Space_Station
NASA Space Station




由	 7	 個不同國家所提供的	 50	 多個模組
                   http://astronomy.wikia.com/wiki/International_Space_Station
NASA Space Station




 舉凡建築、航太、機械、硬體到軟體
   在任何分工精細的工程領域
    模組化開發是必然趨勢
「採用既有模組、避免重新打造輪子」


 由	 7	 個不同國家所提供的	 50	 多個模組
                    http://astronomy.wikia.com/wiki/International_Space_Station
最基本的	 JavaScript	 模組化
最基本的	 JavaScript	 模組化


<script src="jquery-1.7.2.js"></script>
<script src="jquery.ui.core.js"></script>
<script src="jquery.ui.widget.js"></script>
<script src="jquery.ui.accordion.js"></script>
最基本的	 JavaScript	 模組化


<script src="jquery-1.7.2.js"></script>          //	 核心函式庫
<script src="jquery.ui.core.js"></script>        //	 模組	 1
<script src="jquery.ui.widget.js"></script>      //	 模組	 2
<script src="jquery.ui.accordion.js"></script>   //	 模組	 3
最基本的	 JavaScript	 模組化


<script src="jquery-1.7.2.js"></script>          //	 核心函式庫
<script src="jquery.ui.core.js"></script>        //	 模組	 1
<script src="jquery.ui.widget.js"></script>      //	 模組	 2
<script src="jquery.ui.accordion.js"></script>   //	 模組	 3




網站發展到一定規模時、這樣做包準讓你焦頭爛額
 全域變數、維護性、前後順序、模組效率問題
    這些都是在 YUI 2 與其他主流函式庫的瓶頸
YUI 3	 架構徹底解決模組問題
YUI 3	 架構徹底解決模組問題
 2009/6	 月,YUI 推出與先前架構完全不同的 3.0	 版
解決前述全域變數、維護性、前後順序、模組效率的問題
  所有	 YUI	 模組檔案皆必須以這樣的方式包覆:
YUI 3	 架構徹底解決模組問題
 2009/6	 月,YUI 推出與先前架構完全不同的 3.0	 版
解決前述全域變數、維護性、前後順序、模組效率的問題
  所有	 YUI	 模組檔案皆必須以這樣的方式包覆:
      YUI.add("模組名稱", function (Y) {




          
      }, requires:["所需模組 1", "所需模組 2"]);  
YUI 3	 架構徹底解決模組問題
 2009/6	 月,YUI 推出與先前架構完全不同的 3.0	 版
解決前述全域變數、維護性、前後順序、模組效率的問題
  所有	 YUI	 模組檔案皆必須以這樣的方式包覆:
      YUI.add("模組名稱", function (Y) {




                                       Why callback?

                                       放到頁面上時不會立即執行、
                                       等到要用時再執行即可。好處
                                       是做程式碼的隔離、不再需要
                                       處理每個模組間的先後順序。

          
      }, requires:["所需模組 1", "所需模組 2"]);  
YUI 3	 架構徹底解決模組問題
 2009/6	 月,YUI 推出與先前架構完全不同的 3.0	 版
解決前述全域變數、維護性、前後順序、模組效率的問題
  所有	 YUI	 模組檔案皆必須以這樣的方式包覆:
 editor.js YUI.add("模組名稱", function (Y) {
                    editor




            
        }, requires:["所需模組 1", "所需模組 2"]);  
YUI 3	 架構徹底解決模組問題
 2009/6	 月,YUI 推出與先前架構完全不同的 3.0	 版
解決前述全域變數、維護性、前後順序、模組效率的問題
  所有	 YUI	 模組檔案皆必須以這樣的方式包覆:
 editor.js YUI.add("模組名稱", function (Y) {
                    editor

             // 上方的參數 Y 代表了 YUI 的 Instance
              
              function Editor() {
                  // 這是物件的建構式
              }        
              



            
        }, requires:["所需模組 1", "所需模組 2"]);  
YUI 3	 架構徹底解決模組問題
 2009/6	 月,YUI 推出與先前架構完全不同的 3.0	 版
解決前述全域變數、維護性、前後順序、模組效率的問題
  所有	 YUI	 模組檔案皆必須以這樣的方式包覆:
 editor.js YUI.add("模組名稱", function (Y) {
                    editor

             // 上方的參數 Y 代表了 YUI 的 Instance
              
              function Editor() {
                  // 這是物件的建構式
              }        
              
              // 將建構式提昇到 Global
              Y.Editor = Editor;

            
        }, requires:["所需模組 1", "所需模組 2"]);  
YUI 3	 架構徹底解決模組問題

對使用者來說,只需指定模組名稱即可使用:
YUI 3	 架構徹底解決模組問題

對使用者來說,只需指定模組名稱即可使用:


 YUI().use("editor", function (Y) {
  




     
 });
YUI 3	 架構徹底解決模組問題

對使用者來說,只需指定模組名稱即可使用:


  YUI().use("editor", function (Y) {
   
     // 此 Callback 代表所需模組皆已載入完成    
     // 你就可以直接建立 Y.Editor 的例項


      
  });
YUI 3	 架構徹底解決模組問題

對使用者來說,只需指定模組名稱即可使用:


  YUI().use("editor", function (Y) {
   
   
        // 此 Callback 代表所需模組皆已載入完成    
        // 你就可以直接建立 Y.Editor 的例項
        
        var editor = new Y.Editor();
         
     });
JavaScript 模組化的實作已是當代趨勢
JavaScript 模組化的實作已是當代趨勢


•   CommonJS 1.0
    被 nodeJS 所採用,不適合使用在瀏覽器端。
JavaScript 模組化的實作已是當代趨勢


•   CommonJS 1.0
    被 nodeJS 所採用,不適合使用在瀏覽器端。

•   CommonJS 2.0
JavaScript 模組化的實作已是當代趨勢


•   CommonJS 1.0
    被 nodeJS 所採用,不適合使用在瀏覽器端。

•   CommonJS 2.0
•   ECMAScript Module
    最期盼的!不需要 Library 即可擁有模組架構。
JavaScript 模組化的實作已是當代趨勢


•   CommonJS 1.0
    被 nodeJS 所採用,不適合使用在瀏覽器端。

•   CommonJS 2.0
•   ECMAScript Module
    最期盼的!不需要 Library 即可擁有模組架構。

•   AMD
    被 dojo、jQuery、Mootools、RequireJS
    所採用、專為瀏覽器所設計。
    為目前最夯且成熟的模組架構
    不同的 Library 間可以共享模組。
JavaScript 模組化的實作已是當代趨勢


•   CommonJS 1.0
    被 nodeJS 所採用,不適合使用在瀏覽器端。
                                       // AMD Module
•   CommonJS 2.0                       define(function () {
                                           function Editor { /* Constructor */ }
                                           return Editor;
                                       });
•   ECMAScript Module                  require(["editor"], function (Editor) {
                                           new Editor();
    最期盼的!不需要 Library 即可擁有模組架構。         });



•   AMD
    被 dojo、jQuery、Mootools、RequireJS
    所採用、專為瀏覽器所設計。
    為目前最夯且成熟的模組架構
    不同的 Library 間可以共享模組。
JavaScript 模組化的實作已是當代趨勢


•   CommonJS 1.0
    被 nodeJS 所採用,不適合使用在瀏覽器端。
                                       // AMD Module
•   CommonJS 2.0                       define(function () {
                                           function Editor { /* Constructor */ }
                                           return Editor;
                                       });
•   ECMAScript Module                  require(["editor"], function (Editor) {
                                           new Editor();
    最期盼的!不需要 Library 即可擁有模組架構。         });



•   AMD                                // YUI Module
                                       YUI.add("editor", function () {
                                           function Editor { /* Constructor */ }
    被 dojo、jQuery、Mootools、RequireJS       Y.Editor = Editor;    
    所採用、專為瀏覽器所設計。                      });
                                       YUI.use("editor", function (Y) {
    為目前最夯且成熟的模組架構                          new Y.Editor();
                                       });
    不同的 Library 間可以共享模組。
JavaScript 模組化的實作已是當代趨勢


•   CommonJS 1.0
    被 nodeJS 所採用,不適合使用在瀏覽器端。
                                       // AMD Module
•   CommonJS 2.0                       define(function () {
                                           function Editor { /* Constructor */ }
                                           return Editor;
                                       });
•   ECMAScript Module                  require(["editor"], function (Editor) {
                                           new Editor();
    最期盼的!不需要 Library 即可擁有模組架構。         });



•   AMD                                // YUI Module
                                       YUI.add("editor", function () {
                                           function Editor { /* Constructor */ }
    被 dojo、jQuery、Mootools、RequireJS       Y.Editor = Editor;    
    所採用、專為瀏覽器所設計。                      });
                                       YUI.use("editor", function (Y) {
    為目前最夯且成熟的模組架構                          new Y.Editor();
                                       });
    不同的 Library 間可以共享模組。
JavaScript 模組化的實作已是當代趨勢

         YUI Module 能做到的事與	 AMD	 都相同
•   CommonJS 1.0
     AMD	 畢竟是目前業界主流,YUI	 也在整合中
    被 nodeJS 所採用,不適合使用在瀏覽器端。
                                       // AMD Module
•    值得注意的是這樣的概念 YUI 2 年前就實作了
    CommonJS 2.0                       define(function () {
                                           function Editor { /* Constructor */ }
                                           return Editor;
                                       });
•   ECMAScript Module
        架構面的設計就是	 YUI	 的強項啊!           require(["editor"], function (Editor) {
                                           new Editor();
    最期盼的!不需要 Library 即可擁有模組架構。         });



•   AMD                                // YUI Module
                                       YUI.add("editor", function () {
                                           function Editor { /* Constructor */ }
    被 dojo、jQuery、Mootools、RequireJS       Y.Editor = Editor;    
    所採用、專為瀏覽器所設計。                      });
                                       YUI.use("editor", function (Y) {
    為目前最夯且成熟的模組架構                          new Y.Editor();
                                       });
    不同的 Library 間可以共享模組。
JavaScript 模組化的實作已是當代趨勢

         YUI Module 能做到的事與	 AMD	 都相同
•   CommonJS 1.0
     AMD	 畢竟是目前業界主流,YUI	 也在整合中
    被 nodeJS 所採用,不適合使用在瀏覽器端。
                                       // AMD Module
•    值得注意的是這樣的概念 YUI 2 年前就實作了
    CommonJS 2.0                       define(function () {
                                           function Editor { /* Constructor */ }
                                           return Editor;
                                       });
•   ECMAScript Module
        架構面的設計就是	 YUI	 的強項啊!           require(["editor"], function (Editor) {
                                           new Editor();
    最期盼的!不需要 Library 即可擁有模組架構。         });



•   AMD
      但模組化的有會導致檔案被拆得更多更細{
                  // YUI Module
                  YUI.add("editor", function ()
                                           function Editor { /* Constructor */ }
    被 dojo、jQuery、Mootools、RequireJS       Y.Editor = Editor;    
             那我們如何有效率地載入模組呢	 ?
    所採用、專為瀏覽器所設計。                      });
                                       YUI.use("editor", function (Y) {
    為目前最夯且成熟的模組架構                          new Y.Editor();
                                       });
    不同的 Library 間可以共享模組。
Loader
有效率地載入所需要的的 CSS 與 JavaScript 檔案


                       http://www.flickr.com/photos/bdesham/2432400623
網站在初期、所需的 JavaScript 與	 CSS	 都很小




                   http://www.flickr.com/photos/halfbisqued/2353845688/
網站在初期、所需的 JavaScript 與	 CSS	 都很小




               jQuery - 32K




                          http://www.flickr.com/photos/halfbisqued/2353845688/
網站在初期、所需的 JavaScript 與	 CSS	 都很小




                                   jQuery - 32K




<script src="http://code.jquery.com/jquery-1.4.2.min.js"></script> 就可做很多事!


                                              http://www.flickr.com/photos/halfbisqued/2353845688/
發展到一定規模,該如何選擇每頁所需的檔案呢?




模組化會切分出很多檔案,如何黏在⼀一起是⼀一門學問
               http://www.nipic.com/show/2/55/d96dde66860c5190.html
發展到一定規模,該如何選擇每頁所需的檔案呢?


              天哪!我該如何處理
             這麼多的 CSS / JS 檔案?




模組化會切分出很多檔案,如何黏在⼀一起是⼀一門學問
                  http://www.nipic.com/show/2/55/d96dde66860c5190.html
發展到一定規模,該如何選擇每頁所需的檔案呢?


              天哪!我該如何處理
             這麼多的 CSS / JS 檔案?




模組化會切分出很多檔案,如何黏在⼀一起是⼀一門學問
                  http://www.nipic.com/show/2/55/d96dde66860c5190.html
發展到一定規模,該如何選擇每頁所需的檔案呢?


              天哪!我該如何處理
             這麼多的 CSS / JS 檔案?



   較不專業的網站在面對這樣的問題
 都是純手工一頁一頁寫、或者是打成一大包
 得考慮先後順序、維護性低、也無法最佳化




模組化會切分出很多檔案,如何黏在⼀一起是⼀一門學問
                  http://www.nipic.com/show/2/55/d96dde66860c5190.html
這時需要一個	 Loader	 機制
協助載入零散且多的模組檔案




             http://www.flickr.com/photos/billjacobus1/123644872/
以	 YUI DataTable	 為範例	 (datatable)
以	 YUI DataTable	 為範例	 (datatable)
以	 YUI DataTable	 為範例	 (datatable)

                   不	 reload	 的行為很多:換
                   頁、排序、直接編輯。也可
                   以有各種資料來源,是個很
                   複雜的模組。
只要幾行程式碼就可以載入所需模組
只要幾行程式碼就可以載入所需模組


<script src="http://yui.yahooapis.com/3.5.0/build/yui/yui-min.js"></script>
只要幾行程式碼就可以載入所需模組


<script src="http://yui.yahooapis.com/3.5.0/build/yui/yui-min.js"></script>
<script>
YUI().use('datatable', function (Y) {

    
    

});

</script>
只要幾行程式碼就可以載入所需模組


<script src="http://yui.yahooapis.com/3.5.0/build/yui/yui-min.js"></script>
<script>
YUI().use('datatable', function (Y) {

    
    alert(Y.DataTable);

});

</script>



            能想像 6 行程式碼背後、做了多少事嗎 ?
計算 requires 模組的過程




      yui (Seed)
計算 requires 模組的過程




      yui (Seed)   YUI().use('datatable')
計算 requires 模組的過程




datatable-core      datatable-head       datatable-body

                 base-build     widget



                       yui (Seed)    YUI().use('datatable')
計算 requires 模組的過程




escape         node-base       base-plugin-host     node-style

  model-list       base-base      event-focus        view

node-event-delegate         classnamemanager        attribute



datatable-core       datatable-head          datatable-body

                  base-build        widget



                           yui (Seed)   YUI().use('datatable')
計算 requires 模組的過程

arraylist   yui-base      pluginhost        event-synthetic        attribute-core        attribute-events

model       event-delegate       attribute-extras        array-extras     array-invoke       json-parse



                 escape         node-base        base-plugin-host       node-style

                   model-list       base-base       event-focus          view

                 node-event-delegate         classnamemanager           attribute



                  datatable-core       datatable-head           datatable-body

                                    base-build        widget



                                            yui (Seed)     YUI().use('datatable')
計算 requires 模組的過程
            與載入順序無關、YUI Module	 在設計上是不需考慮先後順序的

arraylist   yui-base      pluginhost        event-synthetic        attribute-core        attribute-events

model       event-delegate       attribute-extras        array-extras     array-invoke       json-parse



                 escape         node-base        base-plugin-host       node-style

                   model-list       base-base       event-focus          view

                 node-event-delegate         classnamemanager           attribute



                  datatable-core       datatable-head           datatable-body

                                    base-build        widget



                                            yui (Seed)     YUI().use('datatable')
強大的壓縮機 Combo Handler
     YUI().use('datatable')
強大的壓縮機 Combo Handler
         YUI().use('datatable')



前一頁只列出了 28 個模組,但實際上會有	 64	 個
強大的壓縮機 Combo Handler
          YUI().use('datatable')



 前一頁只列出了 28 個模組,但實際上會有	 64	 個
64	 個模組就代表了	 64	 個檔案、	 你可能會覺得很誇張
強大的壓縮機 Combo Handler
          YUI().use('datatable')



 前一頁只列出了 28 個模組,但實際上會有	 64	 個
64	 個模組就代表了	 64	 個檔案、	 你可能會覺得很誇張
 但模組化就是要把不相干的程式抽離、盡可能精簡
強大的壓縮機 Combo Handler
          YUI().use('datatable')



 前一頁只列出了 28 個模組,但實際上會有	 64	 個
64	 個模組就代表了	 64	 個檔案、	 你可能會覺得很誇張
 但模組化就是要把不相干的程式抽離、盡可能精簡
即使採用	 LABjs	 這樣平行載入的方式,數量仍嫌太多
強大的壓縮機 Combo Handler
           YUI().use('datatable')



 前一頁只列出了 28 個模組,但實際上會有	 64	 個
64	 個模組就代表了	 64	 個檔案、	 你可能會覺得很誇張
 但模組化就是要把不相干的程式抽離、盡可能精簡
即使採用	 LABjs	 這樣平行載入的方式,數量仍嫌太多
YUI	 的	 Combo Handler	 可把數量的問題徹底解決
強大的壓縮機 Combo Handler
               YUI().use('datatable')



 前一頁只列出了 28 個模組,但實際上會有	 64	 個
64	 個模組就代表了	 64	 個檔案、	 你可能會覺得很誇張
 但模組化就是要把不相干的程式抽離、盡可能精簡
即使採用	 LABjs	 這樣平行載入的方式,數量仍嫌太多
YUI	 的	 Combo Handler	 可把數量的問題徹底解決
    http://yui.yahooapis.com/combo?
                 <模組1的檔案路徑>&
                 <模組2的檔案路徑>&
                 <模組3的檔案路徑>&
                 <模組4的檔案路徑>&
                  ...
載入的方式是最流行的非同步平行下載
     YUI().use('datatable')
載入的方式是最流行的非同步平行下載
             YUI().use('datatable')


你所引用的	 YUI Seed
載入的方式是最流行的非同步平行下載
             YUI().use('datatable')


你所引用的	 YUI Seed



                     先載入相關	 CSS
載入的方式是最流行的非同步平行下載
             YUI().use('datatable')


你所引用的	 YUI Seed



                     先載入相關	 CSS	 




將所需	 JavaScript Modules	 分散成 3 個請求、平行下載
載入的方式是最流行的非同步平行下載
                 YUI().use('datatable')


你所引用的	 YUI Seed



                         先載入相關	 CSS	 




將所需	 JavaScript Modules	 分散成 3 個請求、平行下載
分散的邏輯:「檔案總數量」、「瀏覽器同時請求數量」、「瀏覽器	 GET	 長度的限制」
       自己用	 Loader (LABjs、Headjs) 刻這樣的機制會很辛苦
YUI().use('datatable')
從種子變成大樹只花了	 323 ms

YUI().use('datatable')




                         323ms
從種子變成大樹只花了	 323 ms

YUI().use('datatable')




                         323ms




     是一棵完全沒有贅肉的大樹、因	 Module	 的切分非常的細、用不到的絕不載入
同時符合了大型網站對於效能最佳化的考慮、在使用層面也非常容易(你只需知道模組名稱)
YUI 自動載入函式庫的方式實在太 Sexy 了




   The creator of jQuery



John Resig
                           http://www.quora.com/How-could-YUI3-improve-its-image-compared-to-jQuery-MooTools-etc
YUI 自動載入函式庫的方式實在太 Sexy 了

                           YUI().use() + pulling code off of Yahoo's CDN is
                           damn sexy and should be promoted *VERY*
                           heavily.




   The creator of jQuery



John Resig
                                  http://www.quora.com/How-could-YUI3-improve-its-image-compared-to-jQuery-MooTools-etc
Loader	 改版
Loader	 改版
頁面 index.php
Loader	 改版
頁面 index.php                     1.在頁面上呼叫:
模組
                                   YUI().use(“_header”,“_nav”,“_content”
         _header                   ,“_footer”);

模組             模組



 _nav           _content


模組


          _footer
Loader	 改版
頁面 index.php                               1.在頁面上呼叫:
模組
                                           YUI().use(“_header”,“_nav”,“_content”
           _header                         ,“_footer”);
               requires:[a,c,e]

模組                 模組                      2.每個模組都已經各自設定所需	 
                                           require	 的模組。
 _nav                  _content
requires:[b]            requires:[a,b,c]



模組


                _footer
               requires:[d, e, f]
Loader	 改版
頁面 index.php                               1.在頁面上呼叫:
模組
                                            YUI().use(“_header”,“_nav”,“_content”
           _header                          ,“_footer”);
               requires:[a,c,e]

模組                 模組                      2.每個模組都已經各自設定所需	 
                                            require	 的模組。
 _nav                  _content
requires:[b]            requires:[a,b,c]   3.YUI	 的	 Loader	 會自動計算實際
                                            要載入的模組有哪些。
模組


                _footer
               requires:[d, e, f]


Loader
  	 	 	 	 	 	 	 	 	 	 	 	 	 	 共有這些模組要載入:
 g, h, j, l, m, u, y, a, b, c, d, e, f,
_header, _nav, _content, _footer
Loader	 改版
頁面 index.php                               1.在頁面上呼叫:
模組
                                            YUI().use(“_header”,“_nav”,“_content”
           _header                          ,“_footer”);
               requires:[a,c,e]

模組                 模組                      2.每個模組都已經各自設定所需	 
                                            require	 的模組。
 _nav                  _content
requires:[b]            requires:[a,b,c]   3.YUI	 的	 Loader	 會自動計算實際
                                            要載入的模組有哪些。
模組


                _footer                    4.最後利用	 Combo	 以非同步的方
               requires:[d, e, f]
                                            式把檔案下載回來。
Loader
  	 	 	 	 	 	 	 	 	 	 	 	 	 	 共有這些模組要載入:      combo request 1
 g, h, j, l, m, u, y, a, b, c, d, e, f,
_header, _nav, _content, _footer
                                              combo request 2   Server
                                              combo request 3
啟發:	 	 	 	 	 	 	 	 	 	 	 	 	 Loader	 改版
頁面 index.php                               1.在頁面上呼叫:
模組
                                           YUI().use(“_header”,“_nav”,“_content”
            _header                        ,“_footer”);
            requires:[a,c,e]

 Page-Level	 的設定是中央集權、最後會搞不清楚
模組    模組        2.每個模組都已經各自設定所需	 
                               require	 的模組。
 _nav由	 Module-Level	 設定是地方自治、很好管理
             _content
requires:[b] requires:[a,b,c]
透過相依性計算、自動合併、非同步下載等機制達成       3.YUI	 的	 Loader	 會自動計算實際
                               要載入的模組有哪些。
 模組                    讓模組真正做到可以隨插即用	 
             _footer                       4.最後利用	 Combo	 以非同步的方
            requires:[d, e, f]
                                           式把檔案下載回來。
                             實作範例: http://josephj.com/lab/2012/loader-strategy/demo.php
Loader
                                原始碼: https://github.com/josephj/loader-strategy
   	 	 	 	 	 	 	 	 	 	 	 	 	 	 共有這些模組要載入:             combo request 1
  g, h, j, l, m, u, y, a, b, c, d, e, f,
 _header, _nav, _content, _footer
                                             combo request 2         Server
                                             combo request 3
YUI Architecture Rocks!

             Module   領先業界的思維
                      ⼀一定會越拆越細

             Loader   領先業界的思維
                      Combo 的機制比 Build 好

             Combo    軟體自動化的極致
                      可用 Minify 或 combohandler 代替

              CDN     善用大公司的資源吧
                      有錢才會有




不需辛苦實作、幾行就可以寫出業界的 Best Practice
      YUI	 還有什麼值得我們參考的	 ?
                      http://www.flickr.com/photos/kelvin255/5576672521/
OOP



 Object-oriented
  Programming
概念人人都有,但如何實作?有好的架構與工具嗎?

                    http://www.zeegee.com/courses/oop-1
將表單驗證包裝成	 Y.FormValidator	 後...
將表單驗證包裝成	 Y.FormValidator	 後...

             檔案名稱 實際作用           未用	 OOP     使用	 OOP

  _account_identity.js    變更帳號   共 356 行   共 200 行 (-44%)

_account_password.js      更改密碼   共 355 行   共 221 行 (-38%)

  _profile_edit_info.js   修改資料   共 454 行   共 292 行 (-36%)
將表單驗證包裝成	 Y.FormValidator	 後...

             檔案名稱 實際作用           未用	 OOP     使用	 OOP

  _account_identity.js    變更帳號   共 356 行   共 200 行 (-44%)

_account_password.js      更改密碼   共 355 行   共 221 行 (-38%)

  _profile_edit_info.js   修改資料   共 454 行   共 292 行 (-36%)



             程式碼總行數至少都減少 35% 以上
   寫法功能變得一致、有	 Bug	 可一起處理、提昇品質
                     效果可謂是立竿見影	 !
將表單驗證包裝成	 Y.FormValidator	 後...

             檔案名稱 實際作用           未用	 OOP     使用	 OOP

  _account_identity.js    變更帳號   共 356 行   共 200 行 (-44%)

_account_password.js      更改密碼   共 355 行   共 221 行 (-38%)

  _profile_edit_info.js   修改資料   共 454 行   共 292 行 (-36%)



             程式碼總行數至少都減少 35% 以上
   寫法功能變得一致、有	 Bug	 可一起處理、提昇品質
                     效果可謂是立竿見影	 !
將表單驗證包裝成	 Y.FormValidator	 後...

            物件導向的好處:
            檔案名稱 實際作用 未用	 OOP              使用	 OOP

 _account_identity.js   變更帳號   共 356 行   共 200 行 (-44%)
              ·•避免撰寫相同的代碼
_account_password.js 更改密碼     共 355 行    共 221 行 (-38%)
              ·•縮短開發時間
   _profile_edit_info.js 修改資料 共 454 行    共 292 行 (-36%)
              ·•減少團隊開發的不一致

            程式碼總行數至少都減少 35% 以上
            應被大量地運用在開發中
   寫法功能變得一致、有	 Bug	 可一起處理、提昇品質
                   效果可謂是立竿見影	 !
使用原生的	 JavaScript	 撰寫	 OOP	 令人挫折


Constructor
function Car(brand, color) {
    this.brand = brand;
    this.color = color;
    this.miles = 0;
}
Car.prototype.run = function () {
    var i = 0;
    var timer = setInterval(1000, function() {
        if (i >= 10) clearInterval(timer);
        this.miles += 1;
        i += 1;
    });
};
使用原生的	 JavaScript	 撰寫	 OOP	 令人挫折


Constructor
function Car(brand, color) {
    this.brand = brand; // 廠牌,只能寫⼀一次。
    this.color = color; // 顏色,只能寫⼀一次。
    this.miles = 0;     // 里程數,必須是唯讀。
}
Car.prototype.run = function () {
    var i = 0;
    var timer = setInterval(1000, function() {
        if (i >= 10) clearInterval(timer);
        this.miles += 1;
        i += 1;
    });
};
使用原生的	 JavaScript	 撰寫	 OOP	 令人挫折


Constructor                                      Instance
function Car(brand, color) {                     var oCar   = new Car(‘ford’, ‘black’);
    this.brand = brand; // 廠牌,只能寫⼀一次。            oCar.brand = 'Honda';
    this.color = color; // 顏色,只能寫⼀一次。            oCar.miles = '1公里';
    this.miles = 0;     // 里程數,必須是唯讀。            oCar.run();
}
Car.prototype.run = function () {
    var i = 0;
    var timer = setInterval(1000, function() {
        if (i >= 10) clearInterval(timer);
        this.miles += 1;
        i += 1;
    });
};
使用原生的	 JavaScript	 撰寫	 OOP	 令人挫折


Constructor                                      Instance
function Car(brand, color) {                     var oCar   = new Car(‘ford’, ‘black’);
    this.brand = brand; // 廠牌,只能寫⼀一次。            oCar.brand = 'Honda'; // 不應被改寫
    this.color = color; // 顏色,只能寫⼀一次。            oCar.miles = '1公里'; // 天兵使用者亂改 :p
    this.miles = 0;     // 里程數,必須是唯讀。            oCar.run();           // 車子何時停?
}
Car.prototype.run = function () {
    var i = 0;
    var timer = setInterval(1000, function() {
        if (i >= 10) clearInterval(timer);
        this.miles += 1;
        i += 1;
    });
};




                如何保護屬性不被濫用	 ? 如何利用事件	 ?
Framework 就是應該帶你脫離原始!
YUI OOP -	 內建屬性封裝
YUI OOP -	 內建屬性封裝
Constructor (Part)
Car.ATTRS = {
    “brand”: {
        value: null,
        writeOnce: true // 設定只能寫入⼀一次
    },
    “color”: {
        value: null,
        writeOnce: true  // 設定只能寫入⼀一次
    },
    “miles”: {
        value: 0,
        readOnly: true  // 設定只能讀取、不能寫入
    }
} ;
YUI OOP -	 內建屬性封裝
Constructor (Part)
Car.ATTRS = {
    “brand”: {
        value: null,
        writeOnce: true // 設定只能寫入⼀一次
    },
    “color”: {
        value: null,
        writeOnce: true  // 設定只能寫入⼀一次
    },
    “miles”: {
        value: 0,
        readOnly: true  // 設定只能讀取、不能寫入
    }
} ;

Instance
var oCar = new Car({
    brand: “Ford”,
    color: “black”
});

oCar.set(“miles”, 100);     // return false;
oCar.set(“brand”, “Honda”); // return false;
oCar.set(“color”, “white”); // return false;
YUI OOP -	 內建屬性封裝
Constructor (Part)
Car.ATTRS = {
    “brand”: {
        value: null,
        writeOnce: true // 設定只能寫入⼀一次
    },
    “color”: {
        value: null,
        writeOnce: true  // 設定只能寫入⼀一次
    },
    “miles”: {
        value: 0,
        readOnly: true  // 設定只能讀取、不能寫入
    }
} ;

Instance
var oCar = new Car({
    brand: “Ford”,
    color: “black”
});
                       可有效防止使用者不當操作

oCar.set(“miles”, 100);     // return false;
oCar.set(“brand”, “Honda”); // return false;
oCar.set(“color”, “white”); // return false;
YUI OOP -	 內建屬性封裝
Constructor (Part)
Car.ATTRS = {
    “brand”: {
        value: null,                           ·• validator	 -   驗證使用者輸入值
        writeOnce: true // 設定只能寫入⼀一次
    },                                         ·• writeOnce	 -   只能寫入一次
    “color”: {
                                               ·• readOnly	 -    唯讀
        value: null,
        writeOnce: true  // 設定只能寫入⼀一次          ·• value	 -   預設值
    },
    “miles”: {                                 ·• valueFn	 -   預設值	 (以	 Function	 取得)
        value: 0,
        readOnly: true  // 設定只能讀取、不能寫入
                                               ·• setter	 -   使用者	 set	 時所使用的	 Function
    }
                                               ·• getter	 -   使用者	 get	 時所使用的	 Function
} ;

Instance
var oCar = new Car({
    brand: “Ford”,
    color: “black”
});
                       可有效防止使用者不當操作

oCar.set(“miles”, 100);     // return false;
oCar.set(“brand”, “Honda”); // return false;
oCar.set(“color”, “white”); // return false;
YUI OOP -	 內建屬性封裝
Constructor (Part)
Car.ATTRS = {
    “brand”: {
        value: null,                           ·• validator	 -   驗證使用者輸入值
        writeOnce: true // 設定只能寫入⼀一次
    },                                         ·• writeOnce	 -   只能寫入一次
    “color”: {
                                               ·• readOnly	 -    唯讀
        value: null,
        writeOnce: true  // 設定只能寫入⼀一次          ·• value	 -   預設值
    },
    “miles”: {                                 ·• valueFn	 -   預設值	 (以	 Function	 取得)
        value: 0,
        readOnly: true  // 設定只能讀取、不能寫入
                                               ·• setter	 -   使用者	 set	 時所使用的	 Function
    }
                                               ·• getter	 -   使用者	 get	 時所使用的	 Function
} ;

Instance
var oCar = new Car({
    brand: “Ford”,
                                                                 屬性管理是	 
    color: “black”
});
                       可有效防止使用者不當操作
                                                             JavaScript OOP	 
oCar.set(“miles”, 100);     // return false;
oCar.set(“brand”, “Honda”); // return false;
                                                               最基本的項目
oCar.set(“color”, “white”); // return false;
YUI OOP - 內建自訂事件
YUI OOP - 內建自訂事件

Constructor
Y.extend(Car, Y.Base, {
    run: function () {
        var i = 0,
            timer;
        timer = setInterval(1000, function() {
            if (i >= 10){
               clearInterval(timer);
               this.fire(“stop”, this.miles);
            }
            this.miles += 1;
            i += 1;
       });
    }
};
YUI OOP - 內建自訂事件

Constructor                                      Instance
Y.extend(Car, Y.Base, {                          oCar = new Car();
    run: function () {                           oCar.on(“stop”, function (e) {
        var i = 0,                                   alert(e.detail.miles);
            timer;                               });
        timer = setInterval(1000, function() {   oCar.run();
            if (i >= 10){
               clearInterval(timer);
               this.fire(“stop”, this.miles);
            }
            this.miles += 1;
            i += 1;
       });
    }
};
YUI OOP - 內建自訂事件

 Constructor                                      Instance
 Y.extend(Car, Y.Base, {                          oCar = new Car();
     run: function () {                           oCar.on(“stop”, function (e) {
         var i = 0,                                   alert(e.detail.miles);
             timer;                               });
         timer = setInterval(1000, function() {   oCar.run();
             if (i >= 10){
                clearInterval(timer);
                this.fire(“stop”, this.miles);
             }
             this.miles += 1;
             i += 1;
        });
     }
 };




    任何地方都可以用	 fire	 觸發事件、用	 on	 監聽事件
JavaScript	 最讚的地方就是事件驅動!別再用	 callback	 啦!
YUI	 元件架構
YUI	 元件架構
            Base - 沒有介面、純粹是 API 的存取。
YUI	 元件架構
            Base - 沒有介面、純粹是 API 的存取。
            Widget - 有介面、新的使用者控制項。
YUI	 元件架構
            Base - 沒有介面、純粹是 API 的存取。
            Widget - 有介面、新的使用者控制項。
            Plugin - 針對	 Instance	 擴充。
YUI	 元件架構
            Base - 沒有介面、純粹是 API 的存取。
            Widget - 有介面、新的使用者控制項。
            Plugin - 針對	 Instance	 擴充。
            Extension - 針對	 Class	 擴充。
YUI	 元件架構
            Base - 沒有介面、純粹是 API 的存取。
            Widget - 有介面、新的使用者控制項。
            Plugin - 針對	 Instance	 擴充。
            Extension - 針對	 Class	 擴充。




YUI	 的元件架構是個開發物件導向的框架
考慮了事件、屬性、擴充性、漸進式支援
  一旦上手可以很快產出好用的元件
YUI	 元件架構
            Base - 沒有介面、純粹是 API 的存取。
            Widget - 有介面、新的使用者控制項。
            Plugin - 針對	 Instance	 擴充。
            Extension - 針對	 Class	 擴充。

             YUI	 提供了很多擴充性的選項、
             避免開發者因為功能不足去改既
             有的程式,extend、plugin、
             extension	 都是好方法!


YUI	 的元件架構是個開發物件導向的框架
考慮了事件、屬性、擴充性、漸進式支援
  一旦上手可以很快產出好用的元件
Extend, Don’t Hack.
 From “Why YUI?” by Derek Gathright
miiiCasa	 利用	 YUI OOP	 所包裝的物件

•   Scroll Pagination 像 Twitter 或 Facebook 捲動讀取更多資料
    https://github.com/miiicasa/scroll-pagination

•   Editable 直接修改資料
    https://github.com/miiicasa/yui3-editable

•   Placeholder 相容於所有瀏覽器的 Form Placeholder
    https://github.com/miiicasa/yui3-placeholder

•   CrossFrame 相容於所有瀏覽器的 HTML5 postMessage
    https://github.com/miiicasa/yui3-crossframe

•   Module Platform 跨模組溝通的架構
    https://github.com/josephj/javascript-platform-yui
Part 2

Completeness
    Tools
前端工程師要整合的東西實在太多
前端工程師要整合的東西實在太多

                          MVC
     Core
                 CSS Grid
   (DOM / Event / AJAX)


         Document
Automation         Unit Test
           Build Server
    Loader              Minify
OOP        pJAX I18N
   Module
           Debug Template
前端工程師要整合的東西實在太多

                          MVC
     Core
                 CSS Grid
   (DOM / Event / AJAX)
                          Backbone.js


         jQuery
         Document                                  960gs



Automation         Unit TestNature Docs



           Build Server
    TestSwarm



    Loader                  Optimizer

                        Minify                nodeJS



OOP        pJAX I18N
             LABjs
                                                               Google Closure

                           jquery-pjax

   Module                                 Key / Value :p


           Debug Template
         RequireJS

                              console
                                                  handlebars
前端工程師要整合的東西實在太多

                          MVC
     Core
                 CSS Grid
   (DOM / Event / AJAX)
                          Backbone.js


         jQuery
         Document                                  960gs



Automation         Unit TestNature Docs



           Build Server
    TestSwarm



    Loader                  Optimizer

                        Minify                nodeJS



OOP        pJAX I18N
             LABjs
                                                               Google Closure

                           jquery-pjax

   Module                                 Key / Value :p


           Debug Template
         RequireJS

                              console
                                                  handlebars




得花很多時間比較、研究不同選擇的差異性
YUI 提供了全方位的服務

                    Core                          MVC
                 (DOM / Event / AJAX)

               Y.Node / Y.Event / Y.IO
                                            Y.Model / Y.View / Y.Router
                                                                                CSS Grid
                                            Document                                        CSS Grids



        Automation                                     Unit Test
                                                           yuidocjs

                          yeti
                                            Build Server                                           Y.Test




  OOP Loader
                                               YUI Build                YUI in nodejs

                                                                                              Minify
 Y.Attribute / Y.Base /
  Y.Widget / Y.Plugin
                                 Y.Loader
                                             pJAX                       I18N                   YUI Compressor

                                                   Y.Pjax
                      Module                                          Y.Intl / Y.DataType


                           YUI.add()        Debug Template
                                                Y.Log()                        Y.Handlebars




使用 YUI 的話,就不用想太多啦、該有的都⼀一定有!
yuidocjs
從註解產生 API 文件


    nodeJS
markdown syntax
handlebars helper

    介面親和
 所有程式語言皆支援
yuidocjs - 從註解產生 API 文件




http://miiicasa.github.com/yui3-editable/classes/Editable.html
支援多國語系
依語系格式化日期
YUI({lang:"zh-Hant-TW"}).use("datatype-date", function(Y) {
    var dateString = Y.DataType.Date.format(new Date(), {format:"%x %X"});
    alert(dateString); // 12/05/17 上午12時32分33秒
});


Calendar	 控制項
YUI({lang:"zh-Hant-TW"}).use("calendar", function(Y) {
      new Y.Calendar();
});



翻譯也是	 Module
對軟體開發很有價值的工具
            Unit Test
          撰寫 JavaScript 的 Test Case

          Automation
     Yeti - 以 nodeJS 所建立的自動化測試流程


          YUI in Node
可以在 nodeJS 中使用 YUI、即使把瀏覽器的 JS 關掉也能用


                 MVC
    JavaScript 的 MVC 架構、沿襲自 Backbone.js

                Y.log()
  很基本的功能、但訊息⼀一多要關閉某些來源很方便

         AsyncQueue
            非同步處理的管理機制
YUI 著重於開發架構的處理
解決中大型應用程式及開發團隊實際所遭遇的問題
 並不只是單單一個 JavaScript Framework
對大型網站應用程式,YUI 完全勝出
For scalable web applications,YUI really excels.




                                                     Former Principal Front End Engineer, Yahoo!



                                          Nicholas Zakas
                                   http://www.nczonline.net/blog/2010/11/03/response-to-john-resigs-comments-about-yui/
miiiCasa Needs Your Join!!
歡迎對軟硬體結合、私有雲、Web 3.0、家庭的	 SNS	 等概念有興趣的同學加入!




         更多內容: http://tinyurl.com/miiicasa-f2e
Contact Me: josephj6802[at]gmail.com
Thank you for listening!
     Contact Me: josephj6802[at]gmail.com
參考連結
                         NFL.com
                     從 Prototype 換到 YUI
   http://www.yuiblog.com/blog/2012/01/17/video-yuiconf2011-rcannon/



Derek Gathright - Why YUI?
                       從	 jQuery	 改用	 YUI
  http://www.yuiblog.com/blog/2012/01/30/video-yuiconf2011-dgathright/
                 http://dsheiko.com/weblog/yui3-vs-jquery

  jQuery vs. YUI 引发的思考
                 對	 2	 個	 Library	 中肯的評論
       http://hikejun.com/blog/2010/11/07/jquery-vs-yui引发的思考/



      From jQuery to YUI
                           比較兩者的語法
  http://clayliao.blogspot.com/2012/04/yui-3-tutorial-from-yui-to-jquery.html

More Related Content

Viewers also liked

模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京Joseph Chiang
 
YUI Library Workshop (Yahoo! Course at NCU)
YUI Library Workshop (Yahoo! Course at NCU)YUI Library Workshop (Yahoo! Course at NCU)
YUI Library Workshop (Yahoo! Course at NCU)Joseph Chiang
 
Yahoo! Open Technologies @NCU
Yahoo! Open Technologies @NCUYahoo! Open Technologies @NCU
Yahoo! Open Technologies @NCUJoseph Chiang
 
From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)Joseph Chiang
 
Git - The Social Coding System
Git - The Social Coding SystemGit - The Social Coding System
Git - The Social Coding SystemJoseph Chiang
 
Debugging - 前端工程開發實務訓練
 Debugging - 前端工程開發實務訓練 Debugging - 前端工程開發實務訓練
Debugging - 前端工程開發實務訓練Joseph Chiang
 
Automatic Functional Testing with Selenium and SauceLabs
Automatic Functional Testing with Selenium and SauceLabsAutomatic Functional Testing with Selenium and SauceLabs
Automatic Functional Testing with Selenium and SauceLabsJoseph Chiang
 
YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練Joseph Chiang
 
Yahoo! 奇摩關鍵字廣告聯播網
Yahoo! 奇摩關鍵字廣告聯播網Yahoo! 奇摩關鍵字廣告聯播網
Yahoo! 奇摩關鍵字廣告聯播網Joseph Chiang
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Joseph Chiang
 
Javascript 入門 - 前端工程開發實務訓練
Javascript 入門 - 前端工程開發實務訓練Javascript 入門 - 前端工程開發實務訓練
Javascript 入門 - 前端工程開發實務訓練Joseph Chiang
 

Viewers also liked (14)

模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京
 
Semantic HTML Basic
Semantic HTML BasicSemantic HTML Basic
Semantic HTML Basic
 
BBAuth
BBAuthBBAuth
BBAuth
 
YUI Library Workshop (Yahoo! Course at NCU)
YUI Library Workshop (Yahoo! Course at NCU)YUI Library Workshop (Yahoo! Course at NCU)
YUI Library Workshop (Yahoo! Course at NCU)
 
Yahoo! Open Technologies @NCU
Yahoo! Open Technologies @NCUYahoo! Open Technologies @NCU
Yahoo! Open Technologies @NCU
 
From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)
 
Git - The Social Coding System
Git - The Social Coding SystemGit - The Social Coding System
Git - The Social Coding System
 
Debugging - 前端工程開發實務訓練
 Debugging - 前端工程開發實務訓練 Debugging - 前端工程開發實務訓練
Debugging - 前端工程開發實務訓練
 
Automatic Functional Testing with Selenium and SauceLabs
Automatic Functional Testing with Selenium and SauceLabsAutomatic Functional Testing with Selenium and SauceLabs
Automatic Functional Testing with Selenium and SauceLabs
 
YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練
 
Yahoo! 奇摩關鍵字廣告聯播網
Yahoo! 奇摩關鍵字廣告聯播網Yahoo! 奇摩關鍵字廣告聯播網
Yahoo! 奇摩關鍵字廣告聯播網
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練
 
JavaScript Promise
JavaScript PromiseJavaScript Promise
JavaScript Promise
 
Javascript 入門 - 前端工程開發實務訓練
Javascript 入門 - 前端工程開發實務訓練Javascript 入門 - 前端工程開發實務訓練
Javascript 入門 - 前端工程開發實務訓練
 

Similar to YUI is Sexy (for JSDC.tw)

Kissy design
Kissy designKissy design
Kissy designyiming he
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejsChi-wen Sun
 
Yui rocks
Yui rocksYui rocks
Yui rocksAdam Lu
 
Js高级技巧
Js高级技巧Js高级技巧
Js高级技巧fool2fish
 
YUI介绍和使用YUI构建web应用
YUI介绍和使用YUI构建web应用YUI介绍和使用YUI构建web应用
YUI介绍和使用YUI构建web应用Adam Lu
 
Node js实践
Node js实践Node js实践
Node js实践myzykj
 
Kindeditor 设计思路
Kindeditor 设计思路Kindeditor 设计思路
Kindeditor 设计思路luolonghao
 
JavaScript Code Quality
JavaScript Code QualityJavaScript Code Quality
JavaScript Code QualityJoseph Chiang
 
Kind editor设计思路
Kind editor设计思路Kind editor设计思路
Kind editor设计思路taobao.com
 
面向未来的前端类库开发 — KISSY 类库构想与实践
面向未来的前端类库开发  — KISSY 类库构想与实践面向未来的前端类库开发  — KISSY 类库构想与实践
面向未来的前端类库开发 — KISSY 类库构想与实践taobao.com
 
KISSY Mechanism
KISSY MechanismKISSY Mechanism
KISSY Mechanismlifesinger
 
react native by letv
react native by letvreact native by letv
react native by letvfeeloc
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例Will Huang
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Gelis Wu
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plusDongxu Yao
 
Android应用开发 - 沈大海
Android应用开发 - 沈大海Android应用开发 - 沈大海
Android应用开发 - 沈大海Shaoning Pan
 
a glance of Javascript module
a glance of Javascript modulea glance of Javascript module
a glance of Javascript modulezipeng zhang
 
KISSY Editor Design 2
KISSY Editor Design 2KISSY Editor Design 2
KISSY Editor Design 2yiming he
 

Similar to YUI is Sexy (for JSDC.tw) (20)

Kissy design
Kissy designKissy design
Kissy design
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejs
 
Yui rocks
Yui rocksYui rocks
Yui rocks
 
Js高级技巧
Js高级技巧Js高级技巧
Js高级技巧
 
YUI介绍和使用YUI构建web应用
YUI介绍和使用YUI构建web应用YUI介绍和使用YUI构建web应用
YUI介绍和使用YUI构建web应用
 
Node js实践
Node js实践Node js实践
Node js实践
 
Kindeditor 设计思路
Kindeditor 设计思路Kindeditor 设计思路
Kindeditor 设计思路
 
I os 16
I os 16I os 16
I os 16
 
JavaScript Code Quality
JavaScript Code QualityJavaScript Code Quality
JavaScript Code Quality
 
Kind editor设计思路
Kind editor设计思路Kind editor设计思路
Kind editor设计思路
 
面向未来的前端类库开发 — KISSY 类库构想与实践
面向未来的前端类库开发  — KISSY 类库构想与实践面向未来的前端类库开发  — KISSY 类库构想与实践
面向未来的前端类库开发 — KISSY 类库构想与实践
 
KISSY Mechanism
KISSY MechanismKISSY Mechanism
KISSY Mechanism
 
react native by letv
react native by letvreact native by letv
react native by letv
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
 
Vue
VueVue
Vue
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plus
 
Android应用开发 - 沈大海
Android应用开发 - 沈大海Android应用开发 - 沈大海
Android应用开发 - 沈大海
 
a glance of Javascript module
a glance of Javascript modulea glance of Javascript module
a glance of Javascript module
 
KISSY Editor Design 2
KISSY Editor Design 2KISSY Editor Design 2
KISSY Editor Design 2
 

More from Joseph Chiang

不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会Joseph Chiang
 
前端的未來 - 前端工程實務訓練
前端的未來 - 前端工程實務訓練前端的未來 - 前端工程實務訓練
前端的未來 - 前端工程實務訓練Joseph Chiang
 
Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練Joseph Chiang
 
前端工程開發實務訓練
前端工程開發實務訓練前端工程開發實務訓練
前端工程開發實務訓練Joseph Chiang
 
CSS 入門 - 前端工程開發實務訓練
CSS 入門 - 前端工程開發實務訓練CSS 入門 - 前端工程開發實務訓練
CSS 入門 - 前端工程開發實務訓練Joseph Chiang
 
HTML 入門 - 前端工程開發實務訓練
HTML 入門 - 前端工程開發實務訓練HTML 入門 - 前端工程開發實務訓練
HTML 入門 - 前端工程開發實務訓練Joseph Chiang
 
分享無名小站 API
分享無名小站 API分享無名小站 API
分享無名小站 APIJoseph Chiang
 
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !yui3 is Sexy - 使用 YUI 3 的 Sexy Part !
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !Joseph Chiang
 
建立前端開發團隊 - 2011 中華電信訓練所版
建立前端開發團隊 - 2011 中華電信訓練所版建立前端開發團隊 - 2011 中華電信訓練所版
建立前端開發團隊 - 2011 中華電信訓練所版Joseph Chiang
 
不用不可之 Fiddler Debugging Proxy!
不用不可之 Fiddler Debugging Proxy!不用不可之 Fiddler Debugging Proxy!
不用不可之 Fiddler Debugging Proxy!Joseph Chiang
 
Front-end Modular & Autmomated Development
Front-end Modular & Autmomated Development Front-end Modular & Autmomated Development
Front-end Modular & Autmomated Development Joseph Chiang
 
建立前端开发团队 (Front-end Development Environment)
建立前端开发团队 (Front-end Development Environment)建立前端开发团队 (Front-end Development Environment)
建立前端开发团队 (Front-end Development Environment)Joseph Chiang
 
Hack Day Sharing at D-Link
Hack Day Sharing at D-LinkHack Day Sharing at D-Link
Hack Day Sharing at D-LinkJoseph Chiang
 
桃園農工講「跑步環島」
桃園農工講「跑步環島」桃園農工講「跑步環島」
桃園農工講「跑步環島」Joseph Chiang
 

More from Joseph Chiang (19)

不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会
 
Let's Redux!
Let's Redux!Let's Redux!
Let's Redux!
 
F2E for Enterprise
F2E for EnterpriseF2E for Enterprise
F2E for Enterprise
 
F2E, the Keystone
F2E, the KeystoneF2E, the Keystone
F2E, the Keystone
 
前端的未來 - 前端工程實務訓練
前端的未來 - 前端工程實務訓練前端的未來 - 前端工程實務訓練
前端的未來 - 前端工程實務訓練
 
Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練
 
前端工程開發實務訓練
前端工程開發實務訓練前端工程開發實務訓練
前端工程開發實務訓練
 
CSS 入門 - 前端工程開發實務訓練
CSS 入門 - 前端工程開發實務訓練CSS 入門 - 前端工程開發實務訓練
CSS 入門 - 前端工程開發實務訓練
 
HTML 入門 - 前端工程開發實務訓練
HTML 入門 - 前端工程開發實務訓練HTML 入門 - 前端工程開發實務訓練
HTML 入門 - 前端工程開發實務訓練
 
miiiCasa is Fun
miiiCasa is FunmiiiCasa is Fun
miiiCasa is Fun
 
分享無名小站 API
分享無名小站 API分享無名小站 API
分享無名小站 API
 
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !yui3 is Sexy - 使用 YUI 3 的 Sexy Part !
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !
 
建立前端開發團隊 - 2011 中華電信訓練所版
建立前端開發團隊 - 2011 中華電信訓練所版建立前端開發團隊 - 2011 中華電信訓練所版
建立前端開發團隊 - 2011 中華電信訓練所版
 
不用不可之 Fiddler Debugging Proxy!
不用不可之 Fiddler Debugging Proxy!不用不可之 Fiddler Debugging Proxy!
不用不可之 Fiddler Debugging Proxy!
 
Open platform
Open platformOpen platform
Open platform
 
Front-end Modular & Autmomated Development
Front-end Modular & Autmomated Development Front-end Modular & Autmomated Development
Front-end Modular & Autmomated Development
 
建立前端开发团队 (Front-end Development Environment)
建立前端开发团队 (Front-end Development Environment)建立前端开发团队 (Front-end Development Environment)
建立前端开发团队 (Front-end Development Environment)
 
Hack Day Sharing at D-Link
Hack Day Sharing at D-LinkHack Day Sharing at D-Link
Hack Day Sharing at D-Link
 
桃園農工講「跑步環島」
桃園農工講「跑步環島」桃園農工講「跑步環島」
桃園農工講「跑步環島」
 

YUI is Sexy (for JSDC.tw)

  • 1. YUI IS SEXY 使用 YUI Library 作為開發基礎 講者 - josephj http://www.slideshare.net/josephj/yui-is-sexy-yui
  • 2. Who am I? ·•將近 7 年的前端工程師經驗 ·•曾開發知識+、無名小站,擔 任 YDN 傳教士與校園徵才。 ·•目前任職於 miiiCasa.com ·•專注 YUI 開發、喜好架構建 設 ·•Github: josephj ·•Blog: josephj.com
  • 4. 對於 SEXY、每個人的解讀都不一樣 謝謝美國 Yahoo! 的工程師 Huge Huang 提醒我要做這⼀一頁 XD
  • 5. 對於 SEXY、每個人的解讀都不一樣 謝謝美國 Yahoo! 的工程師 Huge Huang 提醒我要做這⼀一頁 XD 熱情如火型
  • 6. 對於 SEXY、每個人的解讀都不一樣 謝謝美國 Yahoo! 的工程師 Huge Huang 提醒我要做這⼀一頁 XD 熱情如火型 高雅上流型
  • 7. 對於 SEXY、每個人的解讀都不一樣 謝謝美國 Yahoo! 的工程師 Huge Huang 提醒我要做這⼀一頁 XD 熱情如火型 嗲聲嗲氣型 高雅上流型
  • 8. YUI 一黨不能獨大、媒體不能壟斷 JavaScript 函式庫當然也要多一些選擇啦 http://www.flickr.com/photos/freestylee/5399124878/
  • 9. Absolute Tower 若在意的是架構、完整性、團隊開發、軟體堆疊 YUI 3 是非常 Sexy 的函式庫 http://www.flickr.com/photos/picturenarrative/5474702933/in/pool-39804613888@N01/
  • 10. Part I Architecture Module / Loader / OOP
  • 11. Modularization 將功能分門別類、要用的時候挑選組合 http://www.flickr.com/photos/bdesham/2432400623
  • 12. NASA Space Station 除了樂高積木、國際太空站也是 Modularization 的好範例 http://www.flickr.com/photos/nasamarshall/4546245011/
  • 13. NASA Space Station 由 7 個不同國家所提供的 50 多個模組 http://astronomy.wikia.com/wiki/International_Space_Station
  • 14. NASA Space Station 由 7 個不同國家所提供的 50 多個模組 http://astronomy.wikia.com/wiki/International_Space_Station
  • 15. NASA Space Station 舉凡建築、航太、機械、硬體到軟體 在任何分工精細的工程領域 模組化開發是必然趨勢 「採用既有模組、避免重新打造輪子」 由 7 個不同國家所提供的 50 多個模組 http://astronomy.wikia.com/wiki/International_Space_Station
  • 17. 最基本的 JavaScript 模組化 <script src="jquery-1.7.2.js"></script> <script src="jquery.ui.core.js"></script> <script src="jquery.ui.widget.js"></script> <script src="jquery.ui.accordion.js"></script>
  • 18. 最基本的 JavaScript 模組化 <script src="jquery-1.7.2.js"></script> // 核心函式庫 <script src="jquery.ui.core.js"></script> // 模組 1 <script src="jquery.ui.widget.js"></script> // 模組 2 <script src="jquery.ui.accordion.js"></script> // 模組 3
  • 19. 最基本的 JavaScript 模組化 <script src="jquery-1.7.2.js"></script> // 核心函式庫 <script src="jquery.ui.core.js"></script> // 模組 1 <script src="jquery.ui.widget.js"></script> // 模組 2 <script src="jquery.ui.accordion.js"></script> // 模組 3 網站發展到一定規模時、這樣做包準讓你焦頭爛額 全域變數、維護性、前後順序、模組效率問題 這些都是在 YUI 2 與其他主流函式庫的瓶頸
  • 21. YUI 3 架構徹底解決模組問題 2009/6 月,YUI 推出與先前架構完全不同的 3.0 版 解決前述全域變數、維護性、前後順序、模組效率的問題 所有 YUI 模組檔案皆必須以這樣的方式包覆:
  • 22. YUI 3 架構徹底解決模組問題 2009/6 月,YUI 推出與先前架構完全不同的 3.0 版 解決前述全域變數、維護性、前後順序、模組效率的問題 所有 YUI 模組檔案皆必須以這樣的方式包覆: YUI.add("模組名稱", function (Y) {      }, requires:["所需模組 1", "所需模組 2"]);  
  • 23. YUI 3 架構徹底解決模組問題 2009/6 月,YUI 推出與先前架構完全不同的 3.0 版 解決前述全域變數、維護性、前後順序、模組效率的問題 所有 YUI 模組檔案皆必須以這樣的方式包覆: YUI.add("模組名稱", function (Y) { Why callback? 放到頁面上時不會立即執行、 等到要用時再執行即可。好處 是做程式碼的隔離、不再需要 處理每個模組間的先後順序。      }, requires:["所需模組 1", "所需模組 2"]);  
  • 24. YUI 3 架構徹底解決模組問題 2009/6 月,YUI 推出與先前架構完全不同的 3.0 版 解決前述全域變數、維護性、前後順序、模組效率的問題 所有 YUI 模組檔案皆必須以這樣的方式包覆: editor.js YUI.add("模組名稱", function (Y) { editor      }, requires:["所需模組 1", "所需模組 2"]);  
  • 25. YUI 3 架構徹底解決模組問題 2009/6 月,YUI 推出與先前架構完全不同的 3.0 版 解決前述全域變數、維護性、前後順序、模組效率的問題 所有 YUI 模組檔案皆必須以這樣的方式包覆: editor.js YUI.add("模組名稱", function (Y) { editor // 上方的參數 Y 代表了 YUI 的 Instance          function Editor() {         // 這是物件的建構式     }                   }, requires:["所需模組 1", "所需模組 2"]);  
  • 26. YUI 3 架構徹底解決模組問題 2009/6 月,YUI 推出與先前架構完全不同的 3.0 版 解決前述全域變數、維護性、前後順序、模組效率的問題 所有 YUI 模組檔案皆必須以這樣的方式包覆: editor.js YUI.add("模組名稱", function (Y) { editor // 上方的參數 Y 代表了 YUI 的 Instance          function Editor() {         // 這是物件的建構式     }                  // 將建構式提昇到 Global     Y.Editor = Editor;      }, requires:["所需模組 1", "所需模組 2"]);  
  • 29. YUI 3 架構徹底解決模組問題 對使用者來說,只需指定模組名稱即可使用: YUI().use("editor", function (Y) {       // 此 Callback 代表所需模組皆已載入完成         // 你就可以直接建立 Y.Editor 的例項      });
  • 30. YUI 3 架構徹底解決模組問題 對使用者來說,只需指定模組名稱即可使用: YUI().use("editor", function (Y) {          // 此 Callback 代表所需模組皆已載入完成         // 你就可以直接建立 Y.Editor 的例項          var editor = new Y.Editor();      });
  • 32. JavaScript 模組化的實作已是當代趨勢 • CommonJS 1.0 被 nodeJS 所採用,不適合使用在瀏覽器端。
  • 33. JavaScript 模組化的實作已是當代趨勢 • CommonJS 1.0 被 nodeJS 所採用,不適合使用在瀏覽器端。 • CommonJS 2.0
  • 34. JavaScript 模組化的實作已是當代趨勢 • CommonJS 1.0 被 nodeJS 所採用,不適合使用在瀏覽器端。 • CommonJS 2.0 • ECMAScript Module 最期盼的!不需要 Library 即可擁有模組架構。
  • 35. JavaScript 模組化的實作已是當代趨勢 • CommonJS 1.0 被 nodeJS 所採用,不適合使用在瀏覽器端。 • CommonJS 2.0 • ECMAScript Module 最期盼的!不需要 Library 即可擁有模組架構。 • AMD 被 dojo、jQuery、Mootools、RequireJS 所採用、專為瀏覽器所設計。 為目前最夯且成熟的模組架構 不同的 Library 間可以共享模組。
  • 36. JavaScript 模組化的實作已是當代趨勢 • CommonJS 1.0 被 nodeJS 所採用,不適合使用在瀏覽器端。 // AMD Module • CommonJS 2.0 define(function () {     function Editor { /* Constructor */ }     return Editor; }); • ECMAScript Module require(["editor"], function (Editor) {     new Editor(); 最期盼的!不需要 Library 即可擁有模組架構。 }); • AMD 被 dojo、jQuery、Mootools、RequireJS 所採用、專為瀏覽器所設計。 為目前最夯且成熟的模組架構 不同的 Library 間可以共享模組。
  • 37. JavaScript 模組化的實作已是當代趨勢 • CommonJS 1.0 被 nodeJS 所採用,不適合使用在瀏覽器端。 // AMD Module • CommonJS 2.0 define(function () {     function Editor { /* Constructor */ }     return Editor; }); • ECMAScript Module require(["editor"], function (Editor) {     new Editor(); 最期盼的!不需要 Library 即可擁有模組架構。 }); • AMD // YUI Module YUI.add("editor", function () {     function Editor { /* Constructor */ } 被 dojo、jQuery、Mootools、RequireJS     Y.Editor = Editor;     所採用、專為瀏覽器所設計。 }); YUI.use("editor", function (Y) { 為目前最夯且成熟的模組架構     new Y.Editor(); }); 不同的 Library 間可以共享模組。
  • 38. JavaScript 模組化的實作已是當代趨勢 • CommonJS 1.0 被 nodeJS 所採用,不適合使用在瀏覽器端。 // AMD Module • CommonJS 2.0 define(function () {     function Editor { /* Constructor */ }     return Editor; }); • ECMAScript Module require(["editor"], function (Editor) {     new Editor(); 最期盼的!不需要 Library 即可擁有模組架構。 }); • AMD // YUI Module YUI.add("editor", function () {     function Editor { /* Constructor */ } 被 dojo、jQuery、Mootools、RequireJS     Y.Editor = Editor;     所採用、專為瀏覽器所設計。 }); YUI.use("editor", function (Y) { 為目前最夯且成熟的模組架構     new Y.Editor(); }); 不同的 Library 間可以共享模組。
  • 39. JavaScript 模組化的實作已是當代趨勢 YUI Module 能做到的事與 AMD 都相同 • CommonJS 1.0 AMD 畢竟是目前業界主流,YUI 也在整合中 被 nodeJS 所採用,不適合使用在瀏覽器端。 // AMD Module • 值得注意的是這樣的概念 YUI 2 年前就實作了 CommonJS 2.0 define(function () {     function Editor { /* Constructor */ }     return Editor; }); • ECMAScript Module 架構面的設計就是 YUI 的強項啊! require(["editor"], function (Editor) {     new Editor(); 最期盼的!不需要 Library 即可擁有模組架構。 }); • AMD // YUI Module YUI.add("editor", function () {     function Editor { /* Constructor */ } 被 dojo、jQuery、Mootools、RequireJS     Y.Editor = Editor;     所採用、專為瀏覽器所設計。 }); YUI.use("editor", function (Y) { 為目前最夯且成熟的模組架構     new Y.Editor(); }); 不同的 Library 間可以共享模組。
  • 40. JavaScript 模組化的實作已是當代趨勢 YUI Module 能做到的事與 AMD 都相同 • CommonJS 1.0 AMD 畢竟是目前業界主流,YUI 也在整合中 被 nodeJS 所採用,不適合使用在瀏覽器端。 // AMD Module • 值得注意的是這樣的概念 YUI 2 年前就實作了 CommonJS 2.0 define(function () {     function Editor { /* Constructor */ }     return Editor; }); • ECMAScript Module 架構面的設計就是 YUI 的強項啊! require(["editor"], function (Editor) {     new Editor(); 最期盼的!不需要 Library 即可擁有模組架構。 }); • AMD 但模組化的有會導致檔案被拆得更多更細{ // YUI Module YUI.add("editor", function ()     function Editor { /* Constructor */ } 被 dojo、jQuery、Mootools、RequireJS     Y.Editor = Editor;     那我們如何有效率地載入模組呢 ? 所採用、專為瀏覽器所設計。 }); YUI.use("editor", function (Y) { 為目前最夯且成熟的模組架構     new Y.Editor(); }); 不同的 Library 間可以共享模組。
  • 41. Loader 有效率地載入所需要的的 CSS 與 JavaScript 檔案 http://www.flickr.com/photos/bdesham/2432400623
  • 42. 網站在初期、所需的 JavaScript 與 CSS 都很小 http://www.flickr.com/photos/halfbisqued/2353845688/
  • 43. 網站在初期、所需的 JavaScript 與 CSS 都很小 jQuery - 32K http://www.flickr.com/photos/halfbisqued/2353845688/
  • 44. 網站在初期、所需的 JavaScript 與 CSS 都很小 jQuery - 32K <script src="http://code.jquery.com/jquery-1.4.2.min.js"></script> 就可做很多事! http://www.flickr.com/photos/halfbisqued/2353845688/
  • 46. 發展到一定規模,該如何選擇每頁所需的檔案呢? 天哪!我該如何處理 這麼多的 CSS / JS 檔案? 模組化會切分出很多檔案,如何黏在⼀一起是⼀一門學問 http://www.nipic.com/show/2/55/d96dde66860c5190.html
  • 47. 發展到一定規模,該如何選擇每頁所需的檔案呢? 天哪!我該如何處理 這麼多的 CSS / JS 檔案? 模組化會切分出很多檔案,如何黏在⼀一起是⼀一門學問 http://www.nipic.com/show/2/55/d96dde66860c5190.html
  • 48. 發展到一定規模,該如何選擇每頁所需的檔案呢? 天哪!我該如何處理 這麼多的 CSS / JS 檔案? 較不專業的網站在面對這樣的問題 都是純手工一頁一頁寫、或者是打成一大包 得考慮先後順序、維護性低、也無法最佳化 模組化會切分出很多檔案,如何黏在⼀一起是⼀一門學問 http://www.nipic.com/show/2/55/d96dde66860c5190.html
  • 49. 這時需要一個 Loader 機制 協助載入零散且多的模組檔案 http://www.flickr.com/photos/billjacobus1/123644872/
  • 50. 以 YUI DataTable 為範例 (datatable)
  • 51. 以 YUI DataTable 為範例 (datatable)
  • 52. 以 YUI DataTable 為範例 (datatable) 不 reload 的行為很多:換 頁、排序、直接編輯。也可 以有各種資料來源,是個很 複雜的模組。
  • 56. 只要幾行程式碼就可以載入所需模組 <script src="http://yui.yahooapis.com/3.5.0/build/yui/yui-min.js"></script> <script> YUI().use('datatable', function (Y) {          alert(Y.DataTable); }); </script> 能想像 6 行程式碼背後、做了多少事嗎 ?
  • 58. 計算 requires 模組的過程 yui (Seed) YUI().use('datatable')
  • 59. 計算 requires 模組的過程 datatable-core datatable-head datatable-body base-build widget yui (Seed) YUI().use('datatable')
  • 60. 計算 requires 模組的過程 escape node-base base-plugin-host node-style model-list base-base event-focus view node-event-delegate classnamemanager attribute datatable-core datatable-head datatable-body base-build widget yui (Seed) YUI().use('datatable')
  • 61. 計算 requires 模組的過程 arraylist yui-base pluginhost event-synthetic attribute-core attribute-events model event-delegate attribute-extras array-extras array-invoke json-parse escape node-base base-plugin-host node-style model-list base-base event-focus view node-event-delegate classnamemanager attribute datatable-core datatable-head datatable-body base-build widget yui (Seed) YUI().use('datatable')
  • 62. 計算 requires 模組的過程 與載入順序無關、YUI Module 在設計上是不需考慮先後順序的 arraylist yui-base pluginhost event-synthetic attribute-core attribute-events model event-delegate attribute-extras array-extras array-invoke json-parse escape node-base base-plugin-host node-style model-list base-base event-focus view node-event-delegate classnamemanager attribute datatable-core datatable-head datatable-body base-build widget yui (Seed) YUI().use('datatable')
  • 63. 強大的壓縮機 Combo Handler YUI().use('datatable')
  • 64. 強大的壓縮機 Combo Handler YUI().use('datatable') 前一頁只列出了 28 個模組,但實際上會有 64 個
  • 65. 強大的壓縮機 Combo Handler YUI().use('datatable') 前一頁只列出了 28 個模組,但實際上會有 64 個 64 個模組就代表了 64 個檔案、 你可能會覺得很誇張
  • 66. 強大的壓縮機 Combo Handler YUI().use('datatable') 前一頁只列出了 28 個模組,但實際上會有 64 個 64 個模組就代表了 64 個檔案、 你可能會覺得很誇張 但模組化就是要把不相干的程式抽離、盡可能精簡
  • 67. 強大的壓縮機 Combo Handler YUI().use('datatable') 前一頁只列出了 28 個模組,但實際上會有 64 個 64 個模組就代表了 64 個檔案、 你可能會覺得很誇張 但模組化就是要把不相干的程式抽離、盡可能精簡 即使採用 LABjs 這樣平行載入的方式,數量仍嫌太多
  • 68. 強大的壓縮機 Combo Handler YUI().use('datatable') 前一頁只列出了 28 個模組,但實際上會有 64 個 64 個模組就代表了 64 個檔案、 你可能會覺得很誇張 但模組化就是要把不相干的程式抽離、盡可能精簡 即使採用 LABjs 這樣平行載入的方式,數量仍嫌太多 YUI 的 Combo Handler 可把數量的問題徹底解決
  • 69. 強大的壓縮機 Combo Handler YUI().use('datatable') 前一頁只列出了 28 個模組,但實際上會有 64 個 64 個模組就代表了 64 個檔案、 你可能會覺得很誇張 但模組化就是要把不相干的程式抽離、盡可能精簡 即使採用 LABjs 這樣平行載入的方式,數量仍嫌太多 YUI 的 Combo Handler 可把數量的問題徹底解決 http://yui.yahooapis.com/combo? <模組1的檔案路徑>& <模組2的檔案路徑>& <模組3的檔案路徑>& <模組4的檔案路徑>& ...
  • 71. 載入的方式是最流行的非同步平行下載 YUI().use('datatable') 你所引用的 YUI Seed
  • 72. 載入的方式是最流行的非同步平行下載 YUI().use('datatable') 你所引用的 YUI Seed 先載入相關 CSS
  • 73. 載入的方式是最流行的非同步平行下載 YUI().use('datatable') 你所引用的 YUI Seed 先載入相關 CSS 將所需 JavaScript Modules 分散成 3 個請求、平行下載
  • 74. 載入的方式是最流行的非同步平行下載 YUI().use('datatable') 你所引用的 YUI Seed 先載入相關 CSS 將所需 JavaScript Modules 分散成 3 個請求、平行下載 分散的邏輯:「檔案總數量」、「瀏覽器同時請求數量」、「瀏覽器 GET 長度的限制」 自己用 Loader (LABjs、Headjs) 刻這樣的機制會很辛苦
  • 77. 從種子變成大樹只花了 323 ms YUI().use('datatable') 323ms 是一棵完全沒有贅肉的大樹、因 Module 的切分非常的細、用不到的絕不載入 同時符合了大型網站對於效能最佳化的考慮、在使用層面也非常容易(你只需知道模組名稱)
  • 78. YUI 自動載入函式庫的方式實在太 Sexy 了 The creator of jQuery John Resig http://www.quora.com/How-could-YUI3-improve-its-image-compared-to-jQuery-MooTools-etc
  • 79. YUI 自動載入函式庫的方式實在太 Sexy 了 YUI().use() + pulling code off of Yahoo's CDN is damn sexy and should be promoted *VERY* heavily. The creator of jQuery John Resig http://www.quora.com/How-could-YUI3-improve-its-image-compared-to-jQuery-MooTools-etc
  • 80.
  • 83. Loader 改版 頁面 index.php 1.在頁面上呼叫: 模組 YUI().use(“_header”,“_nav”,“_content” _header ,“_footer”); 模組 模組 _nav _content 模組 _footer
  • 84. Loader 改版 頁面 index.php 1.在頁面上呼叫: 模組 YUI().use(“_header”,“_nav”,“_content” _header ,“_footer”); requires:[a,c,e] 模組 模組 2.每個模組都已經各自設定所需 require 的模組。 _nav _content requires:[b] requires:[a,b,c] 模組 _footer requires:[d, e, f]
  • 85. Loader 改版 頁面 index.php 1.在頁面上呼叫: 模組 YUI().use(“_header”,“_nav”,“_content” _header ,“_footer”); requires:[a,c,e] 模組 模組 2.每個模組都已經各自設定所需 require 的模組。 _nav _content requires:[b] requires:[a,b,c] 3.YUI 的 Loader 會自動計算實際 要載入的模組有哪些。 模組 _footer requires:[d, e, f] Loader 共有這些模組要載入: g, h, j, l, m, u, y, a, b, c, d, e, f, _header, _nav, _content, _footer
  • 86. Loader 改版 頁面 index.php 1.在頁面上呼叫: 模組 YUI().use(“_header”,“_nav”,“_content” _header ,“_footer”); requires:[a,c,e] 模組 模組 2.每個模組都已經各自設定所需 require 的模組。 _nav _content requires:[b] requires:[a,b,c] 3.YUI 的 Loader 會自動計算實際 要載入的模組有哪些。 模組 _footer 4.最後利用 Combo 以非同步的方 requires:[d, e, f] 式把檔案下載回來。 Loader 共有這些模組要載入: combo request 1 g, h, j, l, m, u, y, a, b, c, d, e, f, _header, _nav, _content, _footer combo request 2 Server combo request 3
  • 87. 啟發: Loader 改版 頁面 index.php 1.在頁面上呼叫: 模組 YUI().use(“_header”,“_nav”,“_content” _header ,“_footer”); requires:[a,c,e] Page-Level 的設定是中央集權、最後會搞不清楚 模組 模組 2.每個模組都已經各自設定所需 require 的模組。 _nav由 Module-Level 設定是地方自治、很好管理 _content requires:[b] requires:[a,b,c] 透過相依性計算、自動合併、非同步下載等機制達成 3.YUI 的 Loader 會自動計算實際 要載入的模組有哪些。 模組 讓模組真正做到可以隨插即用 _footer 4.最後利用 Combo 以非同步的方 requires:[d, e, f] 式把檔案下載回來。 實作範例: http://josephj.com/lab/2012/loader-strategy/demo.php Loader 原始碼: https://github.com/josephj/loader-strategy 共有這些模組要載入: combo request 1 g, h, j, l, m, u, y, a, b, c, d, e, f, _header, _nav, _content, _footer combo request 2 Server combo request 3
  • 88. YUI Architecture Rocks! Module 領先業界的思維 ⼀一定會越拆越細 Loader 領先業界的思維 Combo 的機制比 Build 好 Combo 軟體自動化的極致 可用 Minify 或 combohandler 代替 CDN 善用大公司的資源吧 有錢才會有 不需辛苦實作、幾行就可以寫出業界的 Best Practice YUI 還有什麼值得我們參考的 ? http://www.flickr.com/photos/kelvin255/5576672521/
  • 89. OOP Object-oriented Programming 概念人人都有,但如何實作?有好的架構與工具嗎? http://www.zeegee.com/courses/oop-1
  • 91. 將表單驗證包裝成 Y.FormValidator 後... 檔案名稱 實際作用 未用 OOP 使用 OOP _account_identity.js 變更帳號 共 356 行 共 200 行 (-44%) _account_password.js 更改密碼 共 355 行 共 221 行 (-38%) _profile_edit_info.js 修改資料 共 454 行 共 292 行 (-36%)
  • 92. 將表單驗證包裝成 Y.FormValidator 後... 檔案名稱 實際作用 未用 OOP 使用 OOP _account_identity.js 變更帳號 共 356 行 共 200 行 (-44%) _account_password.js 更改密碼 共 355 行 共 221 行 (-38%) _profile_edit_info.js 修改資料 共 454 行 共 292 行 (-36%) 程式碼總行數至少都減少 35% 以上 寫法功能變得一致、有 Bug 可一起處理、提昇品質 效果可謂是立竿見影 !
  • 93. 將表單驗證包裝成 Y.FormValidator 後... 檔案名稱 實際作用 未用 OOP 使用 OOP _account_identity.js 變更帳號 共 356 行 共 200 行 (-44%) _account_password.js 更改密碼 共 355 行 共 221 行 (-38%) _profile_edit_info.js 修改資料 共 454 行 共 292 行 (-36%) 程式碼總行數至少都減少 35% 以上 寫法功能變得一致、有 Bug 可一起處理、提昇品質 效果可謂是立竿見影 !
  • 94. 將表單驗證包裝成 Y.FormValidator 後... 物件導向的好處: 檔案名稱 實際作用 未用 OOP 使用 OOP _account_identity.js 變更帳號 共 356 行 共 200 行 (-44%) ·•避免撰寫相同的代碼 _account_password.js 更改密碼 共 355 行 共 221 行 (-38%) ·•縮短開發時間 _profile_edit_info.js 修改資料 共 454 行 共 292 行 (-36%) ·•減少團隊開發的不一致 程式碼總行數至少都減少 35% 以上 應被大量地運用在開發中 寫法功能變得一致、有 Bug 可一起處理、提昇品質 效果可謂是立竿見影 !
  • 95. 使用原生的 JavaScript 撰寫 OOP 令人挫折 Constructor function Car(brand, color) {     this.brand = brand;     this.color = color;     this.miles = 0; } Car.prototype.run = function () {     var i = 0;     var timer = setInterval(1000, function() {         if (i >= 10) clearInterval(timer);         this.miles += 1;         i += 1;     }); };
  • 96. 使用原生的 JavaScript 撰寫 OOP 令人挫折 Constructor function Car(brand, color) {     this.brand = brand; // 廠牌,只能寫⼀一次。     this.color = color; // 顏色,只能寫⼀一次。     this.miles = 0; // 里程數,必須是唯讀。 } Car.prototype.run = function () {     var i = 0;     var timer = setInterval(1000, function() {         if (i >= 10) clearInterval(timer);         this.miles += 1;         i += 1;     }); };
  • 97. 使用原生的 JavaScript 撰寫 OOP 令人挫折 Constructor Instance function Car(brand, color) { var oCar   = new Car(‘ford’, ‘black’);     this.brand = brand; // 廠牌,只能寫⼀一次。 oCar.brand = 'Honda';     this.color = color; // 顏色,只能寫⼀一次。 oCar.miles = '1公里';     this.miles = 0; // 里程數,必須是唯讀。 oCar.run(); } Car.prototype.run = function () {     var i = 0;     var timer = setInterval(1000, function() {         if (i >= 10) clearInterval(timer);         this.miles += 1;         i += 1;     }); };
  • 98. 使用原生的 JavaScript 撰寫 OOP 令人挫折 Constructor Instance function Car(brand, color) { var oCar   = new Car(‘ford’, ‘black’);     this.brand = brand; // 廠牌,只能寫⼀一次。 oCar.brand = 'Honda'; // 不應被改寫     this.color = color; // 顏色,只能寫⼀一次。 oCar.miles = '1公里'; // 天兵使用者亂改 :p     this.miles = 0; // 里程數,必須是唯讀。 oCar.run(); // 車子何時停? } Car.prototype.run = function () {     var i = 0;     var timer = setInterval(1000, function() {         if (i >= 10) clearInterval(timer);         this.miles += 1;         i += 1;     }); }; 如何保護屬性不被濫用 ? 如何利用事件 ?
  • 100. YUI OOP - 內建屬性封裝
  • 101. YUI OOP - 內建屬性封裝 Constructor (Part) Car.ATTRS = {     “brand”: {         value: null,         writeOnce: true // 設定只能寫入⼀一次     },     “color”: {         value: null,         writeOnce: true  // 設定只能寫入⼀一次     },     “miles”: {         value: 0,         readOnly: true  // 設定只能讀取、不能寫入     } } ;
  • 102. YUI OOP - 內建屬性封裝 Constructor (Part) Car.ATTRS = {     “brand”: {         value: null,         writeOnce: true // 設定只能寫入⼀一次     },     “color”: {         value: null,         writeOnce: true  // 設定只能寫入⼀一次     },     “miles”: {         value: 0,         readOnly: true  // 設定只能讀取、不能寫入     } } ; Instance var oCar = new Car({     brand: “Ford”,     color: “black” }); oCar.set(“miles”, 100);     // return false; oCar.set(“brand”, “Honda”); // return false; oCar.set(“color”, “white”); // return false;
  • 103. YUI OOP - 內建屬性封裝 Constructor (Part) Car.ATTRS = {     “brand”: {         value: null,         writeOnce: true // 設定只能寫入⼀一次     },     “color”: {         value: null,         writeOnce: true  // 設定只能寫入⼀一次     },     “miles”: {         value: 0,         readOnly: true  // 設定只能讀取、不能寫入     } } ; Instance var oCar = new Car({     brand: “Ford”,     color: “black” }); 可有效防止使用者不當操作 oCar.set(“miles”, 100);     // return false; oCar.set(“brand”, “Honda”); // return false; oCar.set(“color”, “white”); // return false;
  • 104. YUI OOP - 內建屬性封裝 Constructor (Part) Car.ATTRS = {     “brand”: {         value: null, ·• validator - 驗證使用者輸入值         writeOnce: true // 設定只能寫入⼀一次     }, ·• writeOnce - 只能寫入一次     “color”: { ·• readOnly - 唯讀         value: null,         writeOnce: true  // 設定只能寫入⼀一次 ·• value - 預設值     },     “miles”: { ·• valueFn - 預設值 (以 Function 取得)         value: 0,         readOnly: true  // 設定只能讀取、不能寫入 ·• setter - 使用者 set 時所使用的 Function     } ·• getter - 使用者 get 時所使用的 Function } ; Instance var oCar = new Car({     brand: “Ford”,     color: “black” }); 可有效防止使用者不當操作 oCar.set(“miles”, 100);     // return false; oCar.set(“brand”, “Honda”); // return false; oCar.set(“color”, “white”); // return false;
  • 105. YUI OOP - 內建屬性封裝 Constructor (Part) Car.ATTRS = {     “brand”: {         value: null, ·• validator - 驗證使用者輸入值         writeOnce: true // 設定只能寫入⼀一次     }, ·• writeOnce - 只能寫入一次     “color”: { ·• readOnly - 唯讀         value: null,         writeOnce: true  // 設定只能寫入⼀一次 ·• value - 預設值     },     “miles”: { ·• valueFn - 預設值 (以 Function 取得)         value: 0,         readOnly: true  // 設定只能讀取、不能寫入 ·• setter - 使用者 set 時所使用的 Function     } ·• getter - 使用者 get 時所使用的 Function } ; Instance var oCar = new Car({     brand: “Ford”, 屬性管理是     color: “black” }); 可有效防止使用者不當操作 JavaScript OOP oCar.set(“miles”, 100);     // return false; oCar.set(“brand”, “Honda”); // return false; 最基本的項目 oCar.set(“color”, “white”); // return false;
  • 106. YUI OOP - 內建自訂事件
  • 107. YUI OOP - 內建自訂事件 Constructor Y.extend(Car, Y.Base, {     run: function () {         var i = 0,             timer;         timer = setInterval(1000, function() {             if (i >= 10){                clearInterval(timer);                this.fire(“stop”, this.miles);             }             this.miles += 1;             i += 1;        });     } };
  • 108. YUI OOP - 內建自訂事件 Constructor Instance Y.extend(Car, Y.Base, { oCar = new Car();     run: function () { oCar.on(“stop”, function (e) {         var i = 0,     alert(e.detail.miles);             timer; });         timer = setInterval(1000, function() { oCar.run();             if (i >= 10){                clearInterval(timer);                this.fire(“stop”, this.miles);             }             this.miles += 1;             i += 1;        });     } };
  • 109. YUI OOP - 內建自訂事件 Constructor Instance Y.extend(Car, Y.Base, { oCar = new Car();     run: function () { oCar.on(“stop”, function (e) {         var i = 0,     alert(e.detail.miles);             timer; });         timer = setInterval(1000, function() { oCar.run();             if (i >= 10){                clearInterval(timer);                this.fire(“stop”, this.miles);             }             this.miles += 1;             i += 1;        });     } }; 任何地方都可以用 fire 觸發事件、用 on 監聽事件 JavaScript 最讚的地方就是事件驅動!別再用 callback 啦!
  • 111. YUI 元件架構 Base - 沒有介面、純粹是 API 的存取。
  • 112. YUI 元件架構 Base - 沒有介面、純粹是 API 的存取。 Widget - 有介面、新的使用者控制項。
  • 113. YUI 元件架構 Base - 沒有介面、純粹是 API 的存取。 Widget - 有介面、新的使用者控制項。 Plugin - 針對 Instance 擴充。
  • 114. YUI 元件架構 Base - 沒有介面、純粹是 API 的存取。 Widget - 有介面、新的使用者控制項。 Plugin - 針對 Instance 擴充。 Extension - 針對 Class 擴充。
  • 115. YUI 元件架構 Base - 沒有介面、純粹是 API 的存取。 Widget - 有介面、新的使用者控制項。 Plugin - 針對 Instance 擴充。 Extension - 針對 Class 擴充。 YUI 的元件架構是個開發物件導向的框架 考慮了事件、屬性、擴充性、漸進式支援 一旦上手可以很快產出好用的元件
  • 116. YUI 元件架構 Base - 沒有介面、純粹是 API 的存取。 Widget - 有介面、新的使用者控制項。 Plugin - 針對 Instance 擴充。 Extension - 針對 Class 擴充。 YUI 提供了很多擴充性的選項、 避免開發者因為功能不足去改既 有的程式,extend、plugin、 extension 都是好方法! YUI 的元件架構是個開發物件導向的框架 考慮了事件、屬性、擴充性、漸進式支援 一旦上手可以很快產出好用的元件
  • 117. Extend, Don’t Hack. From “Why YUI?” by Derek Gathright
  • 118. miiiCasa 利用 YUI OOP 所包裝的物件 • Scroll Pagination 像 Twitter 或 Facebook 捲動讀取更多資料 https://github.com/miiicasa/scroll-pagination • Editable 直接修改資料 https://github.com/miiicasa/yui3-editable • Placeholder 相容於所有瀏覽器的 Form Placeholder https://github.com/miiicasa/yui3-placeholder • CrossFrame 相容於所有瀏覽器的 HTML5 postMessage https://github.com/miiicasa/yui3-crossframe • Module Platform 跨模組溝通的架構 https://github.com/josephj/javascript-platform-yui
  • 121. 前端工程師要整合的東西實在太多 MVC Core CSS Grid (DOM / Event / AJAX) Document Automation Unit Test Build Server Loader Minify OOP pJAX I18N Module Debug Template
  • 122. 前端工程師要整合的東西實在太多 MVC Core CSS Grid (DOM / Event / AJAX) Backbone.js jQuery Document 960gs Automation Unit TestNature Docs Build Server TestSwarm Loader Optimizer Minify nodeJS OOP pJAX I18N LABjs Google Closure jquery-pjax Module Key / Value :p Debug Template RequireJS console handlebars
  • 123. 前端工程師要整合的東西實在太多 MVC Core CSS Grid (DOM / Event / AJAX) Backbone.js jQuery Document 960gs Automation Unit TestNature Docs Build Server TestSwarm Loader Optimizer Minify nodeJS OOP pJAX I18N LABjs Google Closure jquery-pjax Module Key / Value :p Debug Template RequireJS console handlebars 得花很多時間比較、研究不同選擇的差異性
  • 124. YUI 提供了全方位的服務 Core MVC (DOM / Event / AJAX) Y.Node / Y.Event / Y.IO Y.Model / Y.View / Y.Router CSS Grid Document CSS Grids Automation Unit Test yuidocjs yeti Build Server Y.Test OOP Loader YUI Build YUI in nodejs Minify Y.Attribute / Y.Base / Y.Widget / Y.Plugin Y.Loader pJAX I18N YUI Compressor Y.Pjax Module Y.Intl / Y.DataType YUI.add() Debug Template Y.Log() Y.Handlebars 使用 YUI 的話,就不用想太多啦、該有的都⼀一定有!
  • 125. yuidocjs 從註解產生 API 文件 nodeJS markdown syntax handlebars helper 介面親和 所有程式語言皆支援
  • 126. yuidocjs - 從註解產生 API 文件 http://miiicasa.github.com/yui3-editable/classes/Editable.html
  • 127. 支援多國語系 依語系格式化日期 YUI({lang:"zh-Hant-TW"}).use("datatype-date", function(Y) {     var dateString = Y.DataType.Date.format(new Date(), {format:"%x %X"});     alert(dateString); // 12/05/17 上午12時32分33秒 }); Calendar 控制項 YUI({lang:"zh-Hant-TW"}).use("calendar", function(Y) { new Y.Calendar(); }); 翻譯也是 Module
  • 128. 對軟體開發很有價值的工具 Unit Test 撰寫 JavaScript 的 Test Case Automation Yeti - 以 nodeJS 所建立的自動化測試流程 YUI in Node 可以在 nodeJS 中使用 YUI、即使把瀏覽器的 JS 關掉也能用 MVC JavaScript 的 MVC 架構、沿襲自 Backbone.js Y.log() 很基本的功能、但訊息⼀一多要關閉某些來源很方便 AsyncQueue 非同步處理的管理機制
  • 129.
  • 131. 對大型網站應用程式,YUI 完全勝出 For scalable web applications,YUI really excels. Former Principal Front End Engineer, Yahoo! Nicholas Zakas http://www.nczonline.net/blog/2010/11/03/response-to-john-resigs-comments-about-yui/
  • 132. miiiCasa Needs Your Join!! 歡迎對軟硬體結合、私有雲、Web 3.0、家庭的 SNS 等概念有興趣的同學加入! 更多內容: http://tinyurl.com/miiicasa-f2e
  • 134. Thank you for listening! Contact Me: josephj6802[at]gmail.com
  • 135. 參考連結 NFL.com 從 Prototype 換到 YUI http://www.yuiblog.com/blog/2012/01/17/video-yuiconf2011-rcannon/ Derek Gathright - Why YUI? 從 jQuery 改用 YUI http://www.yuiblog.com/blog/2012/01/30/video-yuiconf2011-dgathright/ http://dsheiko.com/weblog/yui3-vs-jquery jQuery vs. YUI 引发的思考 對 2 個 Library 中肯的評論 http://hikejun.com/blog/2010/11/07/jquery-vs-yui引发的思考/ From jQuery to YUI 比較兩者的語法 http://clayliao.blogspot.com/2012/04/yui-3-tutorial-from-yui-to-jquery.html