专业网站建设_企业品牌营销 · 北京汇仁智杰科技有限公司

Web前端知識

首頁 > 免費 > Web前端知識 >

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

來源:北京匯仁智杰科技有限公司   時間:2016-04-14   點擊:

  由于js的代碼邏輯越來越重,一個js文件可能會有上千行,十分不利于開發與維護。最近正在把邏輯很重的js拆分成模塊,在一頓糾結是使用requirejs還是seajs的時候,最終還是偏向于requirejs。下面就循序漸進的講解一下匯仁智杰技術大師遇到的問題,以及解決的辦法。
  關于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模塊很顯然已經加載完了 。可以看到輸出的信息:
in b
a.js:3 in a
test.js:6 in test
a.js:9 testfromb in a
b.js:6 test in b
a.js:6 test in a

0.png

  同樣的方式,修改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));
  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重構完頁面,再綁定才行。

網絡營銷推廣 . 北京匯仁智杰科技有限公司!

地址:北京市昌平區回龍觀龍冠大廈5層
咨詢:13370157521
業務QQ:373002979
E - mail:sales @ huirenzhijie.com
企業網站備案:京ICP備15021091號-1

匯仁智杰與眾不同

  • 有網絡推廣經驗
  • 有網站建站隊伍
  • 有大型網站建設經驗
  • 致力于營銷型網站建設
  • 始終堅持技術和服務同樣重要
查看PC版網站
備案號:京ICP備15021091號-1 版權所有:匯仁智杰

主站蜘蛛池模板: 同步分流马达_液压泵维修_派克多路阀-济南富诚液压设备有限公司 通用变频器|国产变频器|深圳变频器厂家-深圳市英捷思技术有限公司 | 罗茨鼓风机维修_三叶罗茨风机维修厂家电话_山东长沙章丘鼓风机修理_章鼓高压真空泵「上门服务」 罗茨鼓风机价格_三叶罗茨鼓风机厂家-山东锦工有限公司 | 生物除臭塔_生物除臭箱_玻璃钢吸收塔_玻璃钢集气罩_-安丘恒业玻璃钢有限公司 | 石家庄LED显示屏|石家庄显示屏|河北显示屏升级改造|石家庄科航光电科技有限公司_石家庄科航光电科技有限公司 | 柔性测斜仪|滑动式测斜仪-华思(广州)测控科技有限公司 | 全铝家居_十大全铝家具品牌_全铝衣柜橱柜——佛山欧格美铝业 | 铸造厂-铸铝-铸铜-铝合金铸造-重力铸造-翻砂铸造-[剑锋机械配件]专业东莞|深圳铸造厂 | 环保除尘设备_燃气/燃油热水锅炉_光氧空气净化器_蒸汽玉米压片机_压片设备_烘干设备-山东金盾节能环保设备有限公司 | 西安防静电地板_防静电地板厂家_防静电地板价格_OA网络地板_写字楼架空地板_机房墙板安装-红梅防静电地板厂家直销 | 深圳市泰美乐纸制品有限公司-纸杯厂,一次性纸杯,广告纸杯,奶茶纸杯,试饮纸杯定做 | 天津高压泵-高压清洗机-高压柱塞泵-厂家-价格-天津高压泵格瑞德 天津翻译公司盖章|022-58385822| 翰文博译(天津)商务咨询有限公司 | 淮南网站制作丨淮南做网站丨淮南网络公司丨淮南哪家网络公司好丨淮南智讯网络 | 压痕机_自动拆标机_瑞安市晨力机械有限公司 | 郑州试驾场地_双超专业汽车试驾场地_郑州双超文化传播有限公司官方网站 | 江苏宇力医疗器械有限公司| 英格索兰隔膜泵_ARO气动隔膜泵_英格索兰隔膜泵配件【原厂正品】连续五年无投诉_英格索兰隔膜泵代理-苏州瑞晟茂环保设备有限公司 印刷公司,北京印刷厂,宣传画册手册印刷厂-和智印彩页设计 | 苏州氮气弹簧厂家_江浙沪氮气弹簧价格_江苏氮气弹簧规格_BelleFlex碟形弹簧_昆山三虑五金机械有限公司 | 空气消毒机厂家-医用空气消毒机-医用空气净化器-山东佳境医疗 | 淘客联盟平台_网络电话系统-河南英邦软件科技有限公司官网 | 聚氨酯碰头,聚氨酯托辊,聚氨酯地辊/地滚轮/地轮/托绳轮-济宁卓力聚氨酯制品有限公司 | 南湖人才网_南湖招聘网_求职找工作平台 | 螺旋叶片_叶片成型机_叶片冷轧机-深州市广兴五金机械制造有限公司 | 四川蜀易控科技有限公司-酒店客房控制系统-智慧酒店智能化客房控制系统生产厂家 | 婴童人才网-孕婴童、母婴行业人才招聘求职系统 | 卧式镗铣床,道斯镗铣机床加工中心-江苏道斯数控科技有限公司 | 文化艺术网-专注文化,服务艺术 温州网络公司_网站建设_网络营销策划_阿里淘宝店铺服务-温州聚欣网络科技有限公司 | 徐州电动垃圾车|三轮快速保洁车|电动高压冲洗车|江苏大卫王环保科技有限公司 | 气体检测仪,多功能气体检测仪,四合一检测仪,氯气检测仪,有机挥发气体检测仪,气体报警器-南京诺邦电子科技有限公司 | 网架厂_网架加工厂家_徐州网架公司报价--三华网架制造商 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 英格索兰隔膜泵_ARO气动隔膜泵_英格索兰隔膜泵配件【原厂正品】连续五年无投诉_英格索兰隔膜泵代理-苏州瑞晟茂环保设备有限公司 印刷公司,北京印刷厂,宣传画册手册印刷厂-和智印彩页设计 | 素时刻 - 为亿万家庭提供健康饮食| 清洁度检测_手动颗粒萃取设备_自动颗粒萃取设备 - 厦门迈纳光学技术有限公司 | 塑料胶水|PVC胶水|PP胶水|橡胶胶水|强力胶水|透明胶水|胶粘剂|粘合剂|UV胶-聚力胶水厂家 | 凿岩机|操车设备|爬车机|三环链|伞钻|伞型钻机|中心回转抓岩机|往复式给煤机|滚轮罐耳|吊桶|钩头-济宁卓力工矿设备有限公司 | 阻抗分析仪 阻抗测试仪 介电常数测试仪 充电枪测试仪-苏州腾斯凯电子科技有限公司 | 重庆物流公司,重庆商贸货运,工厂物流,同城冷链物流配送,物流软件租售-重庆协通国际物流有限公司 重庆污水处理设备_废气处理设备_纯净水设备-山艺环保 | 西门子伺服电机维修_西门子变频器维修_西门子伺服驱动器维修_数控系统维修_PL维修-上海仰光电子 西克制冷官网│制冷机组冷风机冷库设备厂家-西克制冷(无锡)有限公司_西克制冷(无锡)有限公司 | 荆门市彩富机械有限责任公司|精铸件|五金|机械配件 | 疲劳试验机|电子万能试验机|摩擦磨损试验机|冲击试验机|济南全力测试技术有限公司 | 合肥发斯特精密塑模有限公司专业精密磨具,注塑模具,精密注塑机械零件(加工制造|生产|销售|厂家) 浩通集团 国际货运 物贸一体化 中非经贸 |