seajs的使用

最近花了一點(diǎn)時(shí)間對(duì)seajs進(jìn)行了了解。

一、seajs

seajs是cmd(Common Module Definition)的模塊加載框架,說(shuō)白了就是在前端開(kāi)發(fā)中

如何定義一個(gè)js文件磺陡,如何在項(xiàng)目中引入這個(gè)js文件兢交。

二、基于cmd就對(duì)cmd進(jìn)行了解

1锭沟、cmd是一種模塊定義的規(guī)范

常使用的 API 只有?define,?require,?require.async,?exports,module.exports?這五個(gè)

2抽兆、這個(gè)規(guī)范的內(nèi)容是什么?參考:https://github.com/seajs/seajs/issues/242

在 CMD 規(guī)范中族淮,一個(gè)模塊就是一個(gè)文件辫红。代碼的書寫格式如下:

define(factory);

define?Function

define?是一個(gè)全局函數(shù),用來(lái)定義模塊祝辣。

define?define(factory)

define?接受?factory?參數(shù)贴妻,factory?可以是一個(gè)函數(shù),也可以是一個(gè)對(duì)象或字符串较幌。

factory?為對(duì)象揍瑟、字符串時(shí),表示模塊的接口就是該對(duì)象乍炉、字符串绢片。比如可以如下定義一個(gè) JSON 數(shù)據(jù)模塊:

define({"foo":"bar"});

也可以通過(guò)字符串定義模板模塊:

define('I am a template. My name is {{name}}.');

factory?為函數(shù)時(shí),表示是模塊的構(gòu)造方法岛琼。執(zhí)行該構(gòu)造方法底循,可以得到模塊向外提供的接口。factory?方法在執(zhí)行時(shí)槐瑞,默認(rèn)會(huì)傳入三個(gè)參數(shù):require熙涤、exports?和?module:

