Project Reference优化TypeScript编译性能示例

 更新时间:2022年08月08日 09:15:24   作者:zxg_神说要有光  
这篇文章主要为大家介绍了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的资料请关注脚本之家其它相关文章!

相关文章

  • 前端Website sitemap.xml文件搜索引擎优化

    前端Website sitemap.xml文件搜索引擎优化

    这篇文章主要为大家介绍了前端Website的sitemap.xml文件和搜索引擎优化实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 以JS开发为例详解版本号的作用与价值

    以JS开发为例详解版本号的作用与价值

    这篇文章主要为大家介绍了以JS开发为例详解版本号的作用与价值详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 关于JavaScript轮播图的实现

    关于JavaScript轮播图的实现

    这篇文章主要介绍了关于JavaScript轮播图的实现,下面文章主要是利用利用html 和 css 代码实现轮播图,详细内容请参考下面详细内容,希望对你有所帮助
    2021-11-11
  • 直观详细的typescript隐式类型转换图文详解

    直观详细的typescript隐式类型转换图文详解

    这篇文章主要为大家介绍了直观详细的typescript隐式类型转换图文详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 从原生JavaScript到React深入理解

    从原生JavaScript到React深入理解

    这篇文章主要为大家介绍了从原生JavaScript到React深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 前端的状态管理(上)

    前端的状态管理(上)

    这篇文章主要讲解前端的状态管理,状态管理李娜就想到:Vuex、Redux、Flux、Mobx等等方案,不论哪种方案只要内容一多起来似乎都是令人头疼的问题,今天来聊一聊前端的状态管理,感兴趣的小伙伴可以参考参考下面文字具体内容
    2021-10-10
  • JS中的every()对空数组总返回true原理分析

    JS中的every()对空数组总返回true原理分析

    这篇文章主要为大家介绍了JS中的every()对空数组总返回true原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • JS ES新特性之变量的解耦赋值

    JS ES新特性之变量的解耦赋值

    这篇文章主要介绍了JS ES新特性变量的解耦赋值,ECMAScript 2015中允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为 解耦赋值 ,下面一起进入文章学习该内容,需要的朋友也可以参考一下
    2021-12-12
  • 小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)

    小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)

    这篇文章主要介绍了小程序开发页面窗口定位,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 微信小程序 参数传递详解

    微信小程序 参数传递详解

    这篇文章主要介绍了微信小程序 参数传递详解的相关资料,需要的朋友可以参考下
    2016-10-10

最新评论