TypeScript項目引用(project references)

轉(zhuǎn)發(fā) # TypeScript項目引用(project references)

TypeScript新特性之項目引用(project references)

項目引用是TypeScript 3.0中的一項新功能合住,允許您將TypeScript程序構(gòu)建為更小的部分序调。

通過這樣做芥永,您可以大大縮短構(gòu)建時間弓千,實現(xiàn)組件之間的邏輯分離,并以新的更好的方式組織代碼。

我們還為tsc引入了一種新模式,即--build標志,它與項目引用協(xié)同工作羞延,以實現(xiàn)更快的TypeScript構(gòu)建。

示例項目

讓我們看一個相當(dāng)正常的程序脾还,看看項目引用如何幫助我們更好地組織它伴箩。
想象一下,你有一個項目有兩個模塊鄙漏,轉(zhuǎn)換器和單元嗤谚,以及每個模塊的相應(yīng)測試文件:

/src/converter.ts
/src/units.ts
/test/converter-tests.ts
/test/units-tests.ts
/tsconfig.json

測試文件導(dǎo)入實現(xiàn)文件并進行一些測試:

// converter-tests.ts
import * as converter from "../converter";

assert.areEqual(converter.celsiusToFahrenheit(0), 32);

以前,如果您使用單個tsconfig文件怔蚌,則此結(jié)構(gòu)很難處理:

  1. 實現(xiàn)文件可以導(dǎo)入測試文件
  2. 在輸出文件夾名稱中沒有出現(xiàn)src的情況下巩步,無法同時構(gòu)建test和src,這可能是您不想要的
  3. 僅更改實現(xiàn)文件中的內(nèi)部結(jié)構(gòu)需要再次檢查測試桦踊,即使這不會導(dǎo)致新的錯誤
  4. 僅更改測試需要再次對實現(xiàn)進行檢查椅野,即使沒有任何改變

您可以使用多個tsconfig文件來解決其中的一些問題,但會出現(xiàn)新的問題:

  1. 沒有內(nèi)置的最新檢查,因此您最終總是運行兩次tsc
  2. 兩次調(diào)用tsc會導(dǎo)致更多的啟動時間開銷
  3. tsc -w無法一次在多個配置文件上運行

項目引用(project references)可以解決所有這些問題等等竟闪。

什么是項目引用(project references)?

tsconfig.json文件有一個新的頂級屬性"references"离福。
它是一個對象數(shù)組,指定要引用的項目:

{
    "compilerOptions": {
        // The usual
    },
    "references": [
        { "path": "../src" }
    ]
}

每個引用的path屬性可以指向包含tsconfig.json文件的目錄炼蛤,也可以指向配置文件本身(可以具有任何名稱)妖爷。
當(dāng)您引用項目時,會發(fā)生新的事情:

  1. 從引用的項目導(dǎo)入模塊將改為加載其輸出聲明文件(.d.ts)
  2. 如果引用的項目生成outFile理朋,則輸出文件.d.ts文件的聲明將在此項目中可見
  3. 如果需要絮识,構(gòu)建模式(下面會提到)將自動構(gòu)建引用的項目

通過分成多個項目,您可以大大提高類型檢查和編譯的速度嗽上,減少使用編輯器時的內(nèi)存使用量次舌,并改進程序邏輯分組的實施。

composite

引用的項目必須啟用新的composite設(shè)置炸裆。
需要此設(shè)置以確保TypeScript可以快速確定在何處查找引用項目的輸出垃它。
啟用composite標志會改變一些事情:

  1. rootDir設(shè)置(如果未顯式設(shè)置)默認為包含tsconfig文件的目錄
  2. 所有實現(xiàn)文件必須由include模式匹配或在files數(shù)組中列出鲜屏。如果違反此約束烹看,tsc將通知您未指定哪些文件
  3. declaration必須打開

declarationMaps

我們還增加了對declaration source maps的支持。如果啟用--declarationMap洛史,您將能夠使用編輯器功能惯殊,如"轉(zhuǎn)到定義"和重命名,以在支持的編輯器中跨項目邊界透明地導(dǎo)航和編輯代碼也殖。

以outFile為前綴

您還可以使用引用中的prepend選項啟用前置依賴項的輸出:

"references": [
   { "path": "../utils", "prepend": true }
]

預(yù)先設(shè)置項目將包括項目的輸出高于當(dāng)前項目的輸出土思。
這適用于.js文件和.d.ts文件,源代碼映射文件也將正確發(fā)出忆嗜。

