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

首頁 > 編程 > JavaScript > 正文

基于RequireJS和JQuery的模塊化編程――常見問題全面解析

2019-11-20 10:15:46
字體:
來源:轉載
供稿:網友

由于js的代碼邏輯越來越重,一個js文件可能會有上千行,十分不利于開發與維護。最近正在把邏輯很重的js拆分成模塊,在一頓糾結是使用requirejs還是seajs的時候,最終還是偏向于requirejs。畢竟官方文檔比較專業嘛...

不過即便是有完整的官方文檔,仍然遇到不少的問題,比如jquery-ui的使用。

下面就循序漸進的講解一下我遇到的問題,以及解決的辦法。

關于AMD和CMD的理解

AMD(異步模塊定義)的典型就是requirejs,而CMD(通用模塊定義)的典型是淘寶的seajs。

他們的相同點是,都會異步的加載js。但是不同點是,require.js加載完會立即執行;而seajs則是等到進入主函數需要執行時才執行。

如果使用seajs初始的加載執行效率會比較高,但是在使用的過程中可能會取執行js,因此可能會出現卡頓,影響用戶體驗(由于我也沒試過,要是說錯了,別見怪)。而requirejs則是在一開始就把所有加載的js都執行,這時,如果你的模塊中有一些執行方法,它們可能并不會按照你想的順序執行。

因此,如果已經習慣了異步編程,并且希望有完善的文檔推薦使用requirejs;如果是想對執行順序有特殊要求,又方便開發,那么也可以使用seajs。

如何解決requirejs中循環依賴問題

如果你定義的某個a模塊使用到了b模塊,而b模塊又使用了a模塊,那么就會拋出循環依賴的異常。

比如,我這里寫了一個循環依賴的例子。

主頁面:

<!DOCTYPE html><html><head></head><body><script data-main="test.js" src="lib/require.js"></script></body></html>

主方法:

requirejs.config({  baseUrl: './'});requirejs(['js/a'],function (a){  console.log("in test");  a.testfromb();});

a.js模塊中,atest()方法提供b調用、testfromb()方法調用b的方法

define(function(require){  var b = require("js/b");  console.log("in a");  return {    atest:function(){      console.log("test in a");    },    testfromb:function(){      console.log("testfromb in a");      b.btest();    }  }});

b模塊中,調用了a的方法。

define(function(require){  var a = require("js/a");  console.log("in b");  return {    btest:function(){      console.log("test in b");      a.atest();    }  }});

這樣相當于a調用了b的方法,但是b的方法依賴于a的方法,這就造成了循環依賴。瀏覽器會提示錯誤:

Uncaught Error: Module name "js/a" has not been loaded yet for context: _

按照官方文檔的說法,這種屬于設計的問題,應該盡量避免。那么如果避免不了該怎么辦呢?可以這樣修改b模塊:

