Skip to content

Commit 05e2951

Browse files
fix: hmr runtime on preloaded stylesheet link (#686)
1 parent a451223 commit 05e2951

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed

src/hmr/hotModuleReplacement.js

+8
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,19 @@ function updateCss(el, url) {
108108
newEl.isLoaded = false;
109109

110110
newEl.addEventListener('load', () => {
111+
if (newEl.isLoaded) {
112+
return;
113+
}
114+
111115
newEl.isLoaded = true;
112116
el.parentNode.removeChild(el);
113117
});
114118

115119
newEl.addEventListener('error', () => {
120+
if (newEl.isLoaded) {
121+
return;
122+
}
123+
116124
newEl.isLoaded = true;
117125
el.parentNode.removeChild(el);
118126
});

test/HMR.test.js

+25
Original file line numberDiff line numberDiff line change
@@ -306,4 +306,29 @@ describe('HMR', () => {
306306
done();
307307
}, 100);
308308
});
309+
310+
it('should not remove old link when new link is loaded twice', (done) => {
311+
const link = document.createElement('link');
312+
313+
link.innerHTML = '<link rel="preload stylesheet" href="./dist/main.css" />';
314+
document.head.appendChild(link);
315+
document.head.removeChild = jest.fn();
316+
317+
const update = hotModuleReplacement('./dist/main.css', {});
318+
319+
update();
320+
321+
setTimeout(() => {
322+
const links = Array.prototype.slice.call(
323+
document.querySelectorAll('link')
324+
);
325+
326+
links[1].dispatchEvent(getLoadEvent());
327+
links[1].dispatchEvent(getLoadEvent());
328+
329+
expect(document.head.removeChild).toHaveBeenCalledTimes(1);
330+
331+
done();
332+
}, 100);
333+
});
309334
});

test/cases/hmr/expected/webpack-4/main.js

+8
Original file line numberDiff line numberDiff line change
@@ -987,11 +987,19 @@ function updateCss(el, url) {
987987
newEl.isLoaded = false;
988988

989989
newEl.addEventListener('load', () => {
990+
if (newEl.isLoaded) {
991+
return;
992+
}
993+
990994
newEl.isLoaded = true;
991995
el.parentNode.removeChild(el);
992996
});
993997

994998
newEl.addEventListener('error', () => {
999+
if (newEl.isLoaded) {
1000+
return;
1001+
}
1002+
9951003
newEl.isLoaded = true;
9961004
el.parentNode.removeChild(el);
9971005
});

test/cases/hmr/expected/webpack-5/main.js

+8
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,19 @@ function updateCss(el, url) {
129129
newEl.isLoaded = false;
130130

131131
newEl.addEventListener('load', () => {
132+
if (newEl.isLoaded) {
133+
return;
134+
}
135+
132136
newEl.isLoaded = true;
133137
el.parentNode.removeChild(el);
134138
});
135139

136140
newEl.addEventListener('error', () => {
141+
if (newEl.isLoaded) {
142+
return;
143+
}
144+
137145
newEl.isLoaded = true;
138146
el.parentNode.removeChild(el);
139147
});

0 commit comments

Comments
 (0)