亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

Require.js

2024-04-27 15:06:30
字體:
來源:轉載
供稿:網友
隨著網址功能的日漸豐富,頁面的 js 也變的越來越復雜和臃腫,原本通過 script 標簽來導入 js 文件的方式已經不能滿足我們的開發需求了,我們需要團隊合作、模塊復用、單元測試等等一系列復雜的需要,所以 Require.js 就應運而出了。 RequireJS 是一個非常小巧的 javascript 模塊載入框架,是 AMD(Asynchronous Module Definition,異步模塊加載機制)規范最好的實現之一。最新版的 requireJS 壓縮后只有 14k,堪稱非常輕量。它還同時可以和其他的框架協調工作,使用 requireJS 必將使我們的前端代碼質量得以提升。

RequireJS 的好處 Requires 官方網站這樣說的: (RequireJS is a Javascript fileand module loader. It is optimized for in-browser use, but it can be used in other JavaScript environments, like Rhino and Node. Using a modular script loader like RequireJS will imPRove the speed and quality of your code.)RequireJS 是一個 JavaScript 模塊加載器。它非常適合在瀏覽器中使用,但它也可以用在其他腳本環境, 就像 Rhino and Node. 使用 RequireJS 加載模塊化腳本將提高代碼的加載速度和質量。

RequireJS 的初識~~不勝風情 首先我們先使用一個普通的頁面來看看:

<!doctype html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="js/test01.js"></script> </head> <body> <h1>Hello requireJS</h1> </body> </html>

test01文件:

(function(){ function fn1() { alert("Hello requirejs~~~"); }; fn1(); })();

使用閉包寫了一個最簡單的函數,彈出一句話,我們使用閉包的好處就是避免全局變量的出現,這樣就防止了全局變量的污染。 在這段代碼中,我們導入了一個 test01.js 文件,當我們打開頁面時,引入的test01.js 文件加載成功; 這里寫圖片描述 我們發現頁面上的內容沒有輸出,js 彈出框在等待用戶的點擊后,頁面才會繼續運行,這樣的結果我們不能接受,因為 js 一般和頁面的加載關,我們應該讓頁面繼續加載,js 執行自己就行了,但是現在阻塞住了頁面的繼續加載,如果某個 js 文件報錯,很有可能導致頁面的正常加載和運行,這是我們不能接受的。 那么如果我們使用 requireJS 呢?首先我們來演示下,大家來看看:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"src="js/require2.1.11.js"> </script> <script type="text/javascript"> require(["js/test02"]); </script> </head> <body> <h1>Hello requireJS</h1> </body> </html>

test02.js 文件:

