您好,登錄后才能下訂單哦!
小編給大家分享一下Require.js有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一:什么是require.js
①:require.js是一個js腳本加載器,它遵循AMD(Asynchronous Module Definition)規范,實現js腳本的異步加載,不阻塞頁面的渲染和其后的腳本的執行,并提供了在加載完成之后的執行相應回調函數的功能;
②:require.js要求js腳本必須要實現模塊化,即文件化;而require.js的作用之一就是加載js模塊,也就是js文件。
③:require.js可以管理js模塊/文件之間的依賴;即不同的框架例如Jquery,AngularJs等采用了不同的語法,而使用這些語法的js文件在導入時必須排在Jquery.js或Angular.js之后才能順利執行,require.js則能夠解決排序依賴問題。
二:為什么要使用require.js
①:加載的時候,瀏覽器會停止網頁渲染,原因如下:
在不使用require.js時,文件編寫方式如下:
<!DOCTYPE html> <html> <head> <script type="text/javascript" src="a.js"></script> </head> <body> <span>Hellow World</span> </body> </html>
在導入的a.js文件中:
(function(){ function fun1(){ alert("JS文件已生效"); } fun1(); })()
在運行以上代碼時我們可以注意到在alert彈出的提示框出現的時候,網頁html的部分仍然是空白的,沒有顯示出任何內容,當我們點擊確定之后"Hellow World"才會顯示在網頁中,這就是JS阻塞瀏覽器渲染導致的結果。加載文件越多,網頁失去響應的時間就會越長。
②:由于js文件之間存在依賴關系,因此必須嚴格保證加載順序,依賴性最大的模塊一定要放到最后加載,當依賴關系很復雜的時候,代碼的編寫和維護都會變得困難。例如:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script type="text/javascript" src="js/jquery-1.10.2.js" ></script> <script type="text/javascript" src="js/b.js" ></script> </head> <body> <div id="div1" ></div> </body> </html>
在b.js文件中
$(function(){ $("#div1").css("background-color","blue"); })
為了使b.js中的代碼生效,必須要把<script type="text/javascript" src="js/b.js" ></script>這行代碼放到<script type="text/javascript" src="js/jquery-1.10.2.js" ></script>后面,這樣在使用的框架和js文件較多的時候,它們的導入順序就會變得很麻煩。
require.js的誕生就是為了解決上面所說的兩個問題:
1.實現js文件的異步加載,避免網頁失去響應;
2.管理模塊之間的依賴性,便于代碼的編寫和維護。
三:require.js的加載
①:首先,我們要去官網下載最新的版本,官方網址:http://requirejs.org/docs/download.html
下載完成后,將它放在網站項目的js子文件夾下就可以使用了:
<script src="js/require.js"></script>
這里可能會遇到一個問題:加載這個文件,也可能造成網頁失去響應,這個問題的解決辦法有兩種:
1.將這行代碼寫成如下格式:
<script src="js/require.js" defer async="true" ></script>
其中:async屬性和defer屬性表明這個文件需要異步加載,避免網頁失去響應。IE只支持defer屬性,而不支持async屬性。
2.將文件放到網頁底部加載。
②:加載完require.js之后,我們就可以加載自己的代碼了,假設我們自己的js文件命名為main.js,同樣放于js文件夾下,那么,只需要執行如下代碼:
<script src="js/require.js" data-main="js/main"></script>
上述代碼中,data-main屬性的作用是指定網頁程序的主模塊。即js目錄下面的main.js,這個文件會第一個被require.js加載。由于require.js默認的文件后綴名是js,所以可以省略掉".js"簡寫成main。
四:基本API
在上一部分中,我們引入了main.js文件,main.js的寫法:
define(function(){ function fun1(){ alert("main.js已生效"); } fun1(); })
這樣,我們就通過define函數定義了一個模塊,然后在頁面中通過AMD規范定義的的require()函數使用:
require(["js/main"]);
一般情況下,它會依賴于其他的js框架,比如jquery等等,那么,我們這時就要在頁面文件中。我們需要按照以下格式來寫:
require(['A', 'B', 'C'], function (A, B, C){ // js代碼 });
require()函數接受兩個參數。第一個參數是一個數組,表示所依賴的框架,上例就是['A', 'B', 'C'],即main.js里的代碼需要用到這三個模塊;第二個參數是一個回調函數,當前面指定的模塊都加載成功后,它將被調用。加載的模塊會以參數形式傳入該函數,從而在回調函數內部就可以使用這些模塊。
require()會異步加載A,B,C三個模塊,瀏覽器不會失去響應;它指定的回調函數,只有前面的模塊都加載成功后,才會運行,解決了依賴性的問題。
下面。我們就以jquery為例,說明這個函數是怎樣運行的:
require(['jquery'], function ($){ // jquery代碼 });
require.js會先加載jQuery,然后再運行回調函數。main.js的代碼就寫在回調函數中。注意:require中的依賴是一個數組,即使只有一個依賴,你也必須使用數組來定義。
五:加載文件
在上一部分中,main.js的依賴模塊是['jquery']。默認情況下,require.js會假定這個模塊與main.js在同一個目錄,文件名是 jquery.js,然后自動加載,除此之外,我們可以通過require.config()方法,我們可以對模塊的加載行為進行自定義,require.config()就寫在main.js的頭部,它的參數是一個對象,這個對象的paths屬性指定各個模塊的加載路徑。
require.config({ paths: { "jquery": "jquery.min", "anjular": "anjular.min" } });
上述模塊路徑默認與main.js在同一個目錄(js子目錄)。如果這些模塊在其他目錄,比如js/lib目錄,則有兩種寫法。一種是逐一指定路徑:
require.config({ paths: { "jquery": "lib/jquery.min", "anjular": "lib/anjular.min" } });
另一種則是直接改變根目錄(baseUrl):
require.config({ baseUrl: "js/lib", paths: { "jquery": "jquery.min", "anjular": "anjular.min" } });
之前的例子中加載模塊都是本地js,但是大部分情況下網頁需要加載的JS可能來自本地服務器、其他網站或CDN,這樣就不能通過這種方式來加載了,我們以加載一個jquery庫為例:
require.config({ paths : { "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"] } })
上面的例子中重復出現了require.config配置,如果每個頁面中都加入配置,必然會十分麻煩,requirejs提供了一種叫"主數據"的功能,我們可以將所有的require.config配置放到main.js中,在頁面中調用它,
<script data-main="js/main" src="js/require.js"></script>
就可以使每一個頁面都使用這個配置,然后頁面中就可以直接使用require來加載所有的短模塊名。
六:AMD模塊的寫法
require.js加載的模塊,采用AMD規范,也就是說,模塊必須按照AMD的規定來寫。具體來說,就是模塊必須采用特定的define()函數來定義。如果一個模塊不依賴其他模塊,那么可以直接定義在define()函數之中。假定現在有一個math.js文件,它定義了一個math模塊。那么,math.js就要這樣寫:
define(function (){ var add = function (x,y){ return x+y; }; return { add: add }; });
然后在頁面中:
require(['math'], function (math){ alert(math.add(1,1)); });
如果這個js文件還依賴其他模塊,那么define()函數的第一個參數,必須是一個數組,指明該模塊的依賴性。
define(['jquery'], function($){ $("#div1").css("background-color","red"); })
當require()函數加載上面這個模塊的時候,就會先加載jquery.js文件。
七:第三方模塊
通過require加載的模塊一般都需要符合AMD規范即使用define來申明模塊,但是部分時候需要加載非AMD規范的js,這時候就需要用到另一個功能:shim:
1. 非AMD模塊輸出,將非標準的AMD模塊變成可用的模塊,例如:在老版本的jquery中,是沒有繼承AMD規范的,所以不能直接require["jquery"],這時候就需要shim
require.config({ shim: { "jquery" : {exports : "$"} } })
這樣配置后,我們就可以在其他模塊中引用jquery模塊:
require(["jquery"], function(_){ $("#div1").css("background-color","red"); })
2.插件形式的非AMD模塊,我們經常會用到jquery插件,而且這些插件基本都不符合AMD規范,比如jquery.form插件,這時候就需要將form插件加入到jquery中:
require.config({ shim: { "jquery.form" : { deps : ["jquery"] } } }) require.config(["jquery", "jquery.form"], function($){ $(function(){ $("#form").ajaxSubmit({...}); }) })
以上是“Require.js有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。