TS /// <reference path="..." />

參考egret編譯順序說明
我們知道 JavaScript 是一種腳本語(yǔ)言焦辅,瀏覽器按腳本的順序來執(zhí)行泞当。實(shí)際上瀏覽器會(huì)根據(jù) <script> 標(biāo)簽?zāi)_本來載入順序來執(zhí)行腳本侍匙。當(dāng)我們的腳本引用了一個(gè)未載入的腳本中的變量時(shí),瀏覽將報(bào)出相應(yīng)的錯(cuò)誤绍刮。

一般情況下我們?cè)?Egret 項(xiàng)目中并不需要手動(dòng)處理編譯順序,因?yàn)槲覀兊木幾g器已經(jīng)幫助我們處理好了挨摸。但是有一種情況是編譯器不能處理的孩革,需要我們手動(dòng)加上 <reference> 標(biāo)簽來告訴編譯器我們的類的依賴關(guān)系。

首先我們建立幾個(gè)測(cè)試類得运,項(xiàng)目的結(jié)構(gòu)如下:

image.png

如上所示膝蜈,創(chuàng)建了一個(gè) Test 文件夾锅移,內(nèi)部創(chuàng)建了 Call 文件夾,在 Call 內(nèi)部創(chuàng)建了 TestCall.ts饱搏。同時(shí)在 Test 文件夾內(nèi)創(chuàng)建 TestA.ts 和 TestB.ts非剃。其余的 Main.ts 和 LoadingUI.ts 這里用不到,我們并不用去關(guān)注它們推沸。

在 TestA.ts 中代碼如下:

class TestA{
    public static arr:Array<any> = ["t","e","s","t","c","a","l","l"];
}

TestB.ts 中代碼如下:

class TestB{
    public static testBStr:string = TestA.arr.join("");
}

這兩個(gè)類內(nèi)容很簡(jiǎn)單备绽,都只有一個(gè)靜態(tài)成員。其中 TestA 類存放了一個(gè)數(shù)組,TestB 類將這個(gè)數(shù)組的內(nèi)容拼接成一個(gè)字符串并保存下來坤学。到目前為止我們編譯運(yùn)行并沒有發(fā)現(xiàn)異常疯坤。

下面在TestCall.ts 中加入對(duì) TestB 類的調(diào)用。

class TestCall{
    public static test:any = egret.getDefinitionByName(TestB.testBStr);
}

編譯運(yùn)行之后發(fā)現(xiàn)瀏覽器會(huì)報(bào)如下TestB.js:11 Uncaught ReferenceError錯(cuò)誤:

image.png

那么當(dāng)我們添加了 TestB.testBstr的調(diào)用之后瀏覽器發(fā)現(xiàn) TestA 類并沒有被定義深浮,進(jìn)而導(dǎo)致 testBStr 這個(gè)屬性頁(yè)找不到了压怠。當(dāng)我們編譯之后發(fā)生了什么呢,檢查一下生成的 index.html 文件會(huì)發(fā)現(xiàn) TestB.js 是在 TestCall.js 之前加載的飞苇,而 TestA.js 是在最后加載的菌瘫。當(dāng) TestB.js 調(diào)用 TestA.js 中的文件的內(nèi)容時(shí)瀏覽器將會(huì)報(bào)錯(cuò)。

上面的調(diào)用關(guān)系在代碼中顯然是成立的布卡,編譯器并沒有報(bào)錯(cuò)雨让。而編譯器并沒有生成正確的載入順序,主要是因?yàn)槠錈o法確認(rèn)這種類的靜態(tài)成員的互相引用的順序忿等。當(dāng)在 TestCall.ts 中引用了TestB.ts 中的內(nèi)容時(shí)自動(dòng)將 TestB.js 放在 TestCall.js 之前進(jìn)行加載栖忠。由于無法檢測(cè)到 TestB.ts 中對(duì) TestA.ts 的靜態(tài)成員的引用,所以導(dǎo)致了以上情況的發(fā)生贸街。

解決方法
這種情況解決方法也很簡(jiǎn)單庵寞,就是告訴編譯器我們的類的依賴關(guān)系。在 TypeScript 中薛匪,使用<reference>標(biāo)簽來表示引用關(guān)系捐川。在 reference 標(biāo)簽中可以標(biāo)記依賴文件的相對(duì)路徑。所以只需要在 TestB 類之前加入如下注釋即可:

///<reference path="TestA.ts" />

class TestB{

 public static testBStr:string = TestA.arr.join("");

}

上面這種情況一般發(fā)生在靜態(tài)成員的引用上逸尖,還有其他情況在極小概率下可能導(dǎo)致該現(xiàn)象古沥,如果遇到可以加入依賴關(guān)系標(biāo)簽來告訴編譯器正確的加載方式。

