Clear dangling EventListeners and Detached Nodes when a controller is removed from the DOM #1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
eventListenerMaps
maps HTML elements handled by Stimulus toeventListenerMap
, a map of Stimulus EventListeners in this way:{ HTMLelement: { eventName: EventListener } }
. When a controller HTML is removed from the DOM the dangling EventListeners aren't removed, moreover, the removed HTML elements are still referenced via theeventListenerMaps
keys. This leads to having multiple detached HTMLelements and eventListeners which can't be GCed hence a memory leak. The leak is fixed by removing the dangling eventListeners and clearing unusedeventListenerMaps
keys. When the HTMLelement is attached again to the DOM, theeventListenerMaps
and the relatedeventListeners
are automatically re-created by Stimulus via the MutationObservers, no data is lost by doing this.Below is an example to reproduce the issue:
heap snapshot before:
heap snapshot after:
Related hotwired#489 hotwired#547