From 78f3c553c179282aa1ef60d253cb2266e7584529 Mon Sep 17 00:00:00 2001 From: dgeibi Date: Mon, 26 Oct 2020 20:23:53 +0800 Subject: [PATCH 1/3] fix: onerror mem leak --- src/CssLoadingRuntimeModule.js | 8 +++++++- src/index.js | 8 +++++++- test/cases/hmr/expected/webpack-5/main.js | 6 +++++- test/cases/insert-function/expected/webpack-4/main.js | 6 +++++- test/cases/insert-function/expected/webpack-5/main.js | 6 +++++- test/cases/insert-string/expected/webpack-4/main.js | 6 +++++- test/cases/insert-string/expected/webpack-5/main.js | 6 +++++- test/cases/insert-undefined/expected/webpack-4/main.js | 6 +++++- test/cases/insert-undefined/expected/webpack-5/main.js | 6 +++++- 9 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/CssLoadingRuntimeModule.js b/src/CssLoadingRuntimeModule.js index be0ff24e..d6bf7e04 100644 --- a/src/CssLoadingRuntimeModule.js +++ b/src/CssLoadingRuntimeModule.js @@ -60,9 +60,15 @@ module.exports = class CssLoadingRuntimeModule extends RuntimeModule { this.runtimeOptions.linkType ? `linkTag.type = ${JSON.stringify(this.runtimeOptions.linkType)};` : '', - 'linkTag.onload = resolve;', + 'linkTag.onload = function() {', + Template.indent([ + 'linkTag.onerror = linkTag.onload = null;', + 'resolve();', + ]), + '};', 'linkTag.onerror = function(event) {', Template.indent([ + 'linkTag.onerror = linkTag.onload = null;', 'var request = event && event.target && event.target.href || fullhref;', 'var err = new Error("Loading CSS chunk " + chunkId + " failed.\\n(" + request + ")");', 'err.code = "CSS_CHUNK_LOAD_FAILED";', diff --git a/src/index.js b/src/index.js index b4a975c3..53773df1 100644 --- a/src/index.js +++ b/src/index.js @@ -405,9 +405,15 @@ class MiniCssExtractPlugin { this.runtimeOptions.linkType )};` : '', - 'linkTag.onload = resolve;', + 'linkTag.onload = function() {', + Template.indent([ + 'linkTag.onerror = linkTag.onload = null;', + 'resolve();', + ]), + '};', 'linkTag.onerror = function(event) {', Template.indent([ + 'linkTag.onerror = linkTag.onload = null;', 'var request = event && event.target && event.target.href || fullhref;', 'var err = new Error("Loading CSS chunk " + chunkId + " failed.\\n(" + request + ")");', 'err.code = "CSS_CHUNK_LOAD_FAILED";', diff --git a/test/cases/hmr/expected/webpack-5/main.js b/test/cases/hmr/expected/webpack-5/main.js index fea4f8c6..89a5c4e3 100644 --- a/test/cases/hmr/expected/webpack-5/main.js +++ b/test/cases/hmr/expected/webpack-5/main.js @@ -827,8 +827,12 @@ module.exports = function (urlString) { /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = resolve; +/******/ linkTag.onload = function() { +/******/ linkTag.onerror = linkTag.onload = null; +/******/ resolve(); +/******/ }; /******/ linkTag.onerror = function(event) { +/******/ linkTag.onerror = linkTag.onload = null; /******/ var request = event && event.target && event.target.href || fullhref; /******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); /******/ err.code = "CSS_CHUNK_LOAD_FAILED"; diff --git a/test/cases/insert-function/expected/webpack-4/main.js b/test/cases/insert-function/expected/webpack-4/main.js index a23de8ce..2fccb65e 100644 --- a/test/cases/insert-function/expected/webpack-4/main.js +++ b/test/cases/insert-function/expected/webpack-4/main.js @@ -104,8 +104,12 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = resolve; +/******/ linkTag.onload = function() { +/******/ linkTag.onerror = linkTag.onload = null; +/******/ resolve(); +/******/ }; /******/ linkTag.onerror = function(event) { +/******/ linkTag.onerror = linkTag.onload = null; /******/ var request = event && event.target && event.target.href || fullhref; /******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); /******/ err.code = "CSS_CHUNK_LOAD_FAILED"; diff --git a/test/cases/insert-function/expected/webpack-5/main.js b/test/cases/insert-function/expected/webpack-5/main.js index 12c5aded..8e0df256 100644 --- a/test/cases/insert-function/expected/webpack-5/main.js +++ b/test/cases/insert-function/expected/webpack-5/main.js @@ -162,8 +162,12 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = resolve; +/******/ linkTag.onload = function() { +/******/ linkTag.onerror = linkTag.onload = null; +/******/ resolve(); +/******/ }; /******/ linkTag.onerror = function(event) { +/******/ linkTag.onerror = linkTag.onload = null; /******/ var request = event && event.target && event.target.href || fullhref; /******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); /******/ err.code = "CSS_CHUNK_LOAD_FAILED"; diff --git a/test/cases/insert-string/expected/webpack-4/main.js b/test/cases/insert-string/expected/webpack-4/main.js index 3da28c65..05ab1955 100644 --- a/test/cases/insert-string/expected/webpack-4/main.js +++ b/test/cases/insert-string/expected/webpack-4/main.js @@ -104,8 +104,12 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = resolve; +/******/ linkTag.onload = function() { +/******/ linkTag.onerror = linkTag.onload = null; +/******/ resolve(); +/******/ }; /******/ linkTag.onerror = function(event) { +/******/ linkTag.onerror = linkTag.onload = null; /******/ var request = event && event.target && event.target.href || fullhref; /******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); /******/ err.code = "CSS_CHUNK_LOAD_FAILED"; diff --git a/test/cases/insert-string/expected/webpack-5/main.js b/test/cases/insert-string/expected/webpack-5/main.js index 54d848cc..7a964b31 100644 --- a/test/cases/insert-string/expected/webpack-5/main.js +++ b/test/cases/insert-string/expected/webpack-5/main.js @@ -162,8 +162,12 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = resolve; +/******/ linkTag.onload = function() { +/******/ linkTag.onerror = linkTag.onload = null; +/******/ resolve(); +/******/ }; /******/ linkTag.onerror = function(event) { +/******/ linkTag.onerror = linkTag.onload = null; /******/ var request = event && event.target && event.target.href || fullhref; /******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); /******/ err.code = "CSS_CHUNK_LOAD_FAILED"; diff --git a/test/cases/insert-undefined/expected/webpack-4/main.js b/test/cases/insert-undefined/expected/webpack-4/main.js index 4f296ab3..fd271bc0 100644 --- a/test/cases/insert-undefined/expected/webpack-4/main.js +++ b/test/cases/insert-undefined/expected/webpack-4/main.js @@ -104,8 +104,12 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = resolve; +/******/ linkTag.onload = function() { +/******/ linkTag.onerror = linkTag.onload = null; +/******/ resolve(); +/******/ }; /******/ linkTag.onerror = function(event) { +/******/ linkTag.onerror = linkTag.onload = null; /******/ var request = event && event.target && event.target.href || fullhref; /******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); /******/ err.code = "CSS_CHUNK_LOAD_FAILED"; diff --git a/test/cases/insert-undefined/expected/webpack-5/main.js b/test/cases/insert-undefined/expected/webpack-5/main.js index d105a4b9..1078a665 100644 --- a/test/cases/insert-undefined/expected/webpack-5/main.js +++ b/test/cases/insert-undefined/expected/webpack-5/main.js @@ -162,8 +162,12 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = resolve; +/******/ linkTag.onload = function() { +/******/ linkTag.onerror = linkTag.onload = null; +/******/ resolve(); +/******/ }; /******/ linkTag.onerror = function(event) { +/******/ linkTag.onerror = linkTag.onload = null; /******/ var request = event && event.target && event.target.href || fullhref; /******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); /******/ err.code = "CSS_CHUNK_LOAD_FAILED"; From 1cce677a30448d20ef4a4626668908599a373554 Mon Sep 17 00:00:00 2001 From: dgeibi Date: Mon, 26 Oct 2020 23:35:06 +0800 Subject: [PATCH 2/3] fix: onerror mem leak --- src/CssLoadingRuntimeModule.js | 28 +++++++++-------- src/index.js | 30 ++++++++++--------- test/cases/hmr/expected/webpack-5/main.js | 24 ++++++++------- .../expected/webpack-4/main.js | 26 ++++++++-------- .../expected/webpack-5/main.js | 24 ++++++++------- .../insert-string/expected/webpack-4/main.js | 26 ++++++++-------- .../insert-string/expected/webpack-5/main.js | 24 ++++++++------- .../expected/webpack-4/main.js | 26 ++++++++-------- .../expected/webpack-5/main.js | 24 ++++++++------- 9 files changed, 125 insertions(+), 107 deletions(-) diff --git a/src/CssLoadingRuntimeModule.js b/src/CssLoadingRuntimeModule.js index d6bf7e04..ad8fe113 100644 --- a/src/CssLoadingRuntimeModule.js +++ b/src/CssLoadingRuntimeModule.js @@ -60,23 +60,25 @@ module.exports = class CssLoadingRuntimeModule extends RuntimeModule { this.runtimeOptions.linkType ? `linkTag.type = ${JSON.stringify(this.runtimeOptions.linkType)};` : '', - 'linkTag.onload = function() {', + 'var onLinkComplete = function (event) {', Template.indent([ + '// avoid mem leaks.', 'linkTag.onerror = linkTag.onload = null;', - 'resolve();', - ]), - '};', - 'linkTag.onerror = function(event) {', - Template.indent([ - 'linkTag.onerror = linkTag.onload = null;', - 'var request = event && event.target && event.target.href || fullhref;', - 'var err = new Error("Loading CSS chunk " + chunkId + " failed.\\n(" + request + ")");', - 'err.code = "CSS_CHUNK_LOAD_FAILED";', - 'err.request = request;', - 'linkTag.parentNode.removeChild(linkTag)', - 'reject(err);', + "if (event.type === 'load') {", + Template.indent(['resolve();']), + '} else {', + Template.indent([ + 'var request = event && event.target && event.target.href || fullhref;', + 'var err = new Error("Loading CSS chunk " + chunkId + " failed.\\n(" + request + ")");', + 'err.code = "CSS_CHUNK_LOAD_FAILED";', + 'err.request = request;', + 'linkTag.parentNode.removeChild(linkTag)', + 'reject(err);', + ]), + '}', ]), '};', + 'linkTag.onerror = linkTag.onload = onLinkComplete;', 'linkTag.href = fullhref;', crossOriginLoading ? Template.asString([ diff --git a/src/index.js b/src/index.js index 53773df1..b00b060d 100644 --- a/src/index.js +++ b/src/index.js @@ -405,24 +405,26 @@ class MiniCssExtractPlugin { this.runtimeOptions.linkType )};` : '', - 'linkTag.onload = function() {', + 'var onLinkComplete = function (event) {', Template.indent([ + '// avoid mem leaks.', 'linkTag.onerror = linkTag.onload = null;', - 'resolve();', - ]), - '};', - 'linkTag.onerror = function(event) {', - Template.indent([ - 'linkTag.onerror = linkTag.onload = null;', - 'var request = event && event.target && event.target.href || fullhref;', - 'var err = new Error("Loading CSS chunk " + chunkId + " failed.\\n(" + request + ")");', - 'err.code = "CSS_CHUNK_LOAD_FAILED";', - 'err.request = request;', - 'delete installedCssChunks[chunkId]', - 'linkTag.parentNode.removeChild(linkTag)', - 'reject(err);', + "if (event.type === 'load') {", + Template.indent(['resolve();']), + '} else {', + Template.indent([ + 'var request = event && event.target && event.target.href || fullhref;', + 'var err = new Error("Loading CSS chunk " + chunkId + " failed.\\n(" + request + ")");', + 'err.code = "CSS_CHUNK_LOAD_FAILED";', + 'err.request = request;', + 'delete installedCssChunks[chunkId]', + 'linkTag.parentNode.removeChild(linkTag)', + 'reject(err);', + ]), + '}', ]), '};', + 'linkTag.onerror = linkTag.onload = onLinkComplete;', 'linkTag.href = fullhref;', crossOriginLoading ? Template.asString([ diff --git a/test/cases/hmr/expected/webpack-5/main.js b/test/cases/hmr/expected/webpack-5/main.js index 89a5c4e3..52d408cd 100644 --- a/test/cases/hmr/expected/webpack-5/main.js +++ b/test/cases/hmr/expected/webpack-5/main.js @@ -827,19 +827,21 @@ module.exports = function (urlString) { /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = function() { +/******/ var onLinkComplete = function (event) { +/******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; -/******/ resolve(); -/******/ }; -/******/ linkTag.onerror = function(event) { -/******/ linkTag.onerror = linkTag.onload = null; -/******/ var request = event && event.target && event.target.href || fullhref; -/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); -/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; -/******/ err.request = request; -/******/ linkTag.parentNode.removeChild(linkTag) -/******/ reject(err); +/******/ if (event.type === 'load') { +/******/ resolve(); +/******/ } else { +/******/ var request = event && event.target && event.target.href || fullhref; +/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); +/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; +/******/ err.request = request; +/******/ linkTag.parentNode.removeChild(linkTag) +/******/ reject(err); +/******/ } /******/ }; +/******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ /******/ document.head.appendChild(linkTag); diff --git a/test/cases/insert-function/expected/webpack-4/main.js b/test/cases/insert-function/expected/webpack-4/main.js index 2fccb65e..45c2e3dd 100644 --- a/test/cases/insert-function/expected/webpack-4/main.js +++ b/test/cases/insert-function/expected/webpack-4/main.js @@ -104,20 +104,22 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = function() { +/******/ var onLinkComplete = function (event) { +/******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; -/******/ resolve(); -/******/ }; -/******/ linkTag.onerror = function(event) { -/******/ linkTag.onerror = linkTag.onload = null; -/******/ var request = event && event.target && event.target.href || fullhref; -/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); -/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; -/******/ err.request = request; -/******/ delete installedCssChunks[chunkId] -/******/ linkTag.parentNode.removeChild(linkTag) -/******/ reject(err); +/******/ if (event.type === 'load') { +/******/ resolve(); +/******/ } else { +/******/ var request = event && event.target && event.target.href || fullhref; +/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); +/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; +/******/ err.request = request; +/******/ delete installedCssChunks[chunkId] +/******/ linkTag.parentNode.removeChild(linkTag) +/******/ reject(err); +/******/ } /******/ }; +/******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ /******/ (function (linkTag) { diff --git a/test/cases/insert-function/expected/webpack-5/main.js b/test/cases/insert-function/expected/webpack-5/main.js index 8e0df256..f7063ae6 100644 --- a/test/cases/insert-function/expected/webpack-5/main.js +++ b/test/cases/insert-function/expected/webpack-5/main.js @@ -162,19 +162,21 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = function() { +/******/ var onLinkComplete = function (event) { +/******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; -/******/ resolve(); -/******/ }; -/******/ linkTag.onerror = function(event) { -/******/ linkTag.onerror = linkTag.onload = null; -/******/ var request = event && event.target && event.target.href || fullhref; -/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); -/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; -/******/ err.request = request; -/******/ linkTag.parentNode.removeChild(linkTag) -/******/ reject(err); +/******/ if (event.type === 'load') { +/******/ resolve(); +/******/ } else { +/******/ var request = event && event.target && event.target.href || fullhref; +/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); +/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; +/******/ err.request = request; +/******/ linkTag.parentNode.removeChild(linkTag) +/******/ reject(err); +/******/ } /******/ }; +/******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ /******/ (function (linkTag) { diff --git a/test/cases/insert-string/expected/webpack-4/main.js b/test/cases/insert-string/expected/webpack-4/main.js index 05ab1955..fa478446 100644 --- a/test/cases/insert-string/expected/webpack-4/main.js +++ b/test/cases/insert-string/expected/webpack-4/main.js @@ -104,20 +104,22 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = function() { +/******/ var onLinkComplete = function (event) { +/******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; -/******/ resolve(); -/******/ }; -/******/ linkTag.onerror = function(event) { -/******/ linkTag.onerror = linkTag.onload = null; -/******/ var request = event && event.target && event.target.href || fullhref; -/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); -/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; -/******/ err.request = request; -/******/ delete installedCssChunks[chunkId] -/******/ linkTag.parentNode.removeChild(linkTag) -/******/ reject(err); +/******/ if (event.type === 'load') { +/******/ resolve(); +/******/ } else { +/******/ var request = event && event.target && event.target.href || fullhref; +/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); +/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; +/******/ err.request = request; +/******/ delete installedCssChunks[chunkId] +/******/ linkTag.parentNode.removeChild(linkTag) +/******/ reject(err); +/******/ } /******/ }; +/******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ /******/ var target = document.querySelector("script[src='1.js']"); diff --git a/test/cases/insert-string/expected/webpack-5/main.js b/test/cases/insert-string/expected/webpack-5/main.js index 7a964b31..c101f0b0 100644 --- a/test/cases/insert-string/expected/webpack-5/main.js +++ b/test/cases/insert-string/expected/webpack-5/main.js @@ -162,19 +162,21 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = function() { +/******/ var onLinkComplete = function (event) { +/******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; -/******/ resolve(); -/******/ }; -/******/ linkTag.onerror = function(event) { -/******/ linkTag.onerror = linkTag.onload = null; -/******/ var request = event && event.target && event.target.href || fullhref; -/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); -/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; -/******/ err.request = request; -/******/ linkTag.parentNode.removeChild(linkTag) -/******/ reject(err); +/******/ if (event.type === 'load') { +/******/ resolve(); +/******/ } else { +/******/ var request = event && event.target && event.target.href || fullhref; +/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); +/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; +/******/ err.request = request; +/******/ linkTag.parentNode.removeChild(linkTag) +/******/ reject(err); +/******/ } /******/ }; +/******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ /******/ var target = document.querySelector("script[src='1.js']"); diff --git a/test/cases/insert-undefined/expected/webpack-4/main.js b/test/cases/insert-undefined/expected/webpack-4/main.js index fd271bc0..4ad5b421 100644 --- a/test/cases/insert-undefined/expected/webpack-4/main.js +++ b/test/cases/insert-undefined/expected/webpack-4/main.js @@ -104,20 +104,22 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = function() { +/******/ var onLinkComplete = function (event) { +/******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; -/******/ resolve(); -/******/ }; -/******/ linkTag.onerror = function(event) { -/******/ linkTag.onerror = linkTag.onload = null; -/******/ var request = event && event.target && event.target.href || fullhref; -/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); -/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; -/******/ err.request = request; -/******/ delete installedCssChunks[chunkId] -/******/ linkTag.parentNode.removeChild(linkTag) -/******/ reject(err); +/******/ if (event.type === 'load') { +/******/ resolve(); +/******/ } else { +/******/ var request = event && event.target && event.target.href || fullhref; +/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); +/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; +/******/ err.request = request; +/******/ delete installedCssChunks[chunkId] +/******/ linkTag.parentNode.removeChild(linkTag) +/******/ reject(err); +/******/ } /******/ }; +/******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ /******/ document.head.appendChild(linkTag); diff --git a/test/cases/insert-undefined/expected/webpack-5/main.js b/test/cases/insert-undefined/expected/webpack-5/main.js index 1078a665..cd6cb688 100644 --- a/test/cases/insert-undefined/expected/webpack-5/main.js +++ b/test/cases/insert-undefined/expected/webpack-5/main.js @@ -162,19 +162,21 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ linkTag.onload = function() { +/******/ var onLinkComplete = function (event) { +/******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; -/******/ resolve(); -/******/ }; -/******/ linkTag.onerror = function(event) { -/******/ linkTag.onerror = linkTag.onload = null; -/******/ var request = event && event.target && event.target.href || fullhref; -/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); -/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; -/******/ err.request = request; -/******/ linkTag.parentNode.removeChild(linkTag) -/******/ reject(err); +/******/ if (event.type === 'load') { +/******/ resolve(); +/******/ } else { +/******/ var request = event && event.target && event.target.href || fullhref; +/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")"); +/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; +/******/ err.request = request; +/******/ linkTag.parentNode.removeChild(linkTag) +/******/ reject(err); +/******/ } /******/ }; +/******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ /******/ document.head.appendChild(linkTag); From 13bf4715bc982270716f204e279213ab2e8b3899 Mon Sep 17 00:00:00 2001 From: dgeibi Date: Tue, 27 Oct 2020 00:21:48 +0800 Subject: [PATCH 3/3] fix: onerror mem leak --- src/CssLoadingRuntimeModule.js | 6 ++---- test/cases/hmr/expected/webpack-5/main.js | 4 ++-- test/cases/insert-function/expected/webpack-5/main.js | 4 ++-- test/cases/insert-string/expected/webpack-5/main.js | 4 ++-- test/cases/insert-undefined/expected/webpack-5/main.js | 4 ++-- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/CssLoadingRuntimeModule.js b/src/CssLoadingRuntimeModule.js index ad8fe113..1063351e 100644 --- a/src/CssLoadingRuntimeModule.js +++ b/src/CssLoadingRuntimeModule.js @@ -60,8 +60,7 @@ module.exports = class CssLoadingRuntimeModule extends RuntimeModule { this.runtimeOptions.linkType ? `linkTag.type = ${JSON.stringify(this.runtimeOptions.linkType)};` : '', - 'var onLinkComplete = function (event) {', - Template.indent([ + `var onLinkComplete = ${runtimeTemplate.basicFunction('event', [ '// avoid mem leaks.', 'linkTag.onerror = linkTag.onload = null;', "if (event.type === 'load') {", @@ -76,8 +75,7 @@ module.exports = class CssLoadingRuntimeModule extends RuntimeModule { 'reject(err);', ]), '}', - ]), - '};', + ])}`, 'linkTag.onerror = linkTag.onload = onLinkComplete;', 'linkTag.href = fullhref;', crossOriginLoading diff --git a/test/cases/hmr/expected/webpack-5/main.js b/test/cases/hmr/expected/webpack-5/main.js index 52d408cd..b746eb64 100644 --- a/test/cases/hmr/expected/webpack-5/main.js +++ b/test/cases/hmr/expected/webpack-5/main.js @@ -827,7 +827,7 @@ module.exports = function (urlString) { /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ var onLinkComplete = function (event) { +/******/ var onLinkComplete = (event) => { /******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; /******/ if (event.type === 'load') { @@ -840,7 +840,7 @@ module.exports = function (urlString) { /******/ linkTag.parentNode.removeChild(linkTag) /******/ reject(err); /******/ } -/******/ }; +/******/ } /******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ diff --git a/test/cases/insert-function/expected/webpack-5/main.js b/test/cases/insert-function/expected/webpack-5/main.js index f7063ae6..55507ce3 100644 --- a/test/cases/insert-function/expected/webpack-5/main.js +++ b/test/cases/insert-function/expected/webpack-5/main.js @@ -162,7 +162,7 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ var onLinkComplete = function (event) { +/******/ var onLinkComplete = (event) => { /******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; /******/ if (event.type === 'load') { @@ -175,7 +175,7 @@ /******/ linkTag.parentNode.removeChild(linkTag) /******/ reject(err); /******/ } -/******/ }; +/******/ } /******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ diff --git a/test/cases/insert-string/expected/webpack-5/main.js b/test/cases/insert-string/expected/webpack-5/main.js index c101f0b0..9d78db3c 100644 --- a/test/cases/insert-string/expected/webpack-5/main.js +++ b/test/cases/insert-string/expected/webpack-5/main.js @@ -162,7 +162,7 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ var onLinkComplete = function (event) { +/******/ var onLinkComplete = (event) => { /******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; /******/ if (event.type === 'load') { @@ -175,7 +175,7 @@ /******/ linkTag.parentNode.removeChild(linkTag) /******/ reject(err); /******/ } -/******/ }; +/******/ } /******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/ diff --git a/test/cases/insert-undefined/expected/webpack-5/main.js b/test/cases/insert-undefined/expected/webpack-5/main.js index cd6cb688..5a4b5b25 100644 --- a/test/cases/insert-undefined/expected/webpack-5/main.js +++ b/test/cases/insert-undefined/expected/webpack-5/main.js @@ -162,7 +162,7 @@ /******/ /******/ linkTag.rel = "stylesheet"; /******/ linkTag.type = "text/css"; -/******/ var onLinkComplete = function (event) { +/******/ var onLinkComplete = (event) => { /******/ // avoid mem leaks. /******/ linkTag.onerror = linkTag.onload = null; /******/ if (event.type === 'load') { @@ -175,7 +175,7 @@ /******/ linkTag.parentNode.removeChild(linkTag) /******/ reject(err); /******/ } -/******/ }; +/******/ } /******/ linkTag.onerror = linkTag.onload = onLinkComplete; /******/ linkTag.href = fullhref; /******/