Repository: TypeScript
Issue: Enable chokidar-based watch
Labels: Suggestion,Awaiting More Feedback

# Suggestion

<!--
  Please fill in each section completely. Thank you!
-->

## 🔍 Search Terms

<!--
  💡 Did you know? TypeScript has over 2,000 open suggestions!
  🔎 Please search thoroughly before logging new feature requests as most common ideas already have a proposal in progress.
  The "Common Feature Requests" section of the FAQ lists many popular requests: https://github.com/Microsoft/TypeScript/wiki/FAQ#common-feature-requests

  Replace the text below:
-->

idle watch watcher cpu chokidar

## ✅ Viability Checklist

<!--
   Suggestions that don't meet all these criteria are very, very unlikely to be accepted.
   We always recommend reviewing the TypeScript design goals before investing time writing
   a proposal for ideas outside the scope of the project.
-->
My suggestion meets these guidelines:

* [x] This wouldn't be a breaking change in existing TypeScript/JavaScript code
* [x] This wouldn't change the runtime behavior of existing JavaScript code
* [x] This could be implemented without emitting different JS based on the types of the expressions
* [x] This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
* [x] This feature would agree with the rest of [TypeScript's Design Goals](https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals). 
  *Would actually further goal 10, cross-platform development*


## ⭐ Suggestion

<!-- A summary of what you'd like to see added or changed -->

Please add one or more of these:
* chokidar as a new option for `tsconfig::watchOptions.watchFile` and `tsconfig::watchOptions.watchDirectory`
* chokidar as a new option for `env::TSC_WATCHFILE` and `env::TSC_WATCHDIRECTORY`
* chokidar as default watcher – maybe dependent on whether chokidar is available in the project


<!--
## 📃 Motivating Example

<!--
  If you were announcing this feature in a blog post, what's a short explanation that shows
  a developer why this feature improves the language?
-->

## 💻 Use Cases

<!--
  What do you want to use this for?
  What shortcomings exist with current approaches?
  What workarounds are you using in the meantime?
-->

While working with `create-react-app`, I noticed that my machine tended to get quite loud. Investigating that, I found the reason to be surprisingly large CPU utilization. That, in turn, I could trace back to this issue:
https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues/236

The solution there was to switch TSC to `fs.watch` instead of `fs.watchFile`. That works for the most part. However, as @sheetalkamat points out in https://github.com/microsoft/TypeScript/issues/31048#issuecomment-495659901, that implementation is known to be problematic. Which is why it is not the default and won't be in the foreseeable future.


## Prior discussions
https://github.com/microsoft/TypeScript/issues/31048 talks about the background to this request. There, @nicoburns already asked about this:
> Would you consider switching to Chokidar? It's a battle tested solution used very widely throughout the Node ecosystem. We're in the process of switching to TypeScript at work, and the watch processes are taking ~45% cpu each on my 2015 MacBook Pro. As far as I am aware Node's built-in file watching capabilities are generally considered broken and not suitable for production use.

In response, @jasonwilliams pointed out that webpack had switched back to `fs.watch`, which might indicate that it had been fixed by now. Unfortunately, node v16 still has the same warnings, and webpack's switch seems to have been less thoroughly investigated than we would have desired: https://github.com/webpack/watchpack/issues/130

https://github.com/microsoft/TypeScript/issues/19762 and https://github.com/microsoft/TypeScript/issues/17506 also showed performance issues. https://github.com/microsoft/TypeScript/issues/19762 actually has the same resolution as https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues/236, and https://github.com/microsoft/TypeScript/issues/17506 seems to have prompted some intensive work.