摘要:遵循規(guī)范,遵循規(guī)范。很多時候我們想在執(zhí)行方法的時候再去加載,而不是提前在頁面加載的時候就把加載。匹配到時不加載。所以,達到了用到時再去異步加載并執(zhí)行的目的。
seajs遵循CMD規(guī)范,requirejs遵循AMD規(guī)范。AMD規(guī)范是預(yù)加載,CMD規(guī)范是賴加載。
下文舉例假設(shè)有文件 b.js, c.js如下
//b.js define(function(require, exports, module){ console.log("b is loaded") function run(){ console.log("b run"); } exports.run = run; }) //c.js define(function(require, exports, module){ console.log("c is loaded") function run(){ console.log("c run"); } exports.run = run; })1. seajs對依賴模塊只加載不執(zhí)行,requirejs對依賴模塊既加載也執(zhí)行
運行代碼:
// seajsseajs // requirejsrequirejs // a.js define(["b"], function(){ })
運行結(jié)果:
seajs:
控制臺無輸出
requirejs:
控制臺:
//a.js define(function(require, exports, module){ var b = require("b") })3. seajs可以在任意處直接require文件,無需提前寫依賴模塊;一旦提前寫了任意一個依賴模塊,下面的所有require的使用必須保證也有其對應(yīng)的依賴模塊
seajs可以直接如下使用,無需寫依賴["b"]:
//a.js define(function(require, exports, module){ var b = require("b") }) 或 define(["b"], function(require, exports, module){ var b = require("b") })
運行結(jié)果:
控制臺:b is loaded
假如 a.js 依賴了另一個 c.js,則在 a.js 中使用 require("b") 時必須也寫上依賴["b"],否則b.js將因為查找不到而不會加載
define(["c"], function(require, exports, module){ var b = require("b") })
運行結(jié)果:
控制臺無輸出(不會輸出c is loaded, 因為沒有require("c") )
如果此時我們執(zhí)行b.run()
define(["c"], function(require, exports, module){ var b = require("b") b.run() })
控制臺將會報錯,因為此時b為null:
此時正確寫法應(yīng)該寫上依賴 ["b"]:
define(["c", "b"], function(require, exports, module){ var b = require("b") b.run() })
運行結(jié)果:
結(jié)論:
對于seajs,如果不寫依賴那就一個都不要寫,一旦寫了,下面所有require的地方都需要提前在頭部寫上依賴
requirejs的依賴寫法如下:define(["c", "b"], function(c, b){ var b = require("b") b.run() }) 或 define(function(require, exports, module){ var b = require("b") b.run() }) //錯誤寫法 define(["c"], function(c){ var b = require("b") b.run() })4. seajs的require.async在執(zhí)行到使用位置的時候才去異步加載
seajs:
如下例:
// a.js define(function(require, exports, module){ document.getElementById("btn").addEventListener("click", function(){ document.getElementById("btn").innerHTML = "btn is clicked" init() }) function init(){ var b = require("b"); b.run() } })
運行結(jié)果:
控制臺無輸出
點擊OK按鈕, b.js 加載并執(zhí)行b.js和run方法:
大家注意到,在未點擊按鈕之前,雖然沒有執(zhí)行init方法,但b.js依然被提前加載了進來,但沒有被執(zhí)行(沒有輸出b is loaded)。
很多時候我們想在執(zhí)行init方法的時候再去加載b.js,而不是提前在頁面加載的時候就把b,js加載。
這時候就需要用到require.async,如下:
//a.js define(function(require, exports, module){ document.getElementById("btn").addEventListener("click", function(){ document.getElementById("btn").innerHTML = "btn is clicked" init() }) function init(){ require.async("b", function(b){ b.run() }); } })
這時候運行結(jié)果:
b.js沒有被加載:
控制臺無輸出:
點擊OK按鈕:
b.js被加載
控制臺輸出:
這是因為當(dāng)執(zhí)行一個js時,seajs會先去查找匹配require,然后加載相應(yīng)資源,但不執(zhí)行。匹配到require.async時不加載。
所以,require.async達到了用到時再去異步加載并執(zhí)行的目的。
小問題:
如果是requirejs執(zhí)行下面代碼:
//a.js define(function(require, exports, module){ document.getElementById("btn").addEventListener("click", function(){ document.getElementById("btn").innerHTML = "btn is clicked" init() }) function init(){ var b = require("b"); b.run() } })
資源如何加載?控制臺又會輸出什么呢?點擊ok按鈕又會輸出啥?
答:資源加載了a.js, b.js, 控制臺輸出:b is loaded, 點擊OK按鈕控制臺繼續(xù)輸出:b run
seajs對依賴模塊只加載不執(zhí)行,requirejs對依賴模塊加載并執(zhí)行
seajs ,requirejs在 require具體文件時既加載也執(zhí)行
seajs可以在任意處直接require文件,無需提前寫依賴模塊;一旦提前寫了任意一個依賴模塊,下面的所有require的使用必須保證也有其對應(yīng)的依賴模塊
seajs的require.async在執(zhí)行到使用位置的時候才去異步加載
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91983.html
摘要:所有依賴這個模塊的語句,都定義在一個回調(diào)函數(shù)中,等到所有依賴加載完成之后前置依賴,這個回調(diào)函數(shù)才會運行。如果將前面的代碼改寫成形式,就是下面這樣定義了一個文件,該文件依賴模塊,當(dāng)模塊加載完畢之后執(zhí)行回調(diào)函數(shù),這里并沒有暴露任何變量。 模塊化是我們?nèi)粘i_發(fā)都要用到的基本技能,使用簡單且方便,但是很少人能說出來但是的原因及發(fā)展過程。現(xiàn)在通過對比不同時期的js的發(fā)展,將JavaScript模...
摘要:遵循的是異步模塊定義規(guī)范,遵循的是通用模塊定義規(guī)范。規(guī)范的不同,導(dǎo)致了兩者的不同。在嘗試讓第三方類庫修改自身來支持,目前只有少數(shù)社區(qū)采納。是沒有明顯的,是明顯沒有。無這方面的支持。 發(fā)布之后發(fā)現(xiàn)存在一個顯示的問題,大家可以移步到我的簡書參考,謝謝大家!!!我的簡書《seajs和requirejs技術(shù)指導(dǎo)文檔》 昨天到今天,老衲翻閱數(shù)十篇技術(shù)文檔,為了搞明白seajs(CMD)和 req...
摘要:未構(gòu)建之前,全部分開加載。的優(yōu)化,得再看下的示例,然后再寫篇筆記記錄下來。 想摸透javascript模塊化編程是怎么一回事,在seajs和requirejs之間兜兜轉(zhuǎn)轉(zhuǎn),看了許多相關(guān)資料和文章,算是大致理清它們的異同,撇開requirejs加載方式的另類(其實目前我暫時還沒去感受),于寫法,比較喜歡requirejs的寫法,這個比較主觀,這也得益于阮一峰大大那篇Javascript模...
摘要:要求模塊編寫必須在真正的代碼之外套上一層規(guī)定的代碼包裝,樣子看起來是這樣的模塊代碼通過傳遞一個簽名為的回調(diào)函數(shù)給函數(shù),就可以把需要注入的變量和函數(shù)注入到模塊代碼內(nèi)。 之前寫的文章急速Js全棧教程得到了不錯的閱讀量,霸屏掘金頭條3天,點贊過千,閱讀近萬,甚至還有人在評論區(qū)打廣告,可見也是一個小小的生態(tài)了;)。看來和JS全棧有關(guān)的內(nèi)容,還是有人頗有興趣的。 showImg(https://...
摘要:模塊初始化時,會調(diào)用且僅調(diào)用一次該工廠函數(shù)。用來向外提供模塊的除了給對象增加成員,還可以使用直接向外提供可簡化為函數(shù)用來訪問其他模塊提供的異步加載模塊,并在加載完成后執(zhí)行回調(diào)函數(shù)使用的內(nèi)部機制來解析并返回模塊路徑。手冊的模塊化插件 seajs是我剛?cè)腴T前端就接觸到的一個javaScript模塊加載框架。使用seajs后javaScript代碼的可讀性和清晰度有了很大的提升,插件的使用和...
閱讀 3496·2021-10-18 13:30
閱讀 2951·2021-10-09 09:44
閱讀 1969·2019-08-30 11:26
閱讀 2299·2019-08-29 13:17
閱讀 765·2019-08-29 12:17
閱讀 2253·2019-08-26 18:42
閱讀 478·2019-08-26 13:24
閱讀 2960·2019-08-26 11:39