# 配置监视

编译器支持配置如何使用 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
默认值(未指定值) 如果环境变量 TSC_NONPOLLING_WATCHER 设置为 true,则监视文件的父目录(就像 UseFsEventsOnParentDirectory)。 否则使用 fs.watchFile 和 250ms 监视文件作为任何文件的超时

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

通过使用 TSC_WATCHDIRECTORY选择的不同选项为子目录递归创建目录观察器来支持在 node 中本地不支持递归目录观察的平台上的目录观察。请注意,在支持本机递归目录监视的平台(例如 windows)上,此环境变量的值将被忽略。

选项 说明
RecursiveDirectoryUsingFsWatchFile 使用 fs.watchFile 监视目录和子目录这是一个轮询监视(消耗 CPU 周期) RecursiveDirectoryUsingDynamicPriorityPolling
默认(未指定值) 使用 fs.watch监视目录和子目录
Last Updated: 5/25/2023, 2:35:11 PM