Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tsc --watch emits all files even when they have not changed #29927

Closed
gilbert opened this issue Feb 15, 2019 · 6 comments
Closed

tsc --watch emits all files even when they have not changed #29927

gilbert opened this issue Feb 15, 2019 · 6 comments
Assignees
Labels
Fixed A PR has been merged for this issue In Discussion Not yet reached consensus Suggestion An idea for TypeScript

Comments

@gilbert
Copy link

gilbert commented Feb 15, 2019

A regression of #3113 / #6937

TypeScript Version: 3.4.0-dev.20190215

Search Terms: tsc --watch writing to disk too often

TypeScript is writing all files to disk regardless if the contents of those files have changed or not. This is fine on startup, but when using --watch it still behaves this way even when only one file changes. This causes two problems:

  • It's very slow when working with a large number of files
  • It triggers too many file change updates for tools like nodemon

To Reproduce:

First create some files:

$ tsc --version
Version 3.3.1
$ tsc --init
$ echo '//a' > example.ts
$ echo 'require("http").createServer(()=>{}).listen(5050)' > server.js
$ tsc --watch

Then run nodemon server.js, then re-save example.ts with no changes.

Expected behavior:

Only files that have changed should write to disk.

Actual behavior:

All files write to disk.

Related Issues: Seems to be a regression of #3113 / #6937

@gilbert
Copy link
Author

gilbert commented Feb 15, 2019

My apologies, it seems this only happens when you save a .js file with compilerOptions: { allowJs: true }. Saving a .ts file seems to work as expected.

Can you confirm this is the expected behavior when working with.js files? Thank you.

@sheetalkamat
Copy link
Member

sheetalkamat commented Feb 15, 2019

This seems to be result of fact that there is no .d.ts file generated for js files and resulting in we determining we cant figure out if change is local or global and hence resulting in emitting all files.
@RyanCavanaugh @DanielRosenwasser @weswigham this depends on .d.ts for .js files

@RyanCavanaugh RyanCavanaugh added Suggestion An idea for TypeScript In Discussion Not yet reached consensus labels Feb 19, 2019
@ravenscar
Copy link

Seeing a similar regression here when doing a composite build. I don't have the allowJs flag as it's not allowed in a composite build but I do have the following flags: composite, declaration, sourceMap.

When we change a single tsx file, everything is re-emitted into the outDir and this really makes webpack run slowly.

Not sure if this is related of if I should raise a separate issue.

@sheetalkamat
Copy link
Member

@ravenscar please file separate issue with more details on how to repro this for us to be able to investigate this. Since your project doesn't use allowJs this isn't same issue.

@orekav
Copy link

orekav commented Mar 27, 2019

If you check this project https://github.com/Microsoft/TypeScript-Node-Starter.git
Do a few changes package.json ( where it uses nodemon.... put nodemon --verbose)

Then "npm run debug"

You will see that "tsc -w" and "nodemon" are interacting and looping
They run at the same time and nodemon will restart for each *.ts file that src has

I am having this issue and it is very painful because my app has 74 TS files, so when I do "npm run debug" it restarts 74 times!

This is the logging:

concurrently -k -p "[{name}]" -n "Sass,TypeScript,Node" -c "yellow.bold,cyan.bold,green.bold" "npm run watch-sass" "npm run watch-ts" "npm run serve-debug"