tsc只會使用磁盤上的現(xiàn)有文件來執(zhí)行此過程己儒,因此可以創(chuàng)建一個項目,其中無法生成正確的輸出文件捆毫,因為某些項目的輸出將在結(jié)果文件中出現(xiàn)多次闪湾。
例如:

   A
  ^ ^
 /   \
B     C
 ^   ^
  \ /
   D

在這種情況下,重要的是不要在每個參考文獻中添加前綴绩卤,因為在D的輸出中最終會得到兩個A副本 - 這可能會導(dǎo)致意外結(jié)果途样。

項目引用的注意事項

項目引用有一些您應(yīng)該注意的權(quán)衡。

因為依賴項目使用從其依賴項構(gòu)建的.d.ts文件濒憋,所以您必須在克隆之后簽入某些構(gòu)建輸出或構(gòu)建項目何暇,然后才能在編輯器中導(dǎo)航項目而不會看到虛假錯誤。
我們正在開發(fā)一個能夠緩解這種情況的幕后.d.ts生成過程凛驮,但是現(xiàn)在我們建議告知開發(fā)人員他們應(yīng)該在克隆之后構(gòu)建它們裆站。

此外,為了保持與現(xiàn)有構(gòu)建工作流的兼容性,除非使用--build開關(guān)調(diào)用遏插,否則tsc不會自動構(gòu)建依賴項捂贿。
讓我們了解更多關(guān)于--build的信息。

TypeScript的構(gòu)建模式

期待已久的功能是TypeScript項目的智能增量構(gòu)建胳嘲。
在3.0中厂僧,您可以將-build標志與tsc一起使用。
這實際上是tsc的新入口點了牛,其行為更像構(gòu)建協(xié)調(diào)器而不是簡單的編譯器颜屠。

運行tsc --build(簡稱tsc -b)將執(zhí)行以下操作:

  1. 查找所有引用的項目
  2. 檢測它們是否是最新的
  3. 按正確的順序構(gòu)建過時的項目

您可以為tsc -b提供多個配置文件路徑(例如tsc -b src test)。
就像tsc -p一樣鹰祸,如果命名為tsconfig.json甫窟,則不需要指定配置文件名本身。

> tsc -b                                # 在當(dāng)前目錄中構(gòu)建tsconfig.json
> tsc -b src                            # 構(gòu)建src/tsconfig.json
> tsc -b foo/release.tsconfig.json bar  # 構(gòu)建foo/release.tsconfig.json和構(gòu)建bar/tsconfig.json

不要擔(dān)心您在命令行上傳遞的排過序的文件 - 如果需要蛙婴,tsc將重新排序它們粗井,以便始終首先構(gòu)建依賴項。
還有一些特定于tsc -b的標志:

--verbose: 打印詳細日志記錄以解釋正在發(fā)生的事情(可能與任何其他標志組合)
--dry: 顯示將要完成的但實際上不構(gòu)建任何內(nèi)容
--clean: 刪除指定項目的輸出(可以與--dry結(jié)合使用)
--force: 就好像所有項目都已過時一樣
--watch: 監(jiān)視模式(除了--verbose外街图,不得與任何標志組合使用)

注意事項

通常浇衬,除非出現(xiàn)noEmitOnError,否則tsc將在出現(xiàn)語法或類型錯誤時生成輸出(.js和.d.ts)餐济。
在增量構(gòu)建系統(tǒng)中執(zhí)行此操作將非常糟糕 - 如果您的一個過時的依賴項出現(xiàn)新錯誤耘擂,您只能看到它一次,因為后續(xù)構(gòu)建將跳過構(gòu)建現(xiàn)在最新的項目絮姆。
因此醉冤,tsc -b實際上就像為所有項目啟用noEmitOnError一樣。
如果您檢查任何構(gòu)建輸出(.js篙悯,.d.ts蚁阳,.d.ts.map等),您可能需要在某些源控制操作之后運行--force構(gòu)建鸽照,具體取決于源控制工具是否保留
本地副本和遠程副本之間的時間映射螺捐。

MSBuild

如果您有msbuild項目,則可以通過添加如下代碼到您的proj文件來啟用構(gòu)建模式

<TypeScriptBuildMode>true</TypeScriptBuildMode>

這將啟用自動增量構(gòu)建和清潔移宅。

