最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年04月14日 10:02:18   作者:xingoo  
本文是小編日常收集整理些有關(guān)RequireJS和JQuery的模塊化編程,感興趣的朋友一起學(xué)習(xí)吧

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

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

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

關(guān)于AMD和CMD的理解

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

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

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

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

如何解決requirejs中循環(huán)依賴問題

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

比如,我這里寫了一個循環(huán)依賴的例子。

主頁面:

<!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調(diào)用、testfromb()方法調(diào)用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模塊中,調(diào)用了a的方法。

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

這樣相當(dāng)于a調(diào)用了b的方法,但是b的方法依賴于a的方法,這就造成了循環(huán)依賴。瀏覽器會提示錯誤:

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

按照官方文檔的說法,這種屬于設(shè)計的問題,應(yīng)該盡量避免。那么如果避免不了該怎么辦呢?可以這樣修改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();
}
}
});

這里是等到執(zhí)行atest()方法時,才加載a模塊。這時,a模塊很顯然已經(jīng)加載完了 。可以看到輸出的信息:

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

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

關(guān)于循環(huán)依賴的源碼可以參考云盤

如何在requirejs中使用jquery

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

requirejs.config({
baseUrl: './',
paths:{
'jquery':'lib/jquery'
}
});
requirejs(['jquery'],
function ($){
$('#test').html('test');
});

如何在requirejs中使用jquery插件

對于jquery的插件,比較常見的做法都是傳入一個jquery的對象,在這個jquery對象的基礎(chǔ)上添加插件對應(yīng)的方法。

首先需要添加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中指定依賴關(guān)系。

除了上面這種使用方法,也可以使用commonJS風(fēng)格的調(diào)用:

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();
}
}
});

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

Uncaught TypeError: _table.dataTable is not a function 

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

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

這也是在網(wǎng)上搜的方法,原理奈何經(jīng)驗不足....

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

requirejs使用jquery-ui的問題

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

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

解決辦法:

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

比如在DOM重構(gòu)的JS模塊中,執(zhí)行渲染的代碼下面:

require("xxx").initEvents();

常見場景:

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

以上所述是小編針對RequireJS和JQuery的模塊化編程日常問題解析的全部敘述,希望對大家有所幫助!

相關(guān)文章

  • 詳解前端如何對超大量數(shù)據(jù)進行渲染

    詳解前端如何對超大量數(shù)據(jù)進行渲染

    這篇文章主要為大家詳細介紹了前端如何對超大量數(shù)據(jù)進行渲染,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • 理解Javascript_13_執(zhí)行模型詳解

    理解Javascript_13_執(zhí)行模型詳解

    在《理解Javascript_12_執(zhí)行模型淺析》一文中,我們初步的了解了執(zhí)行上下文與作用域的概念,那么這一篇將深入分析執(zhí)行上下文的構(gòu)建過程,了解執(zhí)行上下文、函數(shù)對象、作用域三者之間的關(guān)系。
    2010-10-10
  • Bootstrap精簡教程中秋大放送

    Bootstrap精簡教程中秋大放送

    Bootstrap精簡教程中秋大放送,這篇文章主要為大家分享了最基礎(chǔ)的Bootstrap學(xué)習(xí)教程,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 淺談JS三座大山之異步和單線程

    淺談JS三座大山之異步和單線程

    首先我們要知道,js這門語言是單線程的,同時只能做一件事,比如說渲染dom,執(zhí)行js方法,這些事情只能一個一個做,不能分開執(zhí)行。(因為js需要操作dom,當(dāng)兩個js方法同時操作一個dom的時候就會出問題,所以js被設(shè)計成了單線程)。本文將介紹JS三座大山之異步和單線程。
    2021-06-06
  • 深入解析Parcel如何進行自定義配置

    深入解析Parcel如何進行自定義配置

    Parcel?是現(xiàn)代前端開發(fā)中不可或缺的工具之一,以其“零配置”的特性迅速贏得了開發(fā)者的青睞,本文將通過幾個實例詳細介紹如何進行?Parcel?的自定義配置,感興趣的小伙伴可以了解下
    2024-12-12
  • 使用JS實現(xiàn)jQuery的addClass, removeClass, hasClass函數(shù)功能

    使用JS實現(xiàn)jQuery的addClass, removeClass, hasClass函數(shù)功能

    這篇文章主要介紹了使用JS實現(xiàn)jQuery的addClass, removeClass, hasClass函數(shù)功能,需要的朋友可以參考下
    2014-10-10
  • JavaScript 動態(tài)將數(shù)字金額轉(zhuǎn)化為中文大寫金額

    JavaScript 動態(tài)將數(shù)字金額轉(zhuǎn)化為中文大寫金額

    JavaScript 將數(shù)字金額轉(zhuǎn)化為中文大寫金額的函數(shù)
    2009-05-05
  • echarts柱狀圖坐標(biāo)軸內(nèi)容顯示不全的兩種解決辦法

    echarts柱狀圖坐標(biāo)軸內(nèi)容顯示不全的兩種解決辦法

    本文主要介紹了echarts柱狀圖坐標(biāo)軸內(nèi)容顯示不全的兩種解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解JavaScript常量定義

    詳解JavaScript常量定義

    本文主要對JavaScript常量定義進行詳細介紹,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • javascript中如何判斷類型匯總

    javascript中如何判斷類型匯總

    這篇文章主要給大家介紹了關(guān)于javascript中如何判斷類型的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用javascript具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評論

堆龙德庆县| 乌兰浩特市| 航空| 万载县| 井冈山市| 资兴市| 花莲县| 石林| 沧州市| 昌黎县| 永泰县| 芮城县| 大同县| 轮台县| 全州县| 正定县| 南川市| 原平市| 荣昌县| 青海省| 尼勒克县| 南川市| 万安县| 伊春市| 紫金县| 金沙县| 双牌县| 遂平县| 东源县| 常州市| 裕民县| 金川县| 涟水县| 墨玉县| 正宁县| 寿光市| 绍兴市| 永德县| 云和县| 平罗县| 博兴县|