[TypeScript]
[TypeScript] > express-typescript-starter@0.1.0 watch-ts D:\testNode
[TypeScript] > tsc -w
[TypeScript]
[Sass]
[Sass] > express-typescript-starter@0.1.0 watch-sass D:\testNode
[Sass] > node-sass -w src/public/css/main.scss dist/public/css/main.css
[Sass]
[Node]
[Node] > express-typescript-starter@0.1.0 serve-debug D:\testNode
[Node] > nodemon -V --inspect dist/server.js
[Node]
[TypeScript]
12:34:15 AM - Starting compilation in watch mode...
[TypeScript]
[TypeScript]
[Node] [nodemon] 1.18.10
[Node] [nodemon] to restart at any time, enter rs
[Node] [nodemon] or send SIGHUP to 9672 to restart
[Node] [nodemon] watching: .
[Node] [nodemon] watching extensions: js,mjs,json
[Node] [nodemon] starting node --inspect dist/server.js
[Node] [nodemon] spawning
[Node] [nodemon] child pid: 21608
[Node] Debugger listening on ws://127.0.0.1:9229/db74b13f-09b5-445d-a34c-b2acdc1df6c0
[Node] For help, see: https://nodejs.org/en/docs/inspector
[Node] [nodemon] watching 210 files
[Node] debug: Logging initialized at debug level
[Node] debug: Using .env.example file to supply config environment variables
[Node] App is running at http://localhost:3000 in development mode
[Node] Press CTRL-C to stop
[Node]
[Node] [nodemon] files triggering change check: dist\util\secrets.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\util\secrets.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\util\secrets.js
[Node]
[Node] [nodemon] files triggering change check: dist\util\logger.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\util\logger.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\util\logger.js
[Node]
[Node] [nodemon] starting node --inspect dist/server.js
[Node] [nodemon] spawning
[Node] [nodemon] child pid: 25424
[Node] [nodemon] files triggering change check: debug.log
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] Debugger listening on ws://127.0.0.1:9229/af469368-d093-4f6d-92c6-18c0302e522b
[Node] For help, see: https://nodejs.org/en/docs/inspector
[Node] [nodemon] files triggering change check: dist\controllers\home.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\controllers\home.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\controllers\home.js
[Node]
[Node] [nodemon] files triggering change check: dist\models\User.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\models\User.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\models\User.js
[Node]
[Node] [nodemon] starting node --inspect dist/server.js
[Node] [nodemon] spawning
[Node] [nodemon] child pid: 17648
[Node] Debugger listening on ws://127.0.0.1:9229/83f0897f-6fbb-4283-b3e5-5e81b87db5c2
[Node] For help, see: https://nodejs.org/en/docs/inspector
[Node] [nodemon] files triggering change check: dist\config\passport.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\config\passport.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\config\passport.js
[Node]
[Node] [nodemon] files triggering change check: dist\controllers\user.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\controllers\user.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\controllers\user.js
[Node]
[Node] [nodemon] files triggering change check: dist\controllers\api.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\controllers\api.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\controllers\api.js
[Node]
[Node] [nodemon] files triggering change check: dist\controllers\contact.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\controllers\contact.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\controllers\contact.js
[Node]
[Node] [nodemon] starting node --inspect dist/server.js
[Node] [nodemon] spawning
[Node] [nodemon] child pid: 21532
[Node] [nodemon] files triggering change check: dist\app.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\app.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\app.js
[Node]
[Node] [nodemon] files triggering change check: dist\server.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\server.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\server.js
[Node]
[Node] Debugger listening on ws://127.0.0.1:9229/1bd5737c-4dd9-4012-9560-f071e3ad72eb
[Node] For help, see: https://nodejs.org/en/docs/inspector
[Node] [nodemon] files triggering change check: dist\public\js\main.js.map
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/0
[Node] [nodemon] files triggering change check: dist\public\js\main.js
[Node] [nodemon] matched rule: **.
[Node] [nodemon] changes after filters (before/after): 1/1
[Node] [nodemon] restarting due to changes...
[Node] [nodemon] dist\public\js\main.js
[Node]
[Node] [nodemon] starting node --inspect dist/server.js
[Node] [nodemon] spawning
[Node] [nodemon] child pid: 26052
[Node] Debugger listening on ws://127.0.0.1:9229/61baa0a7-14f8-43e1-8d06-4fcb5b51dcca
[Node] For help, see: https://nodejs.org/en/docs/inspector
[TypeScript] 12:34:19 AM - Compilation complete. Watching for file changes.
[TypeScript]
[TypeScript]
[Node] debug: Logging initialized at debug level
[Node] debug: Using .env.example file to supply config environment variables
[Node] App is running at http://localhost:3000 in development mode
[Node] Press CTRL-C to stop

@sheetalkamat
Copy link
Member

This should be fixed by #32372
@orekav I dont know enough about your code to verify that this works. If it doesn't please submit simple steps to repro using tsc and file edits to do for easier investigation

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Fixed A PR has been merged for this issue In Discussion Not yet reached consensus Suggestion An idea for TypeScript
Projects
None yet
Development

No branches or pull requests

5 participants