配置监视
编译器支持配置如何使用 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 | 使用动态队列,其中频繁修改的文件将以较短的间隔轮询,而未更改的文件将以较低的频率轮询 |
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.watchFile 和 250ms 监视文件作为任何文件的超时 |
使用环境变量 TSC_WATCHDIRECTORY 配置目录监视
Fal2Zs2Zu8R02N4UUQtIlQcYzE+YdwDN2NOFBokcyBZUpxE3iwDEoxpbyab/qyxzwkhQu+QkfM1Gt4OuZeKFMEyA725yNm255dCz27d5dAcDwszpXV/H83tacPKut680vVmJNIKf/vvzluo4e2aNcKO1su84+jTID10NJ4MSz6/MVypg1tkWruTkgE/2LrvtRJ3JvDUMSAKpc0ZKqic+I/wbJvdnNIzhW4hEDywvOXyhAD/mmzrgzVn8PCysWKDmcQbF4HlXLCUARE9XJI7M5YIUj1S2VRubg1rAHcEetvZ546RoXksd9YBazlSt+C2dzHXNaEnA83EX1KwRHDpIW6jC9ts+gmHHrg2LDaJcH3x9vWgQMRKgdWB+BgPdGUZeIsMfuAEya0YOLZaHUpMMK6UrfKf6fSJU133rfyceLSw=
选项 | 描述 |
---|---|
RecursiveDirectoryUsingFsWatchFile | 使用 fs.watchFile 轮询监视目录和子目录(消耗 CPU 周期) |
RecursiveDirectoryUsingDynamicPriorityPolling | 使用动态轮询队列轮询对目录和子目录的更改。 |
默认值(未指定值) | 使用 fs.watch 监视目录和子目录 |