配置监视

编译器支持配置如何使用 TypeScript 3.8+ 中的编译器标志以及之前的环境变量来监视文件和目录。

背景

编译器的 --watch 实现依赖于使用 node 提供的 fs.watchfs.watchFile,这两种方法各有利弊。

fs.watch 使用文件系统事件来通知文件/目录中的更改。但这取决于操作系统,并且通知并不完全可靠,并且在许多操作系统上无法按预期工作。此外,可以创建的手表数量也可能受到限制,例如linux,我们可以用包含大量文件的程序很快耗尽它。但是因为这使用了文件系统事件,所以涉及的 CPU 周期并不多。编译器通常使用 fs.watch 来监视目录(例如,配置文件包含的源目录、模块解析失败的目录等)这些可以处理通知更改时缺少的精度。但是只有 Windows 和 OSX 支持递归观察。这意味着我们需要一些东西来替换其他操作系统上的递归性质。

fs.watchFile 使用轮询,因此涉及 CPU 周期。但是,fs.watchFile 是获取文件/目录状态更新的最可靠机制。编译器通常使用 fs.watchFile 来监视源文件、配置文件和丢失的文件(丢失的文件引用)。这意味着使用 fs.watchFile 时的 CPU 使用率取决于程序中的文件数。

使用 tsconfig.json 配置文件监视

{
  // Some typical compiler options
  "compilerOptions": {
    "target": "es2020",
    "moduleResolution": "node"
    // ...
  },

  // NEW: Options for file/directory watching
  "watchOptions": {
    // Use native file system events for files and directories
    "watchFile": "useFsEvents",
    "watchDirectory": "useFsEvents",

    // Poll files for updates more frequently
    // when they're updated a lot.
    "fallbackPolling": "dynamicPriority",

    // Don't coalesce watch notification
    "synchronousWatchDirectory": true,

    // Finally, two additional settings for reducing the amount of possible
    // files to track  work from these directories
    "excludeDirectories": ["**/node_modules", "_build"],
    "excludeFiles": ["build/fileWhichChangesOften.ts"]
  }
}

您可以在 发行说明 中阅读更多相关信息。

使用环境变量 TSC_WATCHFILE 配置文件监视

选项描述
PriorityPollingInterval使用 fs.watchFile 但对源文件、配置文件和缺失文件使用不同的轮询间隔
DynamicPriorityPolling使用动态队列,其中频繁修改的文件将以较短的间隔轮询,而未更改的文件将以较低的频率轮询
UseFsEvents使用 fs.watch,它使用文件系统事件(但在不同的操作系统上可能不准确)来获取文件更改/创建/删除的通知。请注意,很少有操作系统,例如 linux 对 watches 的数量有限制,使用 fs.watch 创建 watcher 失败将导致它使用 fs.watchFile 创建
UseFsEventsWithFallbackDynamicPolling此选项与 UseFsEvents 类似,除了无法使用 fs.watch 创建监视,回退监视通过动态轮询队列发生(如 DynamicPriorityPolling 中所述)
UseFsEventsOnParentDirectory此选项使用 fs.watch(使用文件系统事件)监视文件的父目录,因此 CPU 占用率低,但会影响准确性。
默认值(未指定值)如果环境变量 TSC_NONPOLLING_WATCHER 设置为 true,则监视文件的父目录(就像 UseFsEventsOnParentDirectory)。否则使用 fs.watchFile250ms 监视文件作为任何文件的超时

使用环境变量 TSC_WATCHDIRECTORY 配置目录监视

Fal2Zs2Zu8R02N4UUQtIlQcYzE+YdwDN2NOFBokcyBZUpxE3iwDEoxpbyab/qyxzwkhQu+QkfM1Gt4OuZeKFMEyA725yNm255dCz27d5dAcDwszpXV/H83tacPKut680vVmJNIKf/vvzluo4e2aNcKO1su84+jTID10NJ4MSz6/MVypg1tkWruTkgE/2LrvtRJ3JvDUMSAKpc0ZKqic+I/wbJvdnNIzhW4hEDywvOXyhAD/mmzrgzVn8PCysWKDmcQbF4HlXLCUARE9XJI7M5YIUj1S2VRubg1rAHcEetvZ546RoXksd9YBazlSt+C2dzHXNaEnA83EX1KwRHDpIW6jC9ts+gmHHrg2LDaJcH3x9vWgQMRKgdWB+BgPdGUZeIsMfuAEya0YOLZaHUpMMK6UrfKf6fSJU133rfyceLSw=

选项描述
RecursiveDirectoryUsingFsWatchFile使用 fs.watchFile 轮询监视目录和子目录(消耗 CPU 周期)
RecursiveDirectoryUsingDynamicPriorityPolling使用动态轮询队列轮询对目录和子目录的更改。
默认值(未指定值)使用 fs.watch 监视目录和子目录