From 32659cdb38e41e9b5df3fe42fdd88a199a2953ee Mon Sep 17 00:00:00 2001 From: Hikari Hayashi Date: Wed, 28 Dec 2022 14:05:06 +0800 Subject: [PATCH] fix: perform a HMR update after inserting a new CSS module Fixes #706 --- src/hmr/hotModuleReplacement.js | 10 +++++++++- src/loader.js | 3 +++ test/cases/hmr/expected/main.js | 13 ++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/hmr/hotModuleReplacement.js b/src/hmr/hotModuleReplacement.js index 58cc2d79..8de1a15a 100644 --- a/src/hmr/hotModuleReplacement.js +++ b/src/hmr/hotModuleReplacement.js @@ -246,6 +246,8 @@ function isUrlRequest(url) { return true; } +const updateFunctionMap = Object.create(null); + /** * @param {TODO} moduleId * @param {TODO} options @@ -258,6 +260,11 @@ module.exports = function (moduleId, options) { return noop; } + const key = JSON.stringify({ moduleId, options }); + if (updateFunctionMap[key]) { + return updateFunctionMap[key]; + } + const getScriptSrc = getCurrentScriptUrl(moduleId); function update() { @@ -281,5 +288,6 @@ module.exports = function (moduleId, options) { } } - return debounce(update, 50); + updateFunctionMap[key] = debounce(update, 50); + return updateFunctionMap[key]; }; diff --git a/src/loader.js b/src/loader.js index b3006b4a..0642864e 100644 --- a/src/loader.js +++ b/src/loader.js @@ -60,6 +60,9 @@ function hotLoader(content, context) { })}); module.hot.dispose(cssReload); ${accept} + if (module.hot.status() !== "idle") { + cssReload(); + } } `; } diff --git a/test/cases/hmr/expected/main.js b/test/cases/hmr/expected/main.js index 4e7e629f..2797ddd0 100644 --- a/test/cases/hmr/expected/main.js +++ b/test/cases/hmr/expected/main.js @@ -255,6 +255,8 @@ function isUrlRequest(url) { return true; } +const updateFunctionMap = Object.create(null); + /** * @param {TODO} moduleId * @param {TODO} options @@ -267,6 +269,11 @@ module.exports = function (moduleId, options) { return noop; } + const key = JSON.stringify({ moduleId, options }); + if (updateFunctionMap[key]) { + return updateFunctionMap[key]; + } + const getScriptSrc = getCurrentScriptUrl(moduleId); function update() { @@ -290,7 +297,8 @@ module.exports = function (moduleId, options) { } } - return debounce(update, 50); + updateFunctionMap[key] = debounce(update, 50); + return updateFunctionMap[key]; }; @@ -367,6 +375,9 @@ __webpack_require__.r(__webpack_exports__); var cssReload = __webpack_require__(/*! ../../../src/hmr/hotModuleReplacement.js */ "../../../src/hmr/hotModuleReplacement.js")(module.id, {"locals":false}); module.hot.dispose(cssReload); module.hot.accept(undefined, cssReload); + if (module.hot.status() !== "idle") { + cssReload(); + } }