From 1b39a46e6ff7e75fdbca8f653702dccc041701d0 Mon Sep 17 00:00:00 2001 From: harpsealjs Date: Wed, 29 Jul 2026 21:47:46 +0800 Subject: [PATCH 1/2] fix(runtime): avoid dead require bootstrap --- .../src/plugin/runtime_context.rs | 3 ++- .../rslib/no-dead-require-bootstrap/index.js | 3 +++ .../rslib/no-dead-require-bootstrap/logo.svg | 3 +++ .../rspack.config.js | 26 +++++++++++++++++++ .../no-dead-require-bootstrap/test.config.js | 12 +++++++++ 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/index.js create mode 100644 tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/logo.svg create mode 100644 tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/rspack.config.js create mode 100644 tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/test.config.js diff --git a/crates/rspack_plugin_javascript/src/plugin/runtime_context.rs b/crates/rspack_plugin_javascript/src/plugin/runtime_context.rs index 4fe9c880cc0e..2d604cb92297 100644 --- a/crates/rspack_plugin_javascript/src/plugin/runtime_context.rs +++ b/crates/rspack_plugin_javascript/src/plugin/runtime_context.rs @@ -167,7 +167,8 @@ var module = ({module_cache}[moduleId] = {{"#, || has_custom_runtime_module; let need_module_defer = runtime_requirements.contains(RuntimeGlobals::MAKE_DEFERRED_NAMESPACE_OBJECT); - let use_require = require_function || intercept_module_execution || module_used; + let use_require = + require_function || intercept_module_execution || (module_used && module_factories); let mut header: Vec> = Vec::new(); let mut startup: Vec> = Vec::new(); let mut allow_inline_startup = true; diff --git a/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/index.js b/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/index.js new file mode 100644 index 000000000000..8ccb05d867d1 --- /dev/null +++ b/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/index.js @@ -0,0 +1,3 @@ +import logo from "./logo.svg"; + +export { logo }; diff --git a/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/logo.svg b/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/logo.svg new file mode 100644 index 000000000000..0c3b1f64ed23 --- /dev/null +++ b/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/rspack.config.js b/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/rspack.config.js new file mode 100644 index 000000000000..1a3a5be89ad5 --- /dev/null +++ b/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/rspack.config.js @@ -0,0 +1,26 @@ +const { + experiments: { RslibPlugin }, +} = require('@rspack/core'); + +/** @type {import("@rspack/core").Configuration} */ +module.exports = { + target: 'node', + experiments: { + runtimeMode: 'rspack', + }, + module: { + rules: [ + { + test: /\.svg$/, + type: 'asset/resource', + }, + ], + }, + output: { + iife: false, + library: { + type: 'commonjs-static', + }, + }, + plugins: [new RslibPlugin()], +}; diff --git a/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/test.config.js b/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/test.config.js new file mode 100644 index 000000000000..477b0b7a03f2 --- /dev/null +++ b/tests/rspack-test/configCases/rslib/no-dead-require-bootstrap/test.config.js @@ -0,0 +1,12 @@ +const fs = require("fs"); + +/** @type {import("../../../..").TConfigCaseConfig} */ +module.exports = { + afterExecute(options) { + const source = fs.readFileSync(options.output.path + "/bundle0.js", "utf-8"); + + expect(source).not.toContain("function __rspack_require"); + expect(source).not.toContain("var __rspack_module_cache"); + expect(source).not.toContain("__rspack_modules[moduleId]"); + } +}; From 27a46a5c8f17ab6ea99ab5700619aef9ba5adfa3 Mon Sep 17 00:00:00 2001 From: harpsealjs Date: Wed, 29 Jul 2026 22:20:55 +0800 Subject: [PATCH 2/2] fix(runtime): scope module bootstrap to entries --- .../src/plugin/runtime_context.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/crates/rspack_plugin_javascript/src/plugin/runtime_context.rs b/crates/rspack_plugin_javascript/src/plugin/runtime_context.rs index 2d604cb92297..4bf18f2c39ea 100644 --- a/crates/rspack_plugin_javascript/src/plugin/runtime_context.rs +++ b/crates/rspack_plugin_javascript/src/plugin/runtime_context.rs @@ -152,7 +152,6 @@ var module = ({module_cache}[moduleId] = {{"#, let module_cache = runtime_requirements.contains(RuntimeGlobals::MODULE_CACHE); let intercept_module_execution = runtime_requirements.contains(RuntimeGlobals::INTERCEPT_MODULE_EXECUTION); - let module_used = runtime_requirements.contains(RuntimeGlobals::MODULE); let has_custom_runtime_module = compilation .build_chunk_graph_artifact .chunk_graph @@ -167,8 +166,20 @@ var module = ({module_cache}[moduleId] = {{"#, || has_custom_runtime_module; let need_module_defer = runtime_requirements.contains(RuntimeGlobals::MAKE_DEFERRED_NAMESPACE_OBJECT); - let use_require = - require_function || intercept_module_execution || (module_used && module_factories); + let module_used = compilation + .build_chunk_graph_artifact + .chunk_graph + .get_chunk_entry_modules(chunk_ukey) + .iter() + .any(|module_identifier| { + ChunkGraph::get_module_runtime_requirements( + compilation, + *module_identifier, + chunk.runtime(), + ) + .is_some_and(|requirements| requirements.contains(RuntimeGlobals::MODULE)) + }); + let use_require = require_function || intercept_module_execution || module_used; let mut header: Vec> = Vec::new(); let mut startup: Vec> = Vec::new(); let mut allow_inline_startup = true;