diff --git a/src/hmr/hotModuleReplacement.js b/src/hmr/hotModuleReplacement.js index c5b1bbfd..dee34937 100644 --- a/src/hmr/hotModuleReplacement.js +++ b/src/hmr/hotModuleReplacement.js @@ -108,6 +108,7 @@ function updateCss(el, url) { newEl.isLoaded = false; newEl.addEventListener('load', () => { + if (newEl.isLoaded) return; newEl.isLoaded = true; el.parentNode.removeChild(el); }); diff --git a/test/HMR.test.js b/test/HMR.test.js index 6a2f0067..e049ae13 100644 --- a/test/HMR.test.js +++ b/test/HMR.test.js @@ -306,4 +306,31 @@ describe('HMR', () => { done(); }, 100); }); + + it('should not remove old link when new link is loaded twice', (done) => { + + const link = document.createElement('link'); + + link.innerHTML = ''; + document.head.appendChild(link); + document.head.removeChild = jest.fn(); + + const update = hotModuleReplacement('./dist/main.css', {}); + + update(); + + setTimeout(() => { + + const links = Array.prototype.slice.call( + document.querySelectorAll('link') + ); + + links[1].dispatchEvent(getLoadEvent()); + links[1].dispatchEvent(getLoadEvent()); + + expect(document.head.removeChild).toHaveBeenCalledTimes(1); + + done(); + }, 100); + }); });