define(function(){ function fn1() { alert("Hello requirejs~~~"); fn1(); });

我們看出,首先頁面上不再導入 test02.js,只是導入了 requireJS,其次在 javascript 中我們使用 require()方法,在其中傳遞了一個數組的參數,實參為我們要導入的 js 文件的【路徑+文件名稱(后綴名可帶可不帶,不建議寫,因為后面的網絡訪問時不能寫,為了保持一致,不建議帶)】 ,這樣就完成了 requireJS 的使用,那么運行效果如何呢? 這里寫圖片描述

我們發現此時的頁面加載已經完成了,并不像前面我們傳統的一樣在等待 js 運行完成后頁面再加載,而是頁面加載完成后才運行 js 代碼,這樣在運行效率上就大大的提高了。 這里寫圖片描述

回過頭來我們看看 test02.js,我們發現和 test01.js 寫法不同的是閉包—()();的寫法改成了 define();在 define 函數中傳遞匿名函數完成操作,這個變化不大,大家應該很好能接受。 基本 API requireJS 會定義三個變量:define、require、requirejs。

1 require === requirejs,一般使用 require 更簡短。 2 define 從名字就可以看出這個 api 是用來定義一個模塊。 3 require 加載依賴模塊,并執行加載完后的回調函數。

前面我們寫的 test02.js:

define(function(){ function fn1() { alert("Hello requirejs~~~"); } fn1(); });

就是使用 define 來定義了一個模塊,然后使用 require 來引用

<script type="text/javascript"> require(["js/test02"]);//參數為一個數組 </script>

來加載該模塊(注意 require 中的依賴是一個數組,即使只有一個依賴,你也必須使用數組來定義),requir API 的第二個參數是 callback,一回調函數,是用來處理加載完畢后的邏輯,如:

require(["js/test02.js"],function(){ alert("js加載完成"); });

當所有的模塊都加載完成后就會觸發這個函數。同樣存在了第三個參數,也是一個callback 函數,這個是來處理加載失敗后的情況的,如:

require(["js/test03"],function(){ alert("js加載完成"); },function(){ //當沒有加載成功后就會觸發 //失敗的話,在這個函數中處理 alert("加載失敗~~~"); });

此時 test03.js 不存在,頁面肯定加載不成功,所以會觸發第三個參數。 加載網絡文件 之前的例子中加載模塊都是本地 js,但是大部分情況下網頁需要加載的 JS 可能來自本地服務器、其他網站或 CDN,這樣就不能通過這種方式來加載了,我們以加載一個 jquery 庫為例: *//百度cdn公共庫jQuery地址: http://apps.bdimg.com/libs/jquery/2.1.1/jquery.js //jQuery官方地址: https://code.jquery.com/jquery-3.1.1.js*

//注意:網絡上去取時不能加后綴,否則取不到 require.config({ paths : { //為網絡上的庫去一個名字:jquery "jquery" : ["https://code.jquery.com/jquery-3.1.1"] } }); // require(["jquery","js/test01","js/test02"],function(){ alert("頁面加載成功~~"); },function(){ alert("頁面加載失敗~~") });

在取網絡上的文件時注意: 1、 config 方法的參數是一個對象 2、 paths 的值也是一個對象 3、 當我們為網絡上的庫取名字是任意,但是建議取有意義的名字,別人可以通過名稱知道你的網絡資源是什么資源 4、 庫的值是一個數組,意味著可以多個同時寫,防止網絡異常取不到 5、 特別注意:網絡資源路徑不能帶后綴名,否則取不到 6、 我們也可以先讓去網絡中去取,如果取不到,再在本地取,減輕本地服務的壓力(屬于項目優化)

require.config({ paths : { //這樣配置,減輕本地服務器的壓力 "jquery" :["https://code.jquery.com/jquery3.1.1.js", "js/jquery-1.8.3"] } }); require(["jquery","js/test01","js/test02"],function(){ alert("頁面加載成功~~"); },function(){ alert("頁面加載失敗~~") });

同樣我們也可以將本地的配置到 paths 中:

require.config({ paths : { //這樣配置,減輕本地服務器的壓力 "jquery" : ["https://code.jquery.com/jquery-3.1.1","js/jquery-1.8.3"], //將本地的js文件同樣配置,之后引用 "test01" : ["js/test01"], "test02" : ["js/test02"] } }); // require(["jquery","test01","test02"],function(){ alert("頁面加載成功~~"); },function(){ alert("頁面加載失敗~~") });

全局配置 上面的例子中重復出現了 require.config 配置,如果每個頁面中都加入配置,必然顯得十分不雅,requirejs 提供了一種叫”主數據”的功能,我們首先創建一個 main.js:

require.config({ paths : { //這樣配置,減輕本地服務器的壓力 "jquery" : ["https://code.jquery.com/jquery-3.1.1","js/jquery-1.8.3"], //將本地的js文件同樣配置,之后引用 "test01" : ["js/test01"], "test02" : ["js/test02"] } });

然后再頁面中使用下面的方式來使用 requirejs:

<script type="text/javascript" src="js/require2.1.11.js" ></script> <script type="text/javascript" src="js/main.js" ></script> <script type="text/javascript"> require(["jquery","t1","t2"],function(){ alert("頁面加載成功~~"); },function(){ alert("頁面加載失敗~~") }); </script>

在官方提供了一種基于標簽屬性的方式:

<script data-main="js/main" src="js/require2.1.11.js" ></script>

將所有的配置和導入 js 都放在了 main.js 中,這樣在頁面只要這樣一個標簽就行了。 第三方模塊 通過 require 加載的模塊一般都需要符合 AMD 規范即使用 define 來申明模塊,但是部分時候需要加載非 AMD 規范的 js,這時候就需要用到另一個功能:shim,shim 解釋起來也比較難理解,shim 直接翻為”墊”,其實也是有這層意思的,目前我們主要用在兩個地方 非 AMD 模塊輸出,將非標準的 AMD 模塊”墊”成可用的模塊,例如:在老版本的jquery 中,是沒有繼承 AMD 規范的,所以不能直接 require[“jquery”],這時候就需要 shim,比如我要是用 underscore 類庫,但是他并沒有實現 AMD 規范,那我們可以這樣配置`

require.config({ shim: { "underscore" : { } } })

這樣配置后,我們就可以在其他模塊中引用 underscore 模塊: require

require(["underscore"], function(_){ _.each([1,2,3], alert); })

插件形式的非 AMD 模塊,我們經常會用到 jquery 插件,而且這些插件基本都不符合AMD 規范,比如 jquery.form 插件,這時候就需要將form 插件”墊”到 jquery 中:

require.config({ shim: { "underscore" : { exports : "_"; "jquery.form" : { deps : ["jquery"] } } })

也可以簡寫為:

require.config({ shim: { "underscore" : { exports : "_"; }, "jquery.form" : ["jquery"] } })

這樣配置之后我們就可以使用加載插件后的 jquery 了

require.config(["jquery", "jquery.form"], function($){ $(function(){ $("#form").AjaxSubmit({...}); }) })

其他內容 在回調函數中,我們可以再對應的參數得到加載的 js 對象,如第一個就是 jQuery 對象,第二個和第三個我們自己的 js 中沒有返回對象,所以為 undefined。

<script type="text/javascript" src="js/require2.1.11.js" ></script> <script type="text/javascript" src="js/main.js" ></script> <script type="text/javascript"> require(["jquery","t1","t2"],function($,t1,t2){ //我們在回調函數中可以傳遞參數,這些參數就是require方法中的js對象,如jQuery對象 alert($("body").html()); },function(){ alert("頁面加載失敗~~") }); </script>

還是就是在 define 函數中同樣可以傳遞一個數組參數,這個數組參數就是在前面我們已經 config 過的 js 庫或者我們本地的 js 文件,如:

//將要使用的庫可以再這兒引入 define(["jquery"],function($){ function fn1() { alert("Hello requirejs~~~***"); } //alert($(window).scrollTop()); fn1(); });

這樣我們在 define 中制作 jQuery 的插件的話,就可以直接使用了


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲天堂| 国产精品色视频| 91产国在线观看动作片喷水| 欧美性猛交xxxx富婆| 91在线视频九色| 国产精品视频一区二区三区四| 久久精品在线播放| 亚洲欧美日韩在线一区| 欧美黑人狂野猛交老妇| 久久久久久国产免费| 97视频色精品| 国产综合福利在线| 国产亚洲一级高清| 欧美性xxxx| 深夜福利亚洲导航| 久久精品亚洲国产| 国产精品成人在线| 国产99久久精品一区二区永久免费| 亚洲老板91色精品久久| 欧美日韩国产精品一区二区三区四区| 91视频国产精品| 日韩欧美在线视频免费观看| 亚洲国产一区自拍| 91久久精品国产| 久久成人这里只有精品| 国产精品视频yy9099| 国产成人+综合亚洲+天堂| 国产日韩欧美电影在线观看| 欧美亚州一区二区三区| 亚洲国产精品电影| 97人人做人人爱| 日韩免费精品视频| 国产精品青草久久久久福利99| 97精品一区二区三区| 色香阁99久久精品久久久| 国产精品美女免费视频| 亚洲精品wwwww| 懂色av中文一区二区三区天美| 亚洲第一页中文字幕| 久久99久久99精品中文字幕| 夜夜嗨av色综合久久久综合网| 久久电影一区二区| 成人性生交xxxxx网站| 97在线视频免费播放| 亚洲精品二三区| 欧美日韩在线视频一区| 一区二区欧美日韩视频| 久久久久久18| 亚洲精品日韩激情在线电影| 欧美日韩国产丝袜美女| 精品久久久久久中文字幕大豆网| 欧美大片在线免费观看| 欧美大片免费观看在线观看网站推荐| www.日韩系列| 亚洲美女激情视频| 日韩在线欧美在线国产在线| 亚洲 日韩 国产第一| 国产精品高清网站| 亚洲欧美激情另类校园| 色偷偷噜噜噜亚洲男人| 久久人人爽人人爽人人片av高请| 亚洲精品久久久一区二区三区| 色无极影院亚洲| 久久亚洲精品一区| 亚洲国产成人精品久久| 欧美电影免费观看大全| 日韩欧美极品在线观看| 日韩欧美国产成人| 日韩的一区二区| 国产97在线播放| 久久精品色欧美aⅴ一区二区| 中文字幕9999| 久久99国产精品自在自在app| 欧美高清视频在线播放| 国产日韩中文字幕| 91精品久久久久久久久青青| 69久久夜色精品国产69乱青草| 国产亚洲欧美日韩一区二区| 欧美精品在线免费播放| 欧美性视频在线| 国产香蕉精品视频一区二区三区| 自拍视频国产精品| 久久久久免费视频| 欧美电影免费看| 成人写真视频福利网| 国产精品精品久久久| 黑人巨大精品欧美一区二区| 国产欧美精品在线| 欧美午夜性色大片在线观看| 亚洲最新av在线| 欧美一区二区视频97| 久久久国产视频91| 国产精品美女999| 在线观看欧美日韩| 国产精品成人va在线观看| 色综合视频一区中文字幕| 91精品国产91久久| 中文字幕亚洲专区| 最近的2019中文字幕免费一页| 亚洲欧美变态国产另类| 欧美在线视频导航| 日韩中文字幕精品| 欧美一级免费看| 日本高清视频精品| 亚洲综合日韩中文字幕v在线| 色无极亚洲影院| 91在线观看免费高清完整版在线观看| 久久久精品一区| 91精品国产高清自在线看超| 欧美极品在线视频| 91在线精品视频| 欧美精品福利在线| 欧美日韩在线第一页| 欧美成人精品一区二区三区| 国产成人在线一区| 久久久久免费精品国产| 欧美激情中文字幕乱码免费| 亚洲日本成人女熟在线观看| 国产精品国产三级国产aⅴ9色| 国产免费成人av| 色综合久综合久久综合久鬼88| 97成人在线视频| 欧美怡春院一区二区三区| 日韩欧美国产一区二区| 久久亚洲精品国产亚洲老地址| 都市激情亚洲色图| 91成人福利在线| 欧美成人h版在线观看| 国产精品第2页| 日韩视频免费在线观看| 欧美激情乱人伦一区| 国产日韩欧美91| 色综合导航网站| 国产欧美久久一区二区| 另类视频在线观看| 欧美亚洲另类激情另类| 久久久久久久一| 亚洲美女动态图120秒| 欧美亚洲日本网站| 欧美成人精品不卡视频在线观看| 亚洲欧美变态国产另类| 亚洲视频一区二区三区| 日本最新高清不卡中文字幕| 97视频在线看| 伊人伊成久久人综合网小说| 欧美精品www| 91精品国产91久久| 亚洲国产精品99久久| 欧美日韩久久久久| 欧洲成人午夜免费大片| 亚洲bt天天射| 国产黑人绿帽在线第一区| 欧美成人第一页| 欧美一区二区大胆人体摄影专业网站| 欧美与欧洲交xxxx免费观看| 好吊成人免视频| 日韩欧美在线视频免费观看| 久久久精品电影| 久久久久国产精品免费网站| 国产精品一区二区三区在线播放| 九九视频直播综合网| 久久成人人人人精品欧| 黑人精品xxx一区一二区| 欧美性猛交xxxx黑人猛交|