BUI基礎(chǔ)-CMD 組織模塊

模塊

什么是模塊?在前端領(lǐng)域可以把模塊認(rèn)為是完成一個(gè)系統(tǒng)一部分功能的代碼片段赡勘,我們往往把模塊定義在一個(gè)文件內(nèi),同時(shí)也會(huì)合并模塊一起加載捞镰。Javascript的模塊間的依賴闸与,默認(rèn)方式是按照script標(biāo)簽的前后順序進(jìn)行的,但是這種依賴關(guān)系十分脆弱岸售,而且需要手工維護(hù)践樱。

模塊之間存在依賴關(guān)系,所以執(zhí)行一個(gè)模塊前凸丸,必須加載并執(zhí)行它所依賴的模塊拷邢,同時(shí)我們也要避免循環(huán)依賴,所以想在前端領(lǐng)域使用模塊我們必須搞清楚模塊的定義屎慢,依賴和加載方式瞭稼,目前比較流行的2種方式是CMDAMD

CMD的概念

模塊概念

CMD(Common Module Definition)是seajs推廣過(guò)程中模塊定義規(guī)范化的產(chǎn)物,寫法類似于Nodejs的模塊定義方式差異在于:

  • NodeJS 里腻惠,模塊文件里的 this === module.exports环肘;SeaJS 里,this === window集灌。
  • NodeJS 里悔雹,模塊文件里的 return xx 會(huì)被忽略;SeaJS 里,return xx 等價(jià) module.exports = xx荠商。
  • NodeJS 里寂恬,require 是懶加載 + 懶執(zhí)行的。在 SeaJS 里是提前加載好 + 懶執(zhí)行莱没。
  • SeaJS 里初肉,require(id) 中的 id 必須是字符串直接量。NodeJS 里沒(méi)這個(gè)限制饰躲。

創(chuàng)建模塊

通過(guò)以下示例了解CMD中模塊的創(chuàng)建

<pre class="prettyprint linenums" style="padding: 8px; background-color: rgb(247, 247, 249); border: 1px solid rgb(225, 225, 232); margin-top: 8px; box-shadow: rgb(251, 251, 252) 40px 0px 0px inset, rgb(236, 236, 240) 41px 0px 0px inset; color: rgb(51, 51, 51); font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

  1. define('hello', ['bui/common'], function(require, exports, module) {

  2. var BUI = require('bui/common');

  3. // 模塊代碼

  4. });

</pre>

  • 模塊名稱: 用于加載模塊時(shí)使用牙咏,可以為空,根據(jù)路徑和文件名作為模塊名稱
  • 依賴的模塊 : 設(shè)置依賴的模塊嘹裂,可以為空妄壶,則按照模塊內(nèi)部使用require函數(shù)時(shí)確定依賴的模塊(未指定模塊依賴關(guān)系時(shí),不能更改require參數(shù)名稱)
  • 回調(diào)函數(shù): 模塊執(zhí)行時(shí)執(zhí)行的函數(shù)寄狼,在第一次被require前丁寄,函數(shù)內(nèi)的代碼不會(huì)執(zhí)行。

加載模塊

<pre class="prettyprint linenums" style="padding: 8px; background-color: rgb(247, 247, 249); border: 1px solid rgb(225, 225, 232); margin-top: 8px; box-shadow: rgb(251, 251, 252) 40px 0px 0px inset, rgb(236, 236, 240) 41px 0px 0px inset; color: rgb(51, 51, 51); font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

  1. seajs.use('hello',function(Hello){

  2. });

</pre>

  • 沒(méi)有全局性的require函數(shù)
  • 回調(diào)函數(shù)執(zhí)行前泊愧,hello模塊必須加載并執(zhí)行完畢
  • hello依賴的模塊也必須加載伊磺、執(zhí)行完畢

AMD的概念

定義

AMD(Asynchronous Module Definition),是基于requireJS指定并推廣開來(lái)的一種模塊定義方式,AMD基本兼容CMD 定義模塊的方式删咱,但是回調(diào)函數(shù)中屑埋,不提供exports和modules對(duì)象,只提供return 的方式定義模塊

  • 使用define方法定義模塊痰滋,通過(guò)回調(diào)函數(shù)(factory)生成模塊
  • 定義模塊時(shí)指定模塊依賴(也可以省略)
  • 多次依賴一個(gè)模塊摘能,只加載一遍
  • 傳遞依賴的模塊的引用到factory函數(shù)
  • 不需要合并模塊時(shí),不需要指定模塊id

模塊創(chuàng)建

<pre class="prettyprint linenums" style="padding: 8px; background-color: rgb(247, 247, 249); border: 1px solid rgb(225, 225, 232); margin-top: 8px; box-shadow: rgb(251, 251, 252) 40px 0px 0px inset, rgb(236, 236, 240) 41px 0px 0px inset; color: rgb(51, 51, 51); font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

  1. //Calling define with module ID, dependency array, and factory function

  2. define('myModule', ['dep1', 'dep2'], function (dep1, dep2) {

  3. //Define the module value by returning a value.

  4. return function () {};

  5. });

</pre>

模塊加載

<pre class="prettyprint linenums" style="padding: 8px; background-color: rgb(247, 247, 249); border: 1px solid rgb(225, 225, 232); margin-top: 8px; box-shadow: rgb(251, 251, 252) 40px 0px 0px inset, rgb(236, 236, 240) 41px 0px 0px inset; color: rgb(51, 51, 51); font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

  1. require('myModule',function(MyModule){

  2. });

</pre>

AMD的模塊加載使用全局函數(shù)require