請注意归粉,與tsconfig.json/-p一樣,不會遵循現(xiàn)有的TypeScript項目屬性 - 應(yīng)使用tsconfig文件管理所有設(shè)置漏峰。

一些團隊已經(jīng)設(shè)置了基于msbuild的工作流糠悼,其中tsconfig文件與他們配對的托管項目具有相同的隱式圖表排序。
如果您的解決方案是這樣的浅乔,您可以繼續(xù)使用msbuild和tsc -p以及項目引用;
這些是完全可互操作的倔喂。

指導(dǎo)(Guidance)

整體結(jié)構(gòu)

使用更多tsconfig.json文件铝条,您通常需要使用配置文件繼承來集中您的常用編譯器選項。
這樣席噩,您可以在一個文件中更改設(shè)置班缰,而不必編輯多個文件。

另一個好的做法是擁有一個"解決方案"tsconfig.json文件悼枢,該文件只引用了所有l(wèi)eaf-node項目埠忘。
這提供了一個簡單的切入點;
例如,在TypeScript repo中馒索,我們只運行tsc -b src來構(gòu)建所有端點莹妒,因為我們列出了src/tsconfig.json中的所有子項目。請注意绰上,從3.0開始旨怠,如果在tsconfig.json中至少有一個reference將不會針對空的files數(shù)組報錯

您可以在TypeScript存儲庫中看到這些模式 - src/tsconfig_base.jsonsrc/tsconfig.jsonsrc/tsc/tsconfig.json作為關(guān)鍵示例蜈块。

構(gòu)建相關(guān)模塊

通常鉴腻,使用相關(guān)模塊transition a repo并不需要太多。
只需將tsconfig.json文件放在給定父文件夾的每個子目錄中百揭,并添加對這些配置文件的引用以匹配程序的預(yù)期分層爽哎。
您需要將outDir設(shè)置為輸出文件夾的顯式子文件夾,或?qū)ootDir設(shè)置為所有項目文件夾的公共根目錄信峻。

構(gòu)建outFiles

使用outFile進行編譯的布局更靈活倦青,因為相對路徑無關(guān)緊要瓮床。
要記住的一件事是盹舞,您通常希望在"最后"項目之前不使用前置 - 這將改善構(gòu)建時間并減少任何給定構(gòu)建中所需的I/O量。
TypeScript repo本身就是一個很好的參考 - 我們有一些"庫"項目和一些"端點"項目;
"端點"項目盡可能小隘庄,只吸引他們需要的庫踢步。

原文地址:
http://www.typescriptlang.org/docs/handbook/project-references.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丑掺,隨后出現(xiàn)的幾起案子获印,更是在濱河造成了極大的恐慌,老刑警劉巖街州,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兼丰,死亡現(xiàn)場離奇詭異,居然都是意外死亡唆缴,警方通過查閱死者的電腦和手機鳍征,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來面徽,“玉大人艳丛,你說我怎么就攤上這事匣掸。” “怎么了氮双?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵碰酝,是天一觀的道長。 經(jīng)常有香客問我戴差,道長送爸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任暖释,我火速辦了婚禮碱璃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饭入。我一直安慰自己嵌器,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布谐丢。 她就那樣靜靜地躺著爽航,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乾忱。 梳的紋絲不亂的頭發(fā)上讥珍,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音窄瘟,去河邊找鬼衷佃。 笑死,一個胖子當(dāng)著我的面吹牛蹄葱,可吹牛的內(nèi)容都是我干的氏义。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼图云,長吁一口氣:“原來是場噩夢啊……” “哼惯悠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起竣况,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤克婶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丹泉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情萤,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年摹恨,在試婚紗的時候發(fā)現(xiàn)自己被綠了筋岛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡睬塌,死狀恐怖泉蝌,靈堂內(nèi)的尸體忽然破棺而出歇万,到底是詐尸還是另有隱情,我是刑警寧澤勋陪,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布贪磺,位于F島的核電站,受9級特大地震影響诅愚,放射性物質(zhì)發(fā)生泄漏寒锚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一违孝、第九天 我趴在偏房一處隱蔽的房頂上張望刹前。 院中可真熱鬧,春花似錦雌桑、人聲如沸喇喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拣技。三九已至,卻和暖如春耍目,著一層夾襖步出監(jiān)牢的瞬間膏斤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工邪驮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莫辨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓毅访,卻偏偏與公主長得像沮榜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俺抽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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