我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Project Reference优化TypeScript编译性能示例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Project Reference优化TypeScript编译性能示例

引言

TypeScript 给 JavaScript 添加了一套类型系统,可以在编译期间检查出类型错误,这增加了代码的健壮性,但也多了一个编译的过程。

ts 编译速度与项目规模有关,如果项目比较大,代码很多,那就需要编译很长一段时间。

有没有什么办法可以提升 tsc 编译的性能呢?

还真有,TypeScript 3.0 的时候实现了 Project Reference 的特性,就是用于优化编译和类型检查的性能的。

那 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的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Project Reference优化TypeScript编译性能示例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Project Reference优化TypeScript编译性能示例

这篇文章主要为大家介绍了Project Reference优化TypeScript编译性能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

Android性能优化之内存优化的示例分析

这篇文章主要介绍Android性能优化之内存优化的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、Android内存管理机制1.1 Java内存分配模型先上一张JVM将内存划分区域的图程序计数器:存储当前线
2023-06-15

C#中如何使用编译器优化代码性能

C#中如何使用编译器优化代码性能,需要具体代码示例引言:在软件开发中,代码性能是一个重要的考量因素。好的代码性能可以提升程序的运行速度,减少资源占用,并提供更好的用户体验。而在C#开发中,编译器提供了一些优化技术,可以帮助我们进一步提升代码
2023-10-22

C++编译器之间不同性能的示例分析

这期内容当中小编将会给大家带来有关C++编译器之间不同性能的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。我主要从事windows下的编程,所以我一般用vc编译,毕竟是当今软件霸主的产品,性能和功
2023-06-17

Go语言编译技术演进与性能优化分析

Go语言作为一种编程语言,以其简洁、高效的特点被广泛应用于各种领域。在过去的几年里,随着软件开发需求的不断增长,Go语言的编译技术也在不断演进和优化。本文将探讨Go语言编译技术的发展历程,并着重分析其性能优化的重要性。一、Go语言编译技术
Go语言编译技术演进与性能优化分析
2024-03-10

GaussDB for MySQL性能优化的示例分析

小编给大家分享一下GaussDB for MySQL性能优化的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景我们先来看看MySQL 8.0的事务提交的
2023-06-15

MySQL数据库性能优化的示例分析

小编给大家分享一下MySQL数据库性能优化的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什么做优化??因为数据量太多了,项目部署上线再到用户使用,每天
2023-06-22

编程热搜

目录