define(function(require,exports,module) {//模塊代碼});

define?define(id?, deps?, factory)

define?也可以接受兩個(gè)以上參數(shù)。字符串?id?表示模塊標(biāo)識(shí),數(shù)組?deps?是模塊依賴祠挫。比如:

define('hello', ['jquery'],function(require,exports,module) {//模塊代碼});

id?和?deps?參數(shù)可以省略那槽。省略時(shí),可以通過(guò)構(gòu)建工具自動(dòng)生成等舔。

注意:帶?id?和?deps?參數(shù)的?define?用法不屬于 CMD 規(guī)范骚灸,而屬于?Modules/Transport?規(guī)范。

define.cmd?Object

一個(gè)空對(duì)象慌植,可用來(lái)判定當(dāng)前頁(yè)面是否有 CMD 模塊加載器:

if(typeofdefine==="function"&&define.cmd) {//有 Sea.js 等 CMD 模塊加載器存在}

require?Function

require?是?factory?函數(shù)的第一個(gè)參數(shù)甚牲。

require?require(id)

require?是一個(gè)方法,接受?模塊標(biāo)識(shí)?作為唯一參數(shù)蝶柿,用來(lái)獲取其他模塊提供的接口丈钙。

define(function(require,exports) {//獲取模塊 a 的接口vara=require('./a');//調(diào)用模塊 a 的方法a.doSomething();});

注意:在開(kāi)發(fā)時(shí),require?的書寫需要遵循一些?簡(jiǎn)單約定交汤。

require.async?require.async(id, callback?)

require.async?方法用來(lái)在模塊內(nèi)部異步加載模塊雏赦,并在加載完成后執(zhí)行指定回調(diào)。callback?參數(shù)可選蜻展。

define(function(require,exports,module) {//異步加載一個(gè)模塊喉誊,在加載完成時(shí),執(zhí)行回調(diào)require.async('./b',function(b) {b.doSomething();? });//異步加載多個(gè)模塊纵顾,在加載完成時(shí),執(zhí)行回調(diào)require.async(['./c','./d'],function(c,d) {c.doSomething();d.doSomething();? });});

注意:require?是同步往下執(zhí)行栋盹,require.async?則是異步回調(diào)執(zhí)行施逾。require.async?一般用來(lái)加載可延遲異步加載的模塊。

require.resolve?require.resolve(id)

使用模塊系統(tǒng)內(nèi)部的路徑解析機(jī)制來(lái)解析并返回模塊路徑例获。該函數(shù)不會(huì)加載模塊汉额,只返回解析后的絕對(duì)路徑。

define(function(require,exports) {console.log(require.resolve('./b'));//==> http://example.com/path/to/b.js});

這可以用來(lái)獲取模塊路徑榨汤,一般用在插件環(huán)境或需動(dòng)態(tài)拼接模塊路徑的場(chǎng)景下蠕搜。

exports?Object

exports?是一個(gè)對(duì)象,用來(lái)向外提供模塊接口收壕。

define(function(require,exports) {//對(duì)外提供 foo 屬性exports.foo='bar';//對(duì)外提供 doSomething 方法exports.doSomething=function() {};});

除了給?exports?對(duì)象增加成員妓灌,還可以使用?return?直接向外提供接口。

define(function(require) {//通過(guò) return 直接提供接口return{? ? foo:'bar',doSomething:function() {}? };});

如果?return?語(yǔ)句是模塊中的唯一代碼蜜宪,還可簡(jiǎn)化為:

define({? foo:'bar',doSomething:function() {}});

上面這種格式特別適合定義 JSONP 模塊虫埂。

特別注意:下面這種寫法是錯(cuò)誤的!

define(function(require,exports) {//錯(cuò)誤用法F匝椤掉伏!!exports={? ? foo:'bar',doSomething:function() {}? };});

正確的寫法是用?return?或者給?module.exports?賦值:

define(function(require,exports,module) {//正確寫法module.exports={? ? foo:'bar',doSomething:function() {}? };});

提示:exports?僅僅是?module.exports?的一個(gè)引用。在?factory?內(nèi)部給?exports?重新賦值時(shí),并不會(huì)改變?module.exports?的值斧散。因此給?exports?賦值是無(wú)效的供常,不能用來(lái)更改模塊接口。

module?Object

module?是一個(gè)對(duì)象鸡捐,上面存儲(chǔ)了與當(dāng)前模塊相關(guān)聯(lián)的一些屬性和方法话侧。

module.id?String

模塊的唯一標(biāo)識(shí)。

define('id', [],function(require,exports,module) {//模塊代碼});

上面代碼中闯参,define?的第一個(gè)參數(shù)就是模塊標(biāo)識(shí)瞻鹏。

module.uri?String

根據(jù)模塊系統(tǒng)的路徑解析規(guī)則得到的模塊絕對(duì)路徑。

define(function(require,exports,module) {console.log(module.uri);//==> http://example.com/path/to/this/file.js});

一般情況下(沒(méi)有在?define?中手寫?id?參數(shù)時(shí))鹿寨,module.id?的值就是?module.uri新博,兩者完全相同。

module.dependencies?Array

dependencies?是一個(gè)數(shù)組脚草,表示當(dāng)前模塊的依賴赫悄。

module.exports?Object

當(dāng)前模塊對(duì)外提供的接口。

傳給?factory?構(gòu)造方法的?exports?參數(shù)是?module.exports?對(duì)象的一個(gè)引用馏慨。只通過(guò)?exports?參數(shù)來(lái)提供接口埂淮,有時(shí)無(wú)法滿足開(kāi)發(fā)者的所有需求。 比如當(dāng)模塊的接口是某個(gè)類的實(shí)例時(shí)写隶,需要通過(guò)?module.exports來(lái)實(shí)現(xiàn):

define(function(require,exports,module) {//exports 是 module.exports 的一個(gè)引用console.log(module.exports===exports);//true//重新給 module.exports 賦值module.exports=newSomeClass();//exports 不再等于 module.exportsconsole.log(module.exports===exports);//false});

注意:對(duì)?module.exports?的賦值需要同步執(zhí)行倔撞,不能放在回調(diào)函數(shù)里。下面這樣是不行的:

//x.jsdefine(function(require,exports,module) {//錯(cuò)誤用法setTimeout(function() {module.exports={ a:"hello"};? },0);});

在 y.js 里有調(diào)用到上面的 x.js:

//y.jsdefine(function(require,exports,module) {varx=require('./x');//無(wú)法立刻得到模塊 x 的屬性 aconsole.log(x.a);//undefined});

三慕趴、seajs使用定義好的模塊

1痪蝇、引入seajs

在文件夾中放入seajs,相關(guān)的html頁(yè)面引入

<script type="text/javascript" src="yourfile/js/sea.js" ></script>

2冕房、seajs經(jīng)常使用的api有use躏啰,config

seajs.use

seajs.use主要用于載入入口模塊。入口模塊相當(dāng)于C語(yǔ)言的main函數(shù)耙册,同時(shí)也是整個(gè)模塊依賴樹的根给僵。seajs.use

的用法如下:

//第一模式

seajs.use('./a');

//回調(diào)模式

seajs.use('./a',function(a){? ? a.run();})

//多模塊模式

seajs.use(['./a','./b'],function(a,b){??

? a.run();? ?

? b.run();

})

seajs.config({

????base:'path',

alias:{

? ? 'app':'path/app/'

},

charset:'utf-8',

timeout:20000,

debug:false})

base表示基址路徑

alias可以對(duì)較長(zhǎng)的常用路徑設(shè)置縮寫

charset表示下載js時(shí)script標(biāo)簽的charset屬性。

timeout表示下載文件的最大時(shí)長(zhǎng)详拙,以毫秒為單位帝际。


seajs的結(jié)構(gòu)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市溪厘,隨后出現(xiàn)的幾起案子胡本,更是在濱河造成了極大的恐慌,老刑警劉巖畸悬,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侧甫,死亡現(xiàn)場(chǎng)離奇詭異珊佣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)披粟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門咒锻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人守屉,你說(shuō)我怎么就攤上這事惑艇。” “怎么了拇泛?”我有些...
    開(kāi)封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵滨巴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我俺叭,道長(zhǎng)恭取,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任熄守,我火速辦了婚禮蜈垮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裕照。我一直安慰自己攒发,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布晋南。 她就那樣靜靜地躺著惠猿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搬俊。 梳的紋絲不亂的頭發(fā)上紊扬,一...
    開(kāi)封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音唉擂,去河邊找鬼。 笑死檀葛,一個(gè)胖子當(dāng)著我的面吹牛玩祟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屿聋,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼空扎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了润讥?” 一聲冷哼從身側(cè)響起转锈,我...
    開(kāi)封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎楚殿,沒(méi)想到半個(gè)月后撮慨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年砌溺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了影涉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡规伐,死狀恐怖蟹倾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猖闪,我是刑警寧澤鲜棠,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站培慌,受9級(jí)特大地震影響豁陆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜检柬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一献联、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧何址,春花似錦里逆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至偎血,卻和暖如春诸衔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颇玷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工笨农, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帖渠。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓谒亦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親空郊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子份招,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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

  • 為什么要使用模塊化哼审? 最主要的目的: 解決命名沖突 依賴管理 其他價(jià)值 提高代碼可讀性 代碼解耦谐腰,提高復(fù)用性 CM...
    JamHsiao_aaa4閱讀 369評(píng)論 0 1
  • 前端JS模塊化開(kāi)發(fā)有兩大規(guī)范AMD合CMD孕豹,下面以我的理解來(lái)簡(jiǎn)單總結(jié)一下模塊化開(kāi)發(fā)的思想 ,以及js前端常用的AM...
    三寸日光_閱讀 422評(píng)論 0 0
  • 隨著前端業(yè)務(wù)復(fù)雜度的增加椅野,模塊化成為一個(gè)大的趨勢(shì)。而在ES6還未被瀏覽器所支持的情況下籍胯,commonjs作為ES6...
    吳高亮閱讀 1,055評(píng)論 0 3
  • 模塊通常是指編程語(yǔ)言所提供的代碼組織機(jī)制竟闪,利用此機(jī)制可將程序拆解為獨(dú)立且通用的代碼單元。所謂模塊化主要是解決代碼分...
    MapleLeafFall閱讀 1,171評(píng)論 0 0
  • 為什么使用 Sea.js 杖狼? Sea.js 追求簡(jiǎn)單炼蛤、自然的代碼書寫和組織方式,具有以下核心特性: 簡(jiǎn)單友好的模塊...
    yangjiahao閱讀 950評(píng)論 0 1