<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
TypeScript 給 JavaScript 新增了一套型別系統,可以在編譯期間檢查出型別錯誤,這增加了程式碼的健壯性,但也多了一個編譯的過程。
ts 編譯速度與專案規模有關,如果專案比較大,程式碼很多,那就需要編譯很長一段時間。
有沒有什麼辦法可以提升 tsc 編譯的效能呢?
還真有,TypeScript 3.0 的時候實現了 Project Reference 的特性,就是用於優化編譯和型別檢查的效能的。
那 Project Reference 是幹什麼的呢?
想象這樣一個場景。專案目錄下有兩個相對獨立的模組 aaa 和 bbb
它們是用同一個 tsconfig.json 來設定編譯方式的:
執行 tsc 就會編譯所有 include 的檔案到 dist 目錄下:
假設 aaa 和 bbb 都很大,編譯要很久,但是兩者的關聯還不是特別大。
aaa 模組下的變動基本和 bbb 模組下的沒啥關係,但是 aaa 變了,bbb 也要重新編譯一遍,bbb 變了 aaa 也要重新編譯一遍,這就很沒必要。
有的同學說,那在 aaa 和 bbb 下分別放一個 tsconfig.json,各自編譯各自的不就行了?
這樣是可以,但是這樣就是多次編譯了,比較麻煩。
能不能還是一次編譯,但是對一些相對獨立的模組做下快取,不要跟隨別的模組一起編譯呢?
可以的,這就是 Project Reference 做的事情了。
在 aaa 和 bbb 下各自建立一個 tsconfig.json,放各自的編譯設定。注意這裡要加一個 composite: true,這是 Project Reference 需要的:
然後在根目錄的 tsconfig.json 里加上一個 references 的設定,引入 aaa 和 bbb:
這樣再執行 tsc --build 進行編譯,你會發現編譯結果多了 .d.ts 的宣告,還多了 tsconfig.tsbuildinfo 的檔案:
開啟 tsconfig.tsbuildinfo 看一下,會發現它記錄了編譯了哪些檔案,還記錄了這些檔案的 hash 值:
看到這裡,你是不是就知道為啥它能實現快取了?
沒錯,就是對比檔案的 hash,當編譯到這個 project 的時候,會對比下 hash 有沒有變化,變了才去編譯。沒變的就直接跳過了。
而且,別的地方可能用到這個 project 的型別,所以需要生成 d.ts 宣告檔案,這就是為啥我們沒有指定 declaration: true 的設定,但是編譯產物裡還是有 d.ts。其實這是 composite 選項做的,它設定了 Project Reference 需要的一些編譯選項:
現在當你修改了 aaa 下某個模組的程式碼,重新編譯的時候就不會編譯 bbb 了,只會編譯 aaa 下的那個模組。
這就是 Project Reference 的作用。
當然,這種編譯模式和常規的編譯模式不同,所以不是直接用 tsc 來編譯,而是用 tsc --build 或者 tsc -b。
此外,Project Reference 還支援通過 prepend 指定編譯順序,比如給 bbb 新增 prepend: true,那麼就會先編譯 bbb,再編譯當前專案,然後編譯 aaa:
其實很容易想到,monorepo 裡就可以用 Project Reference 來提升 tsc 的編譯效能。因為 monorepo 下的多個 project 相互之間都比較獨立,一個模組的改動一般不會影響另一個模組,所以編譯的時候也應該各自做快取。
TypeScript 3.0 時實現了 Project Reference 來優化效能。
如果專案下有一些相對獨立的模組,別的模組的變動不影響它,但是它卻要跟著重新編譯一次,這時就可以用 Project Reference 來優化了。
在獨立的模組下新增 tsconfig.json,加上 composite 的編譯選項,在入口的 tsconfig.json 裡設定 references 參照這些獨立的模組。然後執行 tsc --build 或者 tsc -b 來編譯。
這時候就實現了編譯和型別檢查的效能優化。
原理是編譯時會生成 tsconfig.tsbuildinfo 的檔案,記錄著編譯的檔案和它們的 hash,當再次編譯的時候,如果檔案 hash 沒變,那就直接跳過,從而提升了編譯速度。
這是 TypeScript 提供的編譯效能優化機制,當專案比較大,tsc 執行的速度比較慢的時候,不妨嘗試一下。
以上就是Project Reference優化TypeScript編譯效能範例的詳細內容,更多關於Project Reference優化tsc的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45