參考
js文件三斜杠注釋///reference path用途

編輯某個(gè)js文件時(shí)娇跟,要想這個(gè)js文件出現(xiàn)其他js成員的ide提示岩齿,可以再js文件開頭使用3個(gè)斜杠注釋和reference指令的path指向此js文件路徑,這樣在編寫這個(gè)js文件時(shí)苞俘,ide就會(huì)自動(dòng)出現(xiàn)path指向的js文件中的成員盹沈。

如導(dǎo)入jquery框架,在vs2013中編寫js文件時(shí)苗胀,jquery的標(biāo)志性字符$就會(huì)自動(dòng)出現(xiàn)在ide中襟诸,并且其方法也會(huì)一起ide提示瓦堵,大大加快代碼編寫速度。

image.png

注意:reference注釋需要放在js文件開頭(并不需要一定是第一行歌亲,前面可以有空白行)菇用,但是前面只能是空白行,不能有其他js代碼陷揪。注釋需要為3個(gè)斜杠///惋鸥,經(jīng)測(cè)試多一個(gè)少一個(gè)都不行,應(yīng)該延續(xù)了C#的注釋悍缠∝孕澹可以使用注釋///reference導(dǎo)入多個(gè)會(huì)引用到的js文件。

///<reference path="jquery1.4.2.js">
///<reference path="hightlight.js">

提醒:js文件三斜杠注釋///reference path導(dǎo)入的文件是給ide用的飞蚓,你的html頁(yè)面注意一定也要導(dǎo)入對(duì)應(yīng)的js文件滤港,要不會(huì)報(bào)錯(cuò)。

參考
使用Typescript來寫javascript
TypeScript 三斜線指令
/// <reference path="../../libs/underscore.browser.d.ts"/>
它是一種注釋趴拧,告訴typescript編譯器溅漾,當(dāng)前文件使用了哪些聲明文件,以幫助編輯器提示信息著榴,及編譯器檢查類型添履。這種注釋很重要,如果后面的路徑不對(duì)脑又,則編譯會(huì)失敗暮胧。

引用的文件以 .d.ts 結(jié)尾,它們是一種聲明文件问麸,就像是c語(yǔ)言中的header文件往衷,只包含了類或函數(shù)的簽名,而沒有實(shí)際內(nèi)容口叙,用于編輯器提示和編譯器驗(yàn)證炼绘。它們的內(nèi)容形如:

declare interface UnderscoreVoidListIterator {
    (element : any, index : number, list : any[]) : void;
}

declare interface UnderscoreMemoListIterator {
    (memo : any, element : any, index : number, list : any[]) : any;
}

declare interface UnderscoreListIterator {
    (element : any, index : number, list : any[]) : any;
}

這種文件很重要嗅战,因?yàn)槲覀円胧褂玫谌降膉s庫(kù)妄田,一般都需要手動(dòng)做出這樣的聲明文件,才能在typesafe的環(huán)境中使用它們驮捍。只需要以注釋的方式寫上即可疟呐,不需要在實(shí)際代碼中聲明或引用什么。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末东且,一起剝皮案震驚了整個(gè)濱河市启具,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌珊泳,老刑警劉巖鲁冯,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拷沸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡薯演,警方通過查閱死者的電腦和手機(jī)撞芍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跨扮,“玉大人序无,你說我怎么就攤上這事『獯矗” “怎么了帝嗡?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)璃氢。 經(jīng)常有香客問我哟玷,道長(zhǎng),這世上最難降的妖魔是什么一也? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任碗降,我火速辦了婚禮,結(jié)果婚禮上塘秦,老公的妹妹穿的比我還像新娘讼渊。我一直安慰自己,他們只是感情好尊剔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布爪幻。 她就那樣靜靜地躺著,像睡著了一般须误。 火紅的嫁衣襯著肌膚如雪挨稿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天京痢,我揣著相機(jī)與錄音奶甘,去河邊找鬼。 笑死祭椰,一個(gè)胖子當(dāng)著我的面吹牛臭家,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播方淤,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼钉赁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了携茂?” 一聲冷哼從身側(cè)響起你踩,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后带膜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吩谦,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年膝藕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逮京。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡束莫,死狀恐怖懒棉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情览绿,我是刑警寧澤策严,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站饿敲,受9級(jí)特大地震影響妻导,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怀各,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一倔韭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓢对,春花似錦寿酌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至法焰,卻和暖如春秧荆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背埃仪。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工乙濒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卵蛉。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓颁股,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親毙玻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豌蟋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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