The component is rendered twice because CRA sets React's strict mode by default, which among other things tries to help you detect side effects (emphasis mine):
Strict mode can’t automatically detect side effects for you, but it
can help you spot them by making them a little more deterministic.
This is done by intentionally double-invoking the following functions:
- Class component
constructor, render, and shouldComponentUpdate methods
- Class component static
getDerivedStateFromProps method
- Function component bodies
- State updater functions (the first argument to
setState)
- Functions passed to
useState, useMemo, or useReducer
So far, this is covered by posts like:
However, you might then expect both "render" and "time is up" to be logged twice. The reason that doesn't happen, which as far as I can find hasn't been covered yet on SO, is that React was updated to deliberately suppress the duplicate logs:
This disables console.log by temporarily patching the global console
object during the second render pass when we double render in strict
mode in DEV.
This applies only to console.logs directly in the functions mentioned above, which doesn't include setTimeout callbacks, so the second console.log("render") is swallowed but the second console.log("time is up") is not.
timers? Is that just an import for the globalsetTimeout, or something else?renderandtime is uptwice, could not reproduce.