Repository: TypeScript
Issue: TypeScript slow project load times for large projects on MacOS
Labels: Needs Investigation

<!-- ⚠️⚠️ Do Not Delete This! bug_report_template ⚠️⚠️ -->
<!-- Please read our Rules of Conduct: https://opensource.microsoft.com/codeofconduct/ -->
<!-- 🕮 Read our guide about submitting issues: https://github.com/microsoft/vscode/wiki/Submitting-Bugs-and-Suggestions -->
<!-- 🔎 Search existing issues to avoid creating duplicates. -->
<!-- 🧪 Test using the latest Insiders build to see if your issue has already been fixed: https://code.visualstudio.com/insiders/ -->
<!-- 💡 Instead of creating your report here, use 'Report Issue' from the 'Help' menu in VS Code to pre-fill useful information. -->
<!-- 🔧 Launch with `code --disable-extensions` to check. -->
Does this issue occur when all extensions are disabled?: Yes

<!-- 🪓 If you answered No above, use 'Help: Start Extension Bisect' from Command Palette to try to identify the cause. -->
<!-- 📣 Issues caused by an extension need to be reported directly to the extension publisher. The 'Help > Report Issue' dialog can assist with this. -->
- VS Code Version: v1.96.2
- OS Version: MacOS
- TypeScript: v5.7.2 (workspace version)
- Node.JS: v20.18.0

Steps to Reproduce:

1. Add the following to `.vscode/settings.json`

```jsonc
  "typescript.tsserver.log": "verbose",
  "files.watcherExclude": {
    "**/node_modules": true
  },
```

This causes:

```
2024-12-20 13:49:42.785 [info] <syntax> Falling back to legacy node.js based file watching because of user settings.
``` 

2. Open a TS source file belonging to a large TS project with many project references in VSCode running on MacOS. For example, our project references a total of 25k+ files (transitively through project references):

```
Info 57414[13:12:03.001] Project '.../web/src/pages/editor/tsconfig.json' (Configured)
Info 57414[13:12:03.001] 	Files (26167)
```

3. Notice that the tsserver logs are littered with the following log lines:

```
Info 57094[13:34:37.437] DirectoryWatcher:: Triggered with .../web/src/pages/editor :: WatchInfo: .../web/src/pages/editor 1 {"watchFile":2,"watchDirectory":2,"excludeDirectories":["/Users/mjames/work/canva/web/**/node_modules",".../web/**/target",".../web/**/bazel-bin",".../web/**/bazel-out",".../web/**/bazel-canva"]} Config: /Users/mjames/work/<redacted>/tsconfig.json WatchType: Wild card directory
Info 57095[13:34:37.437] Invoking sourceFileChange on .../web/src/pages/editor/editor_bootstrap_proto.ts:: 1
Info 57096[13:34:37.438] Scheduled: .../web/src/pages/editor/tsconfig.json
Info 57097[13:34:37.438] Scheduled: *ensureProjectForOpenFiles*
Info 57098[13:34:37.438] Invoking sourceFileChange on .../web/src/pages/<redacted>:: 1
Info 57099[13:34:37.438] Scheduled: .../web/src/pages/editor/tsconfig.json, Cancelled earlier one
Info 57100[13:34:37.438] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one
Info 57101[13:34:37.438] Invoking sourceFileChange on .../web/src/pages/editor/<redacted>:: 1
Info 57102[13:34:37.438] Scheduled: .../web/src/pages/editor/tsconfig.json, Cancelled earlier one
Info 57103[13:34:37.438] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one
Info 57104[13:34:37.438] Invoking sourceFileChange on .../web/src/pages/editor/<redacted>:: 1
Info 57105[13:34:37.438] Scheduled: .../web/src/pages/editor/tsconfig.json, Cancelled earlier one
Info 57106[13:34:37.442] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one
Info 57107[13:34:37.442] Invoking sourceFileChange on .../web/src/pages/editor/<redacted>:: 1
Info 57108[13:34:37.442] Scheduled: .../web/src/pages/editor/tsconfig.json, Cancelled earlier one
Info 57109[13:34:37.442] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one
Info 57110[13:34:37.442] Invoking sourceFileChange on .../web/src/pages/editor/<redacted>:: 1
Info 57111[13:34:37.443] Scheduled: .../web/src/pages/editor/tsconfig.json, Cancelled earlier one
Info 57112[13:34:37.443] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one
Info 57113[13:34:37.443] Invoking sourceFileChange on .../web/src/pages/editor/editing/<redacted>:: 1
Info 57114[13:34:37.443] Scheduled: .../web/src/pages/editor/tsconfig.json, Cancelled earlier one
Info 57115[13:34:37.443] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one
Info 57116[13:34:37.443] Invoking sourceFileChange on .../web/src/pages/editor/<redacted>:: 1
Info 57117[13:34:37.443] Scheduled: .../web/src/pages/editor/tsconfig.json, Cancelled earlier one
Info 57118[13:34:37.443] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one
Info 57119[13:34:37.443] Invoking sourceFileChange on .../web/src/pages/editor/<redacted>:: 1
Info 57120[13:34:37.443] Scheduled: .../web/src/pages/editor/tsconfig.json, Cancelled earlier one
Info 57121[13:34:37.443] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one
Info 57122[13:34:37.443] Invoking sourceFileChange on .../web/src/pages/editor/<redacted>:: 1
Info 57123[13:34:37.443] Scheduled: .../web/src/pages/editor/tsconfig.json, Cancelled earlier
...
``` 

The strange thing is that this is NOT a problem with `.vscode-server` running on Linux.

None of the 20k+ `Invoking sourceFileChange on...` log lines appear in the tsserver logs when running in our Linux based remote dev envs and **the load time for this project is ~52s vs 3m45s!**

Interestingly the problem also does NOT occur on MacOS when tsserver reuses VSCode's file watcher (i.e. [the `node_modules` excludes aren't in the `files.watcherExclude` hash](https://github.com/microsoft/vscode/blob/acd32b17b837b05a64275c297949753df46dbe6d/extensions/typescript-language-features/src/configuration/configuration.ts#L230-L238))