define(function(require){  // var a = require("js/a");  console.log("in b");  return {    btest:function(){      console.log("test in b");      require("js/a").atest();    }  }});

這里是等到執行atest()方法時,才加載a模塊。這時,a模塊很顯然已經加載完了 ??梢钥吹捷敵龅男畔ⅲ?/p>

in ba.js:3 in atest.js:6 in testa.js:9 testfromb in ab.js:6 test in ba.js:6 test in a

同樣的方式,修改a可能就不好使了。這時因為模塊加載的順序是從b開始的。

關于循環依賴的源碼可以參考云盤

如何在requirejs中使用jquery

如果想要使用jquery比較簡單,直接在main.js中添加對應的依賴即可:

requirejs.config({  baseUrl: './',  paths:{    'jquery':'lib/jquery'  }});requirejs(['jquery'],function ($){  $('#test').html('test');});
如何在requirejs中使用jquery插件對于jquery的插件,比較常見的做法都是傳入一個jquery的對象,在這個jquery對象的基礎上添加插件對應的方法。首先需要添加jquery插件的依賴,這里用兩個插件舉例子――jquery-ui和jquery-datatables
requirejs.config({  baseUrl: './',  paths:{    'jquery':'lib/jquery',    'jquery-ui':'lib/jquery-ui',    'jquery-dataTables':'lib/jquery.dataTables'  },  shim:{    'jquery-ui':['jquery'],    'jquery-dataTables':['jquery']  }});requirejs(['jquery','jquery-ui','jquery-dataTables'],function ($){  ....});
由于jquery插件都需要依賴于jquery,因此可以在shim中指定依賴關系。除了上面這種使用方法,也可以使用commonJS風格的調用:
define(function(require){  var $ = require('jquery');  require('jquery-ui');  require('jquery-dataTables');      //下面都是測試,可以忽略  var _test = $('#test');  _test.selectmenu({    width : 180,    change : function(event, ui) {      console.log('change');    }  });  return {    test:function(){      //測試jquery-ui      _test.append($('<option>test1</option><option>test1</option>'));      _test.selectmenu("refresh");      //測試jquery-datatables      var _table = $('table');      _table.dataTable();    }  }});

不過,執行上面的代碼,會報一個異常:

Uncaught TypeError: _table.dataTable is not a function

這是因為,dataTables并不是一個require風格的模塊,因此直接這樣引入,并不會執行它內部的匿名函數??梢孕薷乃哪涿瘮?,傳入$對象,在最后一行:

*/  return $.fn.dataTable;//}));原來是這樣}($)));//這里增加執行這個匿名函數,并且傳入$對象。}(window, document));

這也是在網上搜的方法,原理奈何經驗不足....

樣例代碼可以參考云盤,由于引入的資源不是很全,所以會報錯,可以直接忽略,因為能執行UI插件就表示已經成功了。

requirejs使用jquery-ui的問題

由于requirejs加載js文件后會立即執行,如果你的jquery ui 插件需要刷新DOM頁面,那么可能會導致頁面的事件失效。

比如,你的模塊在加載后,對頁面的某個元素$('#test')綁定了click事件。但是使用了某個UI插件,這個插件會重新渲染DOM元素,test對應的click事件就失效了。

解決辦法:

•把事件綁定推遲到DOM元素渲染完后再手動觸發綁定;
•也可以使用事件捕獲代替DOM元素的事件綁定(太麻煩了...不推薦)。

比如在DOM重構的JS模塊中,執行渲染的代碼下面:

require("xxx").initEvents();常見場景:

比如我在頁面中使用了jquery-steps這個UI插件,它會對頁面進行重新渲染。這就導致我最開始綁定的事件都失效了....只有推遲到這個js重構完頁面,再綁定才行。

以上這篇基于RequireJS和JQuery的模塊化編程――常見問題全面解析就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一区第二区| 日韩一中文字幕| 91亚洲国产成人久久精品网站| 国产美女高潮久久白浆| 91精品久久久久久| 综合国产在线视频| 欧美日韩人人澡狠狠躁视频| 亚洲精品电影网站| 欧美性极品少妇精品网站| 国产视频精品久久久| 精品视频在线导航| 国产在线拍揄自揄视频不卡99| 91av视频在线观看| 疯狂做受xxxx高潮欧美日本| 亚洲人成伊人成综合网久久久| 日韩av中文字幕在线播放| 97视频人免费观看| 日本电影亚洲天堂| 日韩有码在线播放| 一个色综合导航| 国产综合视频在线观看| 欧美大片在线看| 亚洲v日韩v综合v精品v| 伊人久久久久久久久久| 久久中国妇女中文字幕| 26uuu久久噜噜噜噜| 亚洲欧美国产精品久久久久久久| 韩剧1988免费观看全集| 欧美又大又粗又长| 亚洲а∨天堂久久精品9966| 国产精品电影在线观看| 欧美日韩成人在线视频| 538国产精品一区二区免费视频| 中文字幕亚洲综合久久| www.日韩欧美| 国内精久久久久久久久久人| 色播久久人人爽人人爽人人片视av| 亚洲一区二区三区xxx视频| 午夜欧美大片免费观看| 久久99久久99精品中文字幕| 久久久亚洲影院| 九色精品美女在线| 国产精品欧美日韩久久| 欧美激情在线播放| 久久久久中文字幕2018| 国产精品免费电影| 久久亚洲精品毛片| 久久精品国产91精品亚洲| 亚洲欧美精品在线| 91精品国产高清自在线| 亚洲图片在区色| 欧美成人精品xxx| 成人国产精品一区二区| 欧美亚洲国产日韩2020| 国产精品亚洲综合天堂夜夜| 亚洲综合在线播放| 成人网欧美在线视频| 色偷偷av一区二区三区乱| 日韩美女视频在线观看| zzjj国产精品一区二区| 秋霞av国产精品一区| 亚洲全黄一级网站| 亚洲视频在线观看网站| 欧美一级免费看| 免费91麻豆精品国产自产在线观看| 在线播放国产一区二区三区| 色综合色综合网色综合| 久久久亚洲影院| 久久av中文字幕| 欧美大尺度激情区在线播放| 亚洲天堂免费观看| 日本视频久久久| 成人免费视频网| 欧美噜噜久久久xxx| 国产精品露脸av在线| 91久久精品日日躁夜夜躁国产| 26uuu日韩精品一区二区| 91精品国产乱码久久久久久蜜臀| 91精品国产免费久久久久久| 亚洲欧洲美洲在线综合| 欧美精品18videos性欧美| 成人www视频在线观看| 这里只有精品丝袜| 久久久久国产精品一区| 日韩av有码在线| 97视频在线观看视频免费视频| 国产成人综合av| 亚洲国产精品一区二区三区| 日韩av中文字幕在线播放| 国产精品中文字幕在线观看| 欧美日韩久久久久| 亚洲精品视频免费| 欧美性猛交xxxx偷拍洗澡| 亚洲一区二区三区777| 亚洲精品视频在线播放| 欧美孕妇与黑人孕交| 国产精品视频xxx| 中文.日本.精品| 97香蕉超级碰碰久久免费软件| 亚洲国产精品一区二区三区| 欧美精品一本久久男人的天堂| 亚洲国产高清自拍| 国产精品老女人视频| 海角国产乱辈乱精品视频| 欧美性xxxxxxxxx| 中文字幕亚洲一区二区三区五十路| 成人观看高清在线观看免费| 久久综合色88| 国产成人91久久精品| 亚洲女在线观看| 欧美精品在线极品| 欧美专区在线观看| 亚州欧美日韩中文视频| 国产欧美日韩高清| 国产视频精品自拍| 欧美国产日韩精品| 亚洲第一区中文字幕| 国产福利成人在线| 欧美日本国产在线| 98精品国产高清在线xxxx天堂| 日韩国产一区三区| 欧美日韩精品国产| 午夜精品一区二区三区在线播放| 日韩高清电影免费观看完整版| 久久精品视频免费播放| 欧美日韩国产成人| 日韩精品黄色网| 一区二区成人精品| 欧美在线视频在线播放完整版免费观看| 日韩激情在线视频| 亚洲福利在线视频| 亚洲激情免费观看| 97香蕉久久夜色精品国产| 日韩av观看网址| 亚洲欧美精品伊人久久| 岛国av午夜精品| 日韩视频免费看| 欧美激情免费看| 三级精品视频久久久久| 国产综合色香蕉精品| 性色av一区二区三区| 欧美亚洲另类视频| 精品一区二区电影| 欧美日韩精品在线播放| 亚洲成人av中文字幕| 亚洲成年人影院在线| 92国产精品久久久久首页| 国产精品视频区1| 欧美国产日韩视频| 精品久久久久国产| 亚洲午夜小视频| 亚洲天堂2020| 日韩欧美一区二区三区久久| 日韩av网站在线| 欧美激情精品在线| 欧美疯狂性受xxxxx另类| 91在线看www| 91久久精品国产91性色| 亚洲女同精品视频| 亚洲欧美另类自拍| 国产精品ⅴa在线观看h| 精品国产福利在线| 日韩中文字幕在线播放| 上原亚衣av一区二区三区|