Project Reference优化TypeScript编译性能示例
作者:zxg_神说要有光 发布时间:2024-04-19 09:43:03
引言
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 相互之间都比较独立,一个模块的改动一般不会影响另一个模块,所以编译的时候也应该各自做缓存。
来源:https://juejin.cn/post/7129130418657296421


猜你喜欢
- 我想让一片文章,每到3000字就分到下一条插入到数据库,求高手 <%Dim Content Conte
- Pandas使用这些函数处理缺失值:isnull和notnull:检测是否是空值,可用于df和seriesdropna:丢弃、删除缺失值ax
- 背景客户最近有这样的需求,想通过统计Oracle数据库活跃会话数,并记录在案,利用比对历史的活跃会话的方式,实现对系统整体用户并发量有大概的
- 现在IE7已经推出一段时间并且渗透到用户当中,不用等太久我们就可以在页面上使用更高级的CSS。两个最有用的项目将是 Child子和Adjac
- 一、添加SVN(1)添加svn插件(2)安装的svn最好是默认路径安装的,不要问我为什么,因为很多软件都是按照默认路径找到bin的表示安装正
- 我们知道可以将一个海量记录的 MySQL 大表根据主键、时间字段,条件字段等分成若干个表甚至保存在若干服务器中。 唯一的问题就是跨服务器批量
- 如下所示:Uploadfiles = request.FILES.get('参数', '')for i in
- 前言今天呢,笔者想和大家来聊聊python+pytest接口自动化测试的参数关联,笔者这边就不多说废话了,咱们直接进入正题。一、什么是参数关
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN&
- 1.问题描述当我们在实用ElementUI组件完成项目的时候可能会遇到这样的需求,比如:新建一个活动,需要定义活动的时间范围;因此我们在新建
- 我们提倡尽可能使用CSS,而且我们常常能做到这一点。现代浏览器有很好的CSS支持-这无疑足够好让你使用CSS来控制布局和版面设计。但是有时候
- 这里需要用到python处理excel很经典的库openpyxl,安装也特别简单。window直接pip install就好了代码在这里~w
- 可以通过遍历的方法:pandas按行按列遍历Dataframe的几种方式:https://www.jb51.net/article/1726
- 在家无聊,线代和高数看不懂,整点事情干,就准备预定回学校的高铁票,于是就有了这个文章准备工作1.pip安装chromediver,当然也可以
- 一提到数字图像处理,可能大多数人就会想到matlab,但matlab也有自身的缺点:1、不开源,价格贵2、软件容量大。一般3G以上,高版本甚
- 这篇文章主要介绍了python return逻辑判断表达式实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 关于string的split 和 join 方法对导入os模块进行os.path.splie()/os.path.join() 貌似是处理机
- np.arange 步长0.1问题两个小测试:1)count输出什么?import numpy as np y_m
- python断言assert语句assert语句的格式是【assert 表达式,返回数据】,当表达式为False时则触发AssertionE
- 问题查看 tensorflow api manual 时,看到关于 variable.read_value() 的注解如图:那么在 tens