TypeScript Project References npm 包構建小實踐

npm 包輸出 es/cjs 產物

在開發一個 npm 包時,通常需要同時輸出 ES 模塊和 CommonJS 模塊的產物供不同的構建進行使用。在只使用tsc進行產物編譯的情況下,我們通常可以通過配置兩個獨立的 tsconfig.json 配置文件,并在一個 npm script 中 執行兩次 tsc 命令來實現

項目結構

假設我們的項目結構如下:

my-package/
├── src/
│   └── index.ts
├── dist/
│   ├── es/
│   └── cjs/
├── package.json
├── tsconfig.es.json
└── tsconfig.cjs.json

配置 TypeScript

tsconfig.es.json

為 ES 模塊創建一個 tsconfig.es.json 文件:

{"compilerOptions": {"rootDir": "src","module": "ESNext","moduleResolution": "Node","outDir": "dist/es"},"include": ["src"]
}

tsconfig.cjs.json

為 CommonJS 模塊創建一個 tsconfig.cjs.json 文件:

{"compilerOptions": {"rootDir": "src","module": "CommonJS","moduleResolution": "Node","outDir": "dist/cjs"},"include": ["src"]
}

配置構建腳本

在 package.json 中,我們可以添加以下腳本來構建我們的項目,執行兩次 tsc 并分別指定不同的配置文件

{"scripts": {"build": "tsc -p tsconfig.es.json && tsc -p tsconfig.cjs.json",}
}

通過運行 npm run build,可以生成同時包含 ES 模塊和 CommonJS 模塊的產物

TypeScript 的 references 是什么

TypeScript 的項目引用(Project References)是 TypeScript 3.0 引入的一項功能,允許一個 TypeScript 項目引用另一個 TypeScript 項目。這使得我們可以將大型代碼庫拆分為多個較小的項目,并且這些項目可以相互依賴

Project References 的好處

  • 增量編譯:當項目引用被正確配置時,TypeScript 只會重新編譯發生變化的部分,從而大幅提升編譯速度。
  • 模塊化:通過項目引用,可以將代碼庫拆分為多個獨立的、可復用的模塊,提升代碼的可維護性和可讀性。
  • 類型安全:項目引用確保了項目之間的類型安全,避免了類型不一致的問題。

配置

要使用項目引用,需要在 tsconfig.json 中添加 references 字段。例如:

{"compilerOptions": {"composite": true,"declaration": true,"outDir": "./dist"},"include": ["src"],"references": [{ "path": "../other-project" }]
}

相應的子項目需要存在相應的tsconfig.json配置,并且配置compilerOptions.composite=true,這樣才能被主項目引用。如

{"compilerOptions": {"composite": true,"types": [],"rootDir": "src","module": "ESNext","moduleResolution": "Node","outDir": "dist"}
}

使用 TypeScript 的 references 后如何實現一個命令 tsc 輸出 ES 和 CommonJS 產物并且提升增量編譯的性能

仍以上面的項目結構為例子,我們使用 TypeScript 的項目引用來實現這個需求。

項目結構

假設我們的項目結構如下:

my-package/
├── src/
│   └── index.ts
├── dist/
│   ├── es/
│   └── cjs/
├── package.json
├── tsconfig.json
├── tsconfig.base.json
├── tsconfig.es.json
└── tsconfig.cjs.json

首先,我們需要在根目錄下創建一個 tsconfig.json 文件,用于配置項目引用:

{"files": [],"references": [{ "path": "./tsconfig.es.json" },{ "path": "./tsconfig.cjs.json" }]
}

配置 tsconfig.es.json

為 ES 模塊創建一個 tsconfig.es.json 文件:

{"extends": "./tsconfig.base.json","compilerOptions": {"outDir": "./dist/es","module": "ESNext"}}

配置 tsconfig.cjs.json

為 CommonJS 模塊創建一個 tsconfig.cjs.json 文件:

{"extends": "./tsconfig.base.json","compilerOptions": {"outDir": "./dist/cjs","module": "CommonJS"}
}

