建议
🔍 搜索词
idle watch watcher cpu chokidar
✅ 可实现性检查清单
我的建议满足以下准则:
- 这不会对现有的TypeScript/JavaScript代码造成破坏性的改变
- 这不会改变现有JavaScript代码的运行时行为
- 这可以在不根据表达式的类型发出不同的JS的情况下实现
- 这不是一个运行时特性(例如库功能、非ECMAScript语法与JavaScript输出、新的JS语法糖等)
- 这个特性将与 TypeScript's Design Goals 的其他部分保持一致。
- 实际上会进一步推进目标10,跨平台开发*
⭐ 建议
请添加以下一项或多项:
- 将chokidar作为
tsconfig::watchOptions.watchFile
和tsconfig::watchOptions.watchDirectory
的新选项 - 将chokidar作为
env::TSC_WATCHFILE
和env::TSC_WATCHDIRECTORY
的新选项 - 将chokidar设置为默认的观察者——也许取决于项目中是否可用chokidar
💻 用例
在使用create-react-app
时,我注意到我的机器往往会变得相当响亮。调查后,我发现原因出奇的高CPU利用率。这反过来,我可以追溯到这个问题:
TypeStrong/fork-ts-checker-webpack-plugin#236
那里的解决方案是将TSC切换到fs.watch
而不是fs.watchFile
。这在很大程度上有效。然而,正如@sheetalkamat在#31048(评论)中指出的那样,这种实现方法已知存在问题。这就是为什么它不是默认选项,而且在可预见的未来不会成为默认选项。
之前的讨论
#31048 讨论了这个请求的背景。在那里,@nicoburns已经提出了这个问题:
你是否考虑过切换到Chokidar?它是在Node生态系统中广泛使用的经过实战考验的解决方案。我们在工作中正在转向TypeScript,而我的2015 MacBook Pro上的watch进程每个占用约45%的CPU。据我所知,Node的内置文件监视功能通常被认为是有问题的,不适合生产使用。
作为回应,@jasonwilliams指出webpack已经切换回了fs.watch
,这可能表明它现在已经修复了。不幸的是,node v16仍然有相同的警告,而webpack的切换似乎没有我们希望进行的那么彻底: webpack/watchpack#130
#19762 和 #17506 也显示了性能问题。 #19762 实际上与 TypeStrong/fork-ts-checker-webpack-plugin#236 具有相同的分辨率,而 #17506 似乎引发了一些密集工作。
6条答案
按热度按时间iqxoj9l91#
半相关:VSCode刚刚切换了他们的观察者到
@parcel/watcher
:请查看在microsoft/vscode#132483和microsoft/vscode@85c5eb7上的讨论。czfnxgou2#
Fyi,现在VSCode中有一个扩展API可以用于监视文件和文件夹,您无需自己编写监视器解决方案。
vom3gejh3#
我们仍然有CLI监视模式和服务器本身(它在不在VS Code的地方运行),所以我们仍然需要有一些实现。
qlzsbp2j4#
明白了,那么我可以推荐 https://github.com/parcel-bundler/watcher 。在考虑时需要注意一个陷阱:
chokidar
支持排除的通配符模式,而parcel
不支持。这在 Linux 上非常重要,因为操作系统没有提供高效的递归监视支持,并且文件句柄有限。报告为 parcel-bundler/watcher#64e7arh2l65#
在TS中还有其他一些需要考虑的事情,目前TS是依赖无关的,我们为不同的场景使用多种类型的观察者(轮询与否),但parcel的观察者在我自己的测试中,从我当时正在为pyright工作时,无疑是比其他选择更好的,但代价是需要一个已编译的组件。
gpnt7bae6#
鉴于包裹快照支持,我们在其上构建了一个轮询观察者,尽管这并不是从readme中真正宣传的(实现在这里)。
成为无依赖的目标是一个非常好的目标,尽管parcel本身也带有很多依赖项。理想情况下,我们可以将类似parcel的东西推送到node.js核心并完成它。