vuejs / apollo

🚀 Apollo/GraphQL integration for VueJS
http://apollo.vuejs.org
MIT License
6.03k stars 523 forks source link

fix: (@vue/apollo-option) memory leak in wrapped ssrRender #1553

Closed deleteme closed 3 months ago

deleteme commented 6 months ago

Fixes https://github.com/vuejs/apollo/issues/1550

Two leaks were fixed:

1) Prevents repeatedly wrapping ssrRender by checking if it's already been wrapped. Added a __IS_VUE_APOLLO_WRAPPED boolean to track this. I verified that this was actually happening by throwing an error if it was already wrapped, and I observed the error.

2) this.$options.ssrRender doesn't always exist, but this.$apollo does. When the new wrapped ssrRender was called, it would throw, which prevented the destroy.call(this) line from running. The fix here was to not create a wrapped ssrRender if there isn't an original one.


❓ I don't know why a cleanup function like destroy is called inside of a render function. Usually I'd expect to see that happen from a conventional lifecycle hook, like unmounted. Maybe this wrapped ssrRender should not happen at all?