公共配置 tsconfig.base.json

為了避免重復配置,我們可以創建一個 tsconfig.base.json 文件,包含通用的配置:


{"compilerOptions": {"target": "ES5","declaration": true,"moduleResolution": "node","esModuleInterop": true,"skipLibCheck": true,"composite": true,"rootDir": "src"},"include": ["src"]
}

構建腳本

在 package.json 中,我們可以添加以下腳本來構建我們的項目

{"scripts": {"build": "tsc -b"}
}

此時我們不再需要執行兩次 tsc 命令,而是只需要執行一次 tsc -b 命令即可輸出符合我們需求的 es + cjs 產物(和上面的兩次執行 tsc 是一樣的效果)。

在這個場景下 TypeScript 會根據項目引用的配置,自動構建 ES 模塊和 CommonJS 模塊,并且只會重新編譯發生變化的部分,從而提升增量編譯的性能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37732.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37732.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37732.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kubesphere自定義流水線基礎鏡像

背景 需求:在流水線基礎pod中使用python和jinja2模塊來動態渲染部署文件 由于ks提供的基礎鏡像無法滿足以上需求,在ks提供的maven鏡像的基礎上實現 實施 制作鏡像&并推送到private image repo FROM kubesphere/builder-maven:v3.2.0 RUN sed -i…

7.1作業

1.思維導圖 2.在堆區申請兩個長度為32的空間,實現兩個字符串的比較【非庫函數實現】 (1)定義函數,在對區申請空間 兩個申請,主函數需要調用2次 (2)定義函數,實現字符串的輸入 void input(char *p) (3)調用函數實現字符串比較…

BUT000增強字段BAPI結構激活出錯(BUPA_CENTRAL_CI_CHANGE)

導語:BP主數據增強字段,需要使用BAPI:BUPA_CENTRAL_CI_CHANGE進行值寫入,但是在SAP 2023以后的版本,激活會出錯,原因是因為SAP的一個結構同時包含了BUS00_EEW以及BUS00_EEWX兩個結構,導致結構字…

Spring Security 認證流程

Spring Scurity是spring生態下用于認證和授權的框架,具有高度的靈活性和可擴展行,本節主要對Spring Security的認證過程中進行概括性的介紹,主要介紹在該過程中,會涉及到哪些組件以及每個組件所承擔的職責,希望大家可以…

Elasticsearch 配置說明

# ---------------------------------- Cluster ----------------------------------- cluster.name: yh-es # es名稱 # ------------------------------------ Node ------------------------------------ node.name: xibo-es node.master: true node.da…

電腦錄音軟件哪個好?7款錄制音頻工具大盤點,趕快學起來!(2024)

也許你渴望提取你最喜歡的節目的背景音樂,或者你希望錄制自己的聲音制作教程。如果是這樣,你就需要一款優秀的電腦錄音軟件,來幫助你捕捉任何你想要的聲音,而且不會損失音質。目前市場上存在著大量的錄制音頻工具,面對…

鎖相環相位噪聲仿真代碼-匯總

