RequireJS

RequireJS

在進入RequireJS之前,我想先帶各位了解requireJS的優點,以及為何我們要用requireJS?

1.可以”快速”且”清楚”了解這個function引用了哪些外部呼叫js

首先,假如我們有很多很多的function在同一頁中,且這些function都彼此間互相引用或者是大量引用外部呼叫的js文件時,這對於後續維護非常麻煩(特別是每次修function要去打開一堆相關的外部呼叫文件找),因此requireJS的function架構上,可以讓我們快速了解引用了哪些外部文件,例如:

require(["jquery.alpha","jquery.beta"], function(aaa,bbb) {
    //your code
});

有此式我們可以得知這個function引用了jquery.alpha和jquery.beta兩個外部js檔.

2.可以讓你直覺且客觀的減少定義到全局變量 這部份就是指javascript很基本的全局和區域觀念,不多說.

3.實作:

[html端] head引用:

<script data-main="scripts/main" src="scripts/require-jquery.js"></script>

請注意此main是指main.js,他的路徑必須在 scripts/ 之下,而其他爾後要引用的js檔也盡量都放在 scripts/ 之下,這樣之後若引用出某文件時,可以不用再調整絕對路徑.

body引用:

require(["jquery.alpha","jquery.beta"], function(a,b) {
     b.addit();
     a.alpha(h1);
});

請注意,引用進來的一個外部js必須要給他一個namespase(比如說jquery.alpha的namespace就是a)而若今天想引用外部文件(jquery.alpha)的某一function叫做addit(),則寫a.addit();

[js端] js端可以define也可以reqiure文件,一般而言外部js內常寫define,如下(請注意看我註解的部份):

define(function () {
   function tools(str) {
      console.log(str);
    };

  return {
    alpha: function (str) {
      console.log(str);
      tools(str)  //這時候call的tools function是有作用的
      yoyo(str)   //請注意!這時候call的yoyo是沒有作用的
    }
    yoyo: function (str){
        console.log(str);
    }
  }
});

也就是說,在return以上的function是可以在同一個return內部同一function裡相互間call,但是寫在其他地方的function則無法call,基於這個原因,我的建議是,這部份盡量採取把”執行”和”call”分開架構格式,像是:

define(function () {
   function tools(str) {
      console.log(str);
    };
    //以上寫執行內容

  return {
    tools: function (str) {
      tools(str);
    }
    //以上負責call function
  }
});

首先define到return之間,把它想像成專放負責”執行”的程式,而return以下的就是專門放”call” functions,這樣可以很清楚的分類架構.

補充幾點:

若你在html端上有設定onclick事件(DOM 0級的),像是:

<button id="thisbtn" onclick="hihi();">yoyo</button>

請注意這時候的hihi function一定要在require外面,他才會被導向此function,像是:

function yoyhihi(){
        alert('yoyo');
};
require(["jquery.alpha","jquery.beta"], function(a,b) {
    //不能放這裡面,他會抓不到       
});

這樣的話代碼變成很難控管,所以盡量不要用DOM 0級方法寫,用addEventListner去做監聽event方法較佳!

4.結論

根據上述初步學習requireJS的調用架構,我們可以有一些心得,RequireJS可以讓你快速看出程式來源.方便修改,不過相對的代價就是,在建立function時會比直接寫還要花較多的時間,因此:

1.如果你的專案前端的js function非常的少.很輕量那麼我建議不要用RequireJS,這會大大降低開發速度

2.如果你的專案前端js系統非常複雜,日後維護已經達到找文件都非常耗時時,就用它吧!

至於專案的大小區別,最好的方式就是一開始盡量評估準確!

Comments

Copyright © 2013 Mr.Blue Design credit: Blue Chen