microsoft / microsoft/TypeScript

TypeScript slow project load times for large projects on MacOS

Open
#60,832 7 comments 13 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Needs Investigation
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

Does this issue occur when all extensions are disabled?: Yes

  • 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
  "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.
  1. 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)
  1. 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)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by comparing the macOS legacy file-watching behavior with the reused VS Code watcher and the Linux remote logs, using the reproduction settings and tsserver output in the report. Trace the referenced VS Code configuration entry point and measure project loading for the 25k-file project; done means eliminating the repeated sourceFileChange activity and substantially reducing the macOS load time.

Written by the indexing model from the issue text.

Assessment

Tech stack
macos, node.js, typescript, vscode
Domain
developer-experience, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.