RequireJS 基礎學習

來源:互聯網
上載者:User

標籤:


? 1、起步?

2、基本配置

// Defaults. Do not set a default for map  config to speed up normalize(), which will run faster if there is no default.

// normalize 是一個對模組進行正式名稱的函數,比如他會根據函數的名稱進行取名標記! 

config = {

                waitSeconds: 7,

                baseUrl: ‘./‘,

                paths: {},

                bundles: {},

                pkgs: {},

                shim: {},

                config: {}

            },

注意

1)baseUrl 如果沒有手工配置那麼就是當前路徑,個人覺得baseUrl最好採用絕對路徑,也就是 /project/

2)path 顯示指定模組的路徑,比如註冊 jquery,那麼必須知道jquery的路徑才能運行jquery的檔案,當然可以不配置這個路徑,因為requireJS在組件定義define的時候,預設把檔案名稱作為組件名稱,然後在調用組件的時候require根據依賴的組件名稱在設定的目錄下去尋找該js,所以,define、require 告訴我們命名規範很重要!

3)jQuery 預設支援AMD 規範,在jQuery源碼裡面可以看到,自己註冊了AMD,但是這裡註冊有個問題,那就是預設為“jquery”,原因就是因為AMD預設使用檔案名稱作為JS的定義,剛好,jQuery的檔案名稱就是小寫形式,所以為了編碼誤會,採用這種小寫方式註冊!

(注意雖然 jQuery 註冊了AMD,但是jQuery同樣註冊了全域變數,所以在任何地方都可以使用$ )


3、函數介紹

1)requirejs.config , 這就是一個重寫,覆蓋預設配置選項,最常用的就是baseUrl 以及 path

2)define(name , deps ,callback),第一個是模組的名字,預設為檔案名稱,其實就是模組唯一的ID,第二個就是依賴項,第三個是會調函數,而且依賴項作為參數傳入回呼函數中。當通過require依賴需要哪個模組時,首先就是載入name的script標籤,其次載入依賴項的標籤,等所有js檔案載入完成,那麼就開始進行調用回調方法!內部是這樣的,把所有依賴項都儲存在一個數組中,每載入一個依賴項就把數組減少一個,直到所有都載入完成!

3)require(deps ,callback) ,  第一個是一個依賴數組,requireJS首先會根據數組的每一項依賴進行js檔案載入,這個時候如果path中配置會從path 中尋找,如果沒有配置就會以此名稱為路徑名稱在當前路徑下尋找,這些js的載入其實就是通過

建立script標籤完成(所謂的非同步載入),每載入的js檔案都會註冊一個事件onScriptLoad,載入之後立即調用define方法,同樣也是載入JS標籤,他們的載入順序是根據註冊的順序,換句話如果A依賴B,那麼先載入A後載入B,不用擔心報錯,因為他們的調用是在依賴完全載入之後才會回呼函數,同樣在添加標籤時,還會為這個js載入完成註冊一個事件:

node.addEventListener(‘load‘, context.onScriptLoad, false); 直到所有依賴項都載入完成,才會調用回調方法!

其中,getScriptData 首先是移除剛剛註冊的事件,其二是返回script標籤以及模組的id名稱,也就是data.id;接著繼續執行completeLoad ,這裡才會真正去執行回調方法!

4 )根據模組名稱返迴路徑 

url = context.nameToUrl(normalizedName);

5 )相對當前模組的相對路徑,檔案不一定存在

url = require.toUrl("./style.css");


4、載入機制

1)首先通過jsp定義的data-main 以及 src 的script載入require.js ,以及通用配置項和require函數

2)解析require函數時,為每個依賴項建立script標籤,建立script標籤時為該node定義載入事件

3)一旦標籤寫入html中,就會非同步載入,載入過程中RequireJS會根據onreadystatechange監聽狀態

4)一旦load完成,那麼就執行js裡面的代碼,因為是載入組件,所以首先執行的就是define

5)RequireJS解析define函數,只是把一些依賴項加入一個全域的隊列當中

6)載入完成之後,同時define也解析完成之後,那麼之前的onScriptLoad事件監聽就會被執行,

7)onScriptLoad其一就是擷取這script的模組getScriptData,其二就是遍曆全域隊列,運行每一個依賴項

8)依賴項如果又是一個模組,那麼和之前載入依賴項的步驟完全相同(建立標籤、註冊事件),直到所有的依賴項都載入完成

9)以上調用就是一個遞迴的過程,所以一旦所有都調用完成,依賴都載入完畢,那麼當前項的回呼函數就會被執行!




RequireJS 基礎學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.