Kissy的模塊

模塊的創(chuàng)建

Kissy的模塊定義跟CMD和AMD有相同點(diǎn)敲街,但是也有不同點(diǎn)团搞,依賴模塊寫在最后面,factory里傳入的是模塊引用多艇。

<pre class="prettyprint linenums" style="padding: 8px; background-color: rgb(247, 247, 249); border: 1px solid rgb(225, 225, 232); margin-top: 8px; box-shadow: rgb(251, 251, 252) 40px 0px 0px inset, rgb(236, 236, 240) 41px 0px 0px inset; color: rgb(51, 51, 51); font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

  1. KISSY.add('myModule',function(dep1,dep2){

  2. },{

  3. requires : ['dep1', 'dep2']

  4. });

</pre>

模塊的加載

<pre class="prettyprint linenums" style="padding: 8px; background-color: rgb(247, 247, 249); border: 1px solid rgb(225, 225, 232); margin-top: 8px; box-shadow: rgb(251, 251, 252) 40px 0px 0px inset, rgb(236, 236, 240) 41px 0px 0px inset; color: rgb(51, 51, 51); font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

  1. KISSY.use('myModule',function(S,MyModule){

  2. });

</pre>

Kissy加載模塊時(shí)莺丑,跟CMD,AMD最大的差異在于墩蔓,factory函數(shù)的第一個(gè)參數(shù)是KISSY本身

BUI加載模塊

BUI的模塊定義按照CMD的寫法梢莽,無(wú)論使用seajs還是Kissy作為L(zhǎng)oader。

加載模塊時(shí)奸披,可以按照seajs的寫法昏名,也可以按照Kissy的寫法,但是一般情況下按照BUI封裝的寫法阵面,可以兼容seajs和Kissy

<pre class="prettyprint linenums" style="padding: 8px; background-color: rgb(247, 247, 249); border: 1px solid rgb(225, 225, 232); margin-top: 8px; box-shadow: rgb(251, 251, 252) 40px 0px 0px inset, rgb(236, 236, 240) 41px 0px 0px inset; color: rgb(51, 51, 51); font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

  1. BUI.use('myModule',function(MyModule){

  2. });

</pre>

下一步學(xué)習(xí)

BUI的基礎(chǔ)內(nèi)容到這里告一段落轻局,你可以去看一下BUI提供的工具類洪鸭,然后進(jìn)入到BUI控件編寫的學(xué)習(xí)中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仑扑,一起剝皮案震驚了整個(gè)濱河市览爵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镇饮,老刑警劉巖蜓竹,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異储藐,居然都是意外死亡俱济,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門钙勃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛛碌,“玉大人,你說(shuō)我怎么就攤上這事辖源∥敌” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵克饶,是天一觀的道長(zhǎng)酝蜒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)彤路,這世上最難降的妖魔是什么秕硝? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任芥映,我火速辦了婚禮洲尊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奈偏。我一直安慰自己坞嘀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布惊来。 她就那樣靜靜地躺著丽涩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪裁蚁。 梳的紋絲不亂的頭發(fā)上矢渊,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音枉证,去河邊找鬼矮男。 笑死,一個(gè)胖子當(dāng)著我的面吹牛室谚,可吹牛的內(nèi)容都是我干的毡鉴。 我是一名探鬼主播崔泵,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼猪瞬!你這毒婦竟也來(lái)了憎瘸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤陈瘦,失蹤者是張志新(化名)和其女友劉穎幌甘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甘晤,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡含潘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了线婚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遏弱。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖塞弊,靈堂內(nèi)的尸體忽然破棺而出漱逸,到底是詐尸還是另有隱情,我是刑警寧澤游沿,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布饰抒,位于F島的核電站,受9級(jí)特大地震影響诀黍,放射性物質(zhì)發(fā)生泄漏袋坑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一眯勾、第九天 我趴在偏房一處隱蔽的房頂上張望枣宫。 院中可真熱鬧,春花似錦吃环、人聲如沸也颤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翅娶。三九已至,卻和暖如春好唯,著一層夾襖步出監(jiān)牢的瞬間竭沫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工骑篙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜕提,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓替蛉,卻偏偏與公主長(zhǎng)得像贯溅,于是被迫代替她去往敵國(guó)和親拄氯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:https://www.cnblogs.com/chenguangliang/p/5856701.html...
    小豆soybean閱讀 694評(píng)論 0 2
  • 在JavaScript發(fā)展初期就是為了實(shí)現(xiàn)簡(jiǎn)單的頁(yè)面交互邏輯鄙麦,寥寥數(shù)語(yǔ)即可;如今CPU镊折、瀏覽器性能得到了極大的提升...
    簡(jiǎn)不簡(jiǎn)單_都好閱讀 219評(píng)論 0 0
  • 在JavaScript發(fā)展初期就是為了實(shí)現(xiàn)簡(jiǎn)單的頁(yè)面交互邏輯胯府,寥寥數(shù)語(yǔ)即可;如今CPU恨胚、瀏覽器性能得到了極大的提升...
    George_Wm閱讀 390評(píng)論 0 2
  • 在JavaScript發(fā)展初期就是為了實(shí)現(xiàn)簡(jiǎn)單的頁(yè)面交互邏輯骂因,寥寥數(shù)語(yǔ)即可;如今CPU赃泡、瀏覽器性能得到了極大的提升...
    喜歡唱Hi歌的閱讀 104評(píng)論 0 1
  • 轉(zhuǎn)載于作者:linwalker via:http://www.reibang.com/p/d67bc79976e6...
    猩崽大叔閱讀 666評(píng)論 0 0