由於筆者也是初學RequireJS,所以在某些概念上來說,筆者也是拿不準啊,所以主要是在官網以及前輩的一些博客中吸取精華,加上一些自己的理解以及案例的製作,那麼下面主要給一些我自學的一些鏈接吧
requireJs是一個採用了javascirpt AMD(Asynchronous Module Definition)規範編寫的類庫,那麼要求的就是在採用requireJS分模塊加載類庫的時候,加載的類庫就必須是符合AMD規範的,比如說jquery在1.7版本之後就採用了AMD的規範來編寫類庫,那麼名正言順的採用requireJs來模塊話加載jquery的庫文件就不存在什麼問題,但是並不是所有的js文件都是符合AMD規範的,那麼在requireJS加載之後就不會起到什麼作用,當然也可以通過一些其他的方法來加載那麼沒有使用AMD編寫的js庫文件,這個在後面的一些文章中將會講到。
一、什麼是AMD
那麼既然requireJs使用AMD實現的一個類庫,所以我們首先得明白什麼是AMD,下面就是我引用的一段話,至於這段話是在哪看到之後然後順便做成了txt保存下來當時也沒有記錄。
就我的理解來說,傳統的javascript加載情況下,js文件都是按照前後順序來加載的,意思就是說只有當第一個js文件加載完成,才能加載第二個js文件,這樣的好處是保證了js的文件依賴順序,但是同時也顯露出一個問題,就是如果第一個js文件的加載時間過長,那麼勢必會造成第二個js文件的加載執行,如果js是在放在dom渲染之前,那麼可能出現的結果就是在js未完成加載的情況下,整個頁面會出現一片空白的情況。
那麼,requireJS是怎麼樣加載的呢?requireJs採用的是異步的方式進行加載,使得彼此之間的js加載不收影響,代碼也不會一直阻塞,同時requireJs提供了回調的機制,使得只有在需求的模塊加載完成之後,纔會執行相應的代碼,那麼就在異步的基礎上保證了js文件的依賴性。
可以通過如下的一張圖清晰的看出requireJS的加載情況:
二、最簡單的requireJS入門案例
目錄結構如下:
js
|------app
| |------test1.js
| |------test2.js
|------lib
| |------jquery.js
|------app.js
|------require.js
在js目錄下有一個app的文件夾,app的文件夾下有兩個js文件,lib文件夾下有jquery.js文件,另外在js的一級目錄下有app.js入口js文件以及require.js文件,index.html與js是同級目錄
① 加載requireJs的庫文件(從這裏下載)
- <script src="js/require.js" data-main="js/app" defer ascyn="true"></script>
在這裏需要注意幾點:
-
ReuqireJS以一個相對於baseUrl的地址來加載所有的代碼。頁面頂層<script>標籤含有一個特殊的屬性data-main,require.js使用它來啓動腳本加載過程,而baseUrl一般設置到與該屬性相一致的目錄。
注: baseUrl亦可以通過config設置。如果沒有顯示指定config及data-main,則默認的baseUrl爲包含RequireJs的那個HTML頁面。
從上面就可以看出:那麼現在的baseUrl就是js文件夾,如果這裏面沒有data-main存在的話,那麼就是包含了requirejs的html頁面,也就是與js同級的index.html所在的目錄。
-
RequireJs默認嘉定多有的依賴資源都是js腳本,因此無需再module ID上再加".js"後綴,RequireJs在進行module ID到path的解析時會自動不上後綴。上面的data-main中加載的文件實際上是"js/app.js"。
② app.js中編寫相應js代碼,就可以直接輸出了
app.js
- console.log("hello requireJs");
你會看到在控制檯輸出了"hello requireJs",至此一個最簡單的requireJS使用案例就到此爲止了。
頁面加載的順序就是index.html--->require.js--->app.js,然後是輸出。
OK,這一節就介紹這麼多,下一節來看看requireJs中的data-main屬性以及模塊定義。