24小時自動發貨 所設計的壓控振蕩器輸入電壓為0.625V時,輸出大致為500Mhz;輸入電壓為1.559時,輸出電壓大致為1Ghz 1.文件夾里面各個文件作用(包括參考書PLL PHASE NOISE ANALYSIS、lee的射頻微電子、以及前人留下的matlab文件還有…

ModStart:開源免費的PHP企業網站開發建設管理系統

大家好!今天我要給大家介紹一款超級強大的開源工具——ModStart,它基于Laravel框架,是PHP企業網站開發建設的絕佳選擇! 為什么選擇ModStart? 模塊化設計:ModStart采用模塊化設計,內置了眾多基…

Ubuntu(通用)—網絡加固—防DNS污染和ARP欺騙

1. 防DNS污染 DNS協議,把域名解析成ip地址,udp,這個過程會暴露訪問的域名, 對這一傳輸過程加密(傳輸層用tcp)即為DoH(DNS over HTTPS)。 Browser(firefox)加固 由于Cloudflare、Quad8的DoH服務器不能用&…

三維重建基礎【知識點總結】

三維重建基礎【知識點總結】 rasterizationvolumetric ray-marchingSfM(Structure from Motion)Spherical Harmonics多視圖立體(Multiple View Stereo, MVS)動畫制作專業術語 rasterization Rasterization,中文通常譯…

雅思詞匯及發音積累 2024.7.1

旅游場景 1.credit card 信用卡 2.driving license/licence 駕照 3.expire /?k?spa??(r)/ 駕照/護照等過期 4.platform 站臺 5.Currency 貨幣 6.Pound 英鎊 7.Deserts /d??z??ts/ 沙漠 8. hilly areas 丘陵地帶 9.wetlands 沼澤地 10.bushlands 灌木叢 11.tropi…

Dns被莫名篡改的問題定位(筆記)

引言:最近發現用戶的多臺機器上出現了Dns被莫名修改的問題,從系統事件上看并未能正常確定到是那個具體軟件所為,現在的需求就是確定和定位哪個軟件具體所為。 解決思路: 首先到IPv4設置頁面對Dns進行設置:通過ProcExp…

缺失d3dx9_43.dll是怎么回事?教你幾種靠譜的解決方法

在日常生活和工作中,電腦已經成為我們不可或缺的工具。然而,在使用電腦的過程中,我們常常會遇到一些問題,其中之一就是軟件運行時提示d3dx9_43.dll丟失。這個問題會導致軟件游戲無法啟動運行,但只要我們了解其原因和解…

LinkedHashMap、TreeMap

LinkedHashMap: 有序、不重復、無索引,底層是雙鏈表 TreeMap:底層基于紅黑樹,可以對鍵進行排序 默認排序:integer和string都是從小到大排序 例題:

git合并分支的疑問

今天遇到一個奇怪的問題: 1、后端從master拉了三個分支。分別為dev、test、和stage。 2、研發1從dev拉了分支feature1,然后commit、commit、commit……。最后request merge到dev、test和stage。成功了。 3、研發2從dev拉了分支feature2,注意,feature2…

Dataweave2 語法教程

DataWeave 是 MuleSoft 的數據語言,專門用于數據轉換和映射。在 MuleSoft 的 Anypoint Platform 中,它是數據集成的一部分。下面是一個 DataWeave 語法教程,涵蓋基本的語法和用法。 基本語法 DataWeave 腳本分為三個部分:%dw 聲…

SpringBoot整合WebClient進行Http遠程調用

使用WebClient進行Http遠程調用 文章目錄 使用WebClient進行Http遠程調用1.WebClient對象創建2.WebClient對象抽取config配置3.Get請求url參數設置4.獲取ResponseEntity對象5.Post請求測試示例代碼 WebClient 一旦創建,就是不可修改的,如果需要設置默認值…

DP:子數組問題

文章目錄 引言子數組問題介紹動態規劃的基本概念具體問題的解決方法動態規劃解法:關于子數組問題的幾個題1.最大子數組和2.環形子數組的最大和3.乘積最大子數組4.乘積為正數的最長子數組長度5.等差數列劃分 總結 引言 介紹動態規劃(DP)在解決…

音視頻開發31 FFmpeg 編碼- avcodec_find_encoder和avcodec_find_encoder_by_name

avcodec_find_encoder /** * Find a registered encoder with a matching codec ID. * * param id AVCodecID of the requested encoder * return An encoder if one was found, NULL otherwise. */ AVCodec *avcodec_find_encoder(enum AVCodecID id); 那么這個 AVCodec…

14分Top刊NC代碼開源|NSCLC單細胞+空轉腫瘤微環境分析

說在前面 說起肺癌真的過去回憶歷歷在目,小編畢業后職業生涯的第一個項目——非小細胞肺癌預后有效靶點篩選。當時肝的是轉錄組預后建模篩選。 做研發其實要求是遠遠高于發文章的,文章投不出去就降分,加工作量,做藥要是爛尾或者…