TypeScript 语言服务:如何优化性能和调试

阅读时长 9 分钟读完

前言

TypeScript 是现代化前端开发中应用广泛的一种语言。它提供了强类型检查和面向对象编程的特性,使得代码更加健壮和可靠。但是随着项目越来越庞大,TypeScript 的语言服务(Language Service)(即 TypeScript 语言的实时编辑器和代码分析器)的性能问题也越来越明显。在本文中我们将介绍如何优化 TypeScript 语言服务的性能和调试。

优化 TypeScript 语言服务的性能

缩小监视的范围

由于 TypeScript 的语言服务会监视文件系统的变化,因此它会对项目中的所有文件进行检查。我们可以通过配置监视的文件路径来缩小范围。比如,我们可以将配置的 "include" 和 "exclude" 属性进行合理的设置,使语言服务只监视我们需要的文件,以此来提高性能。

-- -------------------- ---- -------
-
    ------------------ -
        --------- ---------
        ------ ------- ----------
        --------- -----------
        ------------------ -----
        --------- -----
        ------------------- -------
        ---------- ----
        -------- -
            -------- ---------
        -
    --
    ---------- -
        ----------
    --
    ---------- -
        --------------
    -
-

在上面的配置文件中,我们仅仅监视了 "src/**/*" 路径下的文件夹,同时忽略了 "node_modules" 中的文件夹。

缓存 TypeScript 编译器

TypeScript 的语言服务在执行某些操作时需要使用 TypeScript 编译器所提供的一些信息。因此,我们可以缓存一些 TypeScript 编译器的信息来加快语言服务的执行速度。这可以通过使用 ts-memo 库来实现:

-- -------------------- ---- -------
------ - ---- - ---- ----------

----- --------------- - --- -- ----
----- ------------- - ----------- --------- -- --------------------------- -----------------

----- --------------------- - ------------------- -
  -------- --- -- ------
---

----- -------- - ---------------------------------- -------------
----- -------- - ------------------------------------

-------------------- --- ---------- -- -----

使用持久化缓存

除了缓存编译器的信息之外,我们还可以使用持久化缓存,在不同的会话中复用缓存来提高性能。可以使用 TypeScript 的 createIncrementalCompilerHost 函数进行持久化缓存的设置。这个函数有一个 getCachePath 可以指定缓存文件的位置。

-- -------------------- ---- -------
------ - -- -- ---- -------------
----- -------------- - -------------------------
----- ---------- - ----------------
---------------------------- - ---------- ---- ---

----- ---- - ----------------------------------
  ---
  -- ---
  ------------- -- -- ----------------------------------------------
---

减少不必要的检查

TypeScript 的语言服务会检查语法和类型错误。在某些情况下,我们可以通过一些技巧减少检查的数量,从而提高编辑器的响应速度。

设置 "noEmit"

在 TypeScript 的 compilerOptions 中设置 noEmittrue,可以防止 TypeScript 编译器为每个文件生成输出。不生成输出的话就可以避免生成一些不必要的信息来加快检查速度。

-- -------------------- ---- -------
-
  ------------------ -
    --------- -----
    --------- ---------
    ------ ------- ----------
    --------- -----------
    ------------------ -----
    --------- -----
    ------------------- -------
    ---------- ----
    -------- -
      -------- ---------
    -
  --
  -- ---
-

禁用类型检查

我们可以在一些不需要进行类型检查的场景中禁用类型检查,如 init.ts 文件。此时,我们可以在 tsconfig.json 中,将 init.ts 强制设置为 noEmit: true,这样 TypeScript 的编译器就不会对该文件进行类型检查。

-- -------------------- ---- -------
-
  ------------------ -
    -- ---
  --
  -------- ------------
  ---------- -
    --------------
  --
  ----------- -
    ---------- - --------- ---- -
  -
-

Lambda 中使用 "as const"

在 TypeScript 中,若某个变量的类型需要存储数据,我们可以将其声明为 const 避免重新赋值。在 Lambda 表达式中,我们可以使用 as const 来表明该值不需要类型检查,从而减少类型检查的数量。

减少泛型的使用

TypeScript 中的类型检查器需要处理各种类型,包括泛型和嵌套类型。这些类型比较复杂,需要更多的时间来检查。因此,在 TypeScript 中,应该尽量减少泛型和嵌套类型的使用,这样可以显著提高编辑器的性能。

调试 TypeScript 语言服务

开发中,我们有时希望对 TypeScript 的语言服务进行一些调试。下面我们提供了几种调试 TypeScript 的技巧。

使用 VSCode 调试 TypeScript 语言服务

VSCode 的调试器可以帮助我们在命令行环境中执行 TypeScript 的语言服务。我们需要将 tsconfig.json 中的 outDir 设置为 ./bin,并且在 .vscode/launch.json 配置文件中添加一个调试配置来启动调试。我们可以将模板配置复制一份,将 preLaunchTask 改成 "tsc: watch",为 preLaunchTask 任务后期定义的任务名。此时,启动 VSCode 的调试器就可以调试 TypeScript 的语言服务。

-- -------------------- ---- -------
-- -------------------
-
  -- --- ------------ -- ----- ----- -------- -----------
  ---------- --------
  ----------------- -
    -- -------- -- ---- -------------
    -
      ------- --- ------
      ------- -------
      ---------- ---------
      ------- ------------------------------------
      -------------- ------ --------------------
      ------ ---------------------
      ----------- ------------
    --
    -- ---------- -------- ------- -------------
    -
      ------- -------
      ---------- ---------
      ------- ------- -------- ---------
      ---------- ----------------------------------------------------------
      ------- ------------------- -----------
      -------------------- -------
      ------ -------------------
      ---------- ---------------------
      ------------------------- ------------
    --
  -
-

使用 tsserver 的 --log-level 参数

TypeScript 的语言服务提供了一个 --log-level 命令行参数,它可以显示语言服务中的所有消息。在调试 TypeScript 语言服务时,我们可以使用 --log-level verbose 参数详细地输出调试信息。这可以帮助我们找到性能瓶颈,优化 TypeScript 语言服务的性能。

使用 Chrome 的 DevTools

我们可以使用 Chrome 的 DevTools 来查看内存使用情况和代码执行时间。可以通过在命令行中使用 --inspect 参数启动 tsserver,然后在 Chrome 中打开 chrome://inspect 页面,可以看到正在运行的 tsserver 进程。

结论

本文介绍了如何优化 TypeScript 语言服务的性能和调试。我们可以通过缩小检查范围、缓存 TypeScript 编译器、使用持久化缓存、减少不必要的检查和减少泛型使用来提高 TypeScript 的性能。同时,我们可以使用 VSCode 的调试器、tsserver 的 --log-level 命令行参数和 Chrome 的 DevTools 来调试 TypeScript 的语言服务。希望对大家有所帮助,谢谢阅读!

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674e7100e884a3e30f2745aa

纠错
反馈