# 配置监视
编译器支持配置如何使用 TypeScript 3.8+ 中的编译器标志以及之前的环境变量来监视文件和目录。
# 背景
编译器的 --watch
实现依赖于使用 node 提供的 fs.watch
和 fs.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 监视目录和子目录 |
← 与构建工具集成