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.mzph.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单细胞+空转肿瘤微环境分析

说在前面 说起肺癌真的过去回忆历历在目,小编毕业后职业生涯的第一个项目——非小细胞肺癌预后有效靶点筛选。当时肝的是转录组预后建模筛选。 做研发其实要求是远远高于发文章的,文章投不出去就降分,加工作量,做药要是烂尾或者…