diff --git a/crates/rspack_plugin_wasm/src/parser_and_generator.rs b/crates/rspack_plugin_wasm/src/parser_and_generator.rs index 1c5d2bfd003d..4b594e8e3d81 100644 --- a/crates/rspack_plugin_wasm/src/parser_and_generator.rs +++ b/crates/rspack_plugin_wasm/src/parser_and_generator.rs @@ -2,6 +2,7 @@ use std::{ borrow::Cow, collections::hash_map::DefaultHasher, hash::{Hash, Hasher}, + path::Path, }; use indexmap::IndexMap; @@ -261,10 +262,16 @@ impl ParserAndGenerator for AsyncWasmParserAndGenerator { None }; + let origin_filename = Path::new(&normal_module.resource_resolved_data().resource) + .file_stem() + .and_then(|s| s.to_str()) + .unwrap_or(""); + let instantiate_call = format!( - "{}(exports, module.id, {} {})", + "{}(exports, module.id, {}, {} {})", RuntimeGlobals::INSTANTIATE_WASM, serde_json::to_string(&hash).expect("should be ok"), + serde_json::to_string(origin_filename).expect("should be ok"), imports_obj.unwrap_or_default() ); diff --git a/crates/rspack_plugin_wasm/src/runtime.rs b/crates/rspack_plugin_wasm/src/runtime.rs index 1d42a5e07d02..c321bd100dae 100644 --- a/crates/rspack_plugin_wasm/src/runtime.rs +++ b/crates/rspack_plugin_wasm/src/runtime.rs @@ -60,6 +60,7 @@ impl RuntimeModule for AsyncWasmLoadingRuntimeModule { .hash(&hash) .content_hash(&hash) .id(&PathData::prepare_id("\" + wasmModuleId + \"")) + .filename("\" + wasmModuleName + \"") .runtime(chunk.runtime().as_str()), ) .await?; @@ -109,7 +110,7 @@ fn get_async_wasm_loading(req: &str, supports_streaming: bool) -> String { if supports_streaming { format!( r#" - __webpack_require__.v = function(exports, wasmModuleId, wasmModuleHash, importsObj) {{ + __webpack_require__.v = function(exports, wasmModuleId, wasmModuleHash, wasmModuleName, importsObj) {{ var req = {req}; var fallback = function() {{ return req{fallback_code} @@ -122,7 +123,7 @@ fn get_async_wasm_loading(req: &str, supports_streaming: bool) -> String { let req = req.trim_end_matches(';'); format!( r#" - __webpack_require__.v = function(exports, wasmModuleId, wasmModuleHash, importsObj) {{ + __webpack_require__.v = function(exports, wasmModuleId, wasmModuleHash, wasmModuleName, importsObj) {{ return {req}{fallback_code} }}; "# diff --git a/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/__snapshots__/output.snap.txt b/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/__snapshots__/output.snap.txt new file mode 100644 index 000000000000..2eb314b787fe --- /dev/null +++ b/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/__snapshots__/output.snap.txt @@ -0,0 +1,30 @@ +```js title=main.js +"use strict"; +(self["webpackChunkwebpack"] = self["webpackChunkwebpack"] || []).push([["main"], { +"./index.js": (function (module, __webpack_exports__, __webpack_require__) { +__webpack_require__.a(module, async function (__webpack_handle_async_dependencies__, __webpack_async_result__) { try { +__webpack_require__.r(__webpack_exports__); +/* ESM import */var _factorial_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./factorial.wasm"); +var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_factorial_wasm__WEBPACK_IMPORTED_MODULE_0__]); +_factorial_wasm__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; + +const factorial = _factorial_wasm__WEBPACK_IMPORTED_MODULE_0__._Z4facti; + +document.querySelector("#root").innerHTML = factorial(3); + +__webpack_async_result__(); +} catch(e) { __webpack_async_result__(e); } }); + +}), +"./factorial.wasm": (function (module, exports, __webpack_require__) { + module.exports = __webpack_require__.v(exports, module.id, "4f244726a350135b", "factorial" ); + +}), + +},function(__webpack_require__) { +var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId) } +var __webpack_exports__ = (__webpack_exec__("./index.js")); + +} +]); +``` \ No newline at end of file diff --git a/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/factorial.wasm b/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/factorial.wasm new file mode 100644 index 000000000000..50ce8c098a4c Binary files /dev/null and b/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/factorial.wasm differ diff --git a/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/index.js b/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/index.js new file mode 100644 index 000000000000..ebe4f84ae560 --- /dev/null +++ b/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/index.js @@ -0,0 +1,5 @@ +import { _Z4facti } from "./factorial.wasm"; + +const factorial = _Z4facti; + +document.querySelector("#root").innerHTML = factorial(3); diff --git a/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/rspack.config.cjs b/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/rspack.config.cjs new file mode 100644 index 000000000000..66fabe34a559 --- /dev/null +++ b/packages/rspack-test-tools/tests/builtinCases/plugin-wasm/wasm-module-name/rspack.config.cjs @@ -0,0 +1,12 @@ +module.exports = { + context: __dirname, + entry: { + main: "./index.js" + }, + output: { + webassemblyModuleFilename: "[name].wasm" + }, + experiments: { + asyncWebAssembly: true + } +};