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