From 2c5b4b21704141bce0d76d6145ee98a5bb50e069 Mon Sep 17 00:00:00 2001 From: lsy Date: Sat, 19 Oct 2024 13:50:49 +0800 Subject: [PATCH] =?UTF-8?q?wasm=E7=9A=84hello,world?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rust/temp/src/core/mod.rs | 42 -- rust/temp/src/main.rs | 18 +- rust/wasm/hello_world/Cargo.toml | 13 + .../dist/bd225cef621f4330ec1f.module.wasm | Bin 0 -> 18273 bytes rust/wasm/hello_world/dist/main.js | 377 ++++++++++++++++++ rust/wasm/hello_world/dist/pkg_wasm_js.js | 42 ++ rust/wasm/hello_world/package.json | 20 + rust/wasm/hello_world/src/index.html | 12 + rust/wasm/hello_world/src/index.js | 5 + rust/wasm/hello_world/src/lib.rs | 13 + rust/wasm/hello_world/webpack.config.js | 16 + 11 files changed, 510 insertions(+), 48 deletions(-) delete mode 100644 rust/temp/src/core/mod.rs create mode 100644 rust/wasm/hello_world/Cargo.toml create mode 100644 rust/wasm/hello_world/dist/bd225cef621f4330ec1f.module.wasm create mode 100644 rust/wasm/hello_world/dist/main.js create mode 100644 rust/wasm/hello_world/dist/pkg_wasm_js.js create mode 100644 rust/wasm/hello_world/package.json create mode 100644 rust/wasm/hello_world/src/index.html create mode 100644 rust/wasm/hello_world/src/index.js create mode 100644 rust/wasm/hello_world/src/lib.rs create mode 100644 rust/wasm/hello_world/webpack.config.js diff --git a/rust/temp/src/core/mod.rs b/rust/temp/src/core/mod.rs deleted file mode 100644 index b4a49c8..0000000 --- a/rust/temp/src/core/mod.rs +++ /dev/null @@ -1,42 +0,0 @@ -use tokio::io::{AsyncReadExt, AsyncWriteExt}; -use tokio::{net, runtime}; -use tokio::sync; - - -pub struct Server { - listener_addr: &'static str, - listener_port: i32, - status: bool, - route_vec:Vec<(&'static str,&'static str)>, -} -impl Server { - pub fn new(listener_port:i32) -> Self { - if listener_port < 1 || listener_port > 65535 { - panic!("listener port must be between 1 and 65535"); - } - Self { - listener_addr: "127.0.0.1", - listener_port, - status: false, - route_vec: Vec::new(), - } - } - pub fn start(&self) { - let address=format!("{}:{}", self.listener_addr, self.listener_port); - let rt = runtime::Runtime::new().unwrap(); - println!("Listening on {}", address); - let listener =rt.block_on(async { net::TcpListener::bind(address).await.expect("Failed to bind listener") }); - rt.block_on(Self::receive(listener)) - } - async fn receive(listener:net::TcpListener) { - loop { - let (mut socket, _) = listener.accept().await.expect("Failed to accept connection"); - tokio::spawn(async move { - println!("监听成功"); - let mut buf = [0; 1024]; - socket.read(&mut buf).await.unwrap(); - socket.write_all(b"Hello, World!").await.unwrap(); - }); - } - } -} \ No newline at end of file diff --git a/rust/temp/src/main.rs b/rust/temp/src/main.rs index 1f7d100..d8fa143 100644 --- a/rust/temp/src/main.rs +++ b/rust/temp/src/main.rs @@ -1,7 +1,13 @@ -use core::Server; -mod core; +extern crate wasm_bindgen; -fn main() { - let server = core::Server::new( 8000); - server.start(); -} \ No newline at end of file +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +extern { + pub fn alert(s: &str); +} + +#[wasm_bindgen] +pub fn greet(name: &str) { + alert(&format!("Hello, {}!", name)); +} diff --git a/rust/wasm/hello_world/Cargo.toml b/rust/wasm/hello_world/Cargo.toml new file mode 100644 index 0000000..2ab59c0 --- /dev/null +++ b/rust/wasm/hello_world/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "wasm" +version = "0.1.0" +edition = "2021" + +[dependencies] +wasm-bindgen = "0.2.95" + +[lib] +crate-type = ["cdylib", "rlib"] + +[package.metadata.wasm-pack.profile.release] +wasm-opt = false \ No newline at end of file diff --git a/rust/wasm/hello_world/dist/bd225cef621f4330ec1f.module.wasm b/rust/wasm/hello_world/dist/bd225cef621f4330ec1f.module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7b181dd1154747e5ad91fb16a44ba8efcf59fb9e GIT binary patch literal 18273 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 { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./src/index.js": +/*!**********************!*\ + !*** ./src/index.js ***! + \**********************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +eval("const js = __webpack_require__.e(/*! import() */ \"pkg_wasm_js\").then(__webpack_require__.bind(__webpack_require__, /*! ../pkg/wasm */ \"./pkg/wasm.js\"));\r\n\r\njs.then((js) => {\r\n js.greet();\r\n})\n\n//# sourceURL=webpack://wasm/./src/index.js?"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ id: moduleId, +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/async module */ +/******/ (() => { +/******/ var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues") : "__webpack_queues__"; +/******/ var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__"; +/******/ var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__"; +/******/ var resolveQueue = (queue) => { +/******/ if(queue && queue.d < 1) { +/******/ queue.d = 1; +/******/ queue.forEach((fn) => (fn.r--)); +/******/ queue.forEach((fn) => (fn.r-- ? fn.r++ : fn())); +/******/ } +/******/ } +/******/ var wrapDeps = (deps) => (deps.map((dep) => { +/******/ if(dep !== null && typeof dep === "object") { +/******/ if(dep[webpackQueues]) return dep; +/******/ if(dep.then) { +/******/ var queue = []; +/******/ queue.d = 0; +/******/ dep.then((r) => { +/******/ obj[webpackExports] = r; +/******/ resolveQueue(queue); +/******/ }, (e) => { +/******/ obj[webpackError] = e; +/******/ resolveQueue(queue); +/******/ }); +/******/ var obj = {}; +/******/ obj[webpackQueues] = (fn) => (fn(queue)); +/******/ return obj; +/******/ } +/******/ } +/******/ var ret = {}; +/******/ ret[webpackQueues] = x => {}; +/******/ ret[webpackExports] = dep; +/******/ return ret; +/******/ })); +/******/ __webpack_require__.a = (module, body, hasAwait) => { +/******/ var queue; +/******/ hasAwait && ((queue = []).d = -1); +/******/ var depQueues = new Set(); +/******/ var exports = module.exports; +/******/ var currentDeps; +/******/ var outerResolve; +/******/ var reject; +/******/ var promise = new Promise((resolve, rej) => { +/******/ reject = rej; +/******/ outerResolve = resolve; +/******/ }); +/******/ promise[webpackExports] = exports; +/******/ promise[webpackQueues] = (fn) => (queue && fn(queue), depQueues.forEach(fn), promise["catch"](x => {})); +/******/ module.exports = promise; +/******/ body((deps) => { +/******/ currentDeps = wrapDeps(deps); +/******/ var fn; +/******/ var getResult = () => (currentDeps.map((d) => { +/******/ if(d[webpackError]) throw d[webpackError]; +/******/ return d[webpackExports]; +/******/ })) +/******/ var promise = new Promise((resolve) => { +/******/ fn = () => (resolve(getResult)); +/******/ fn.r = 0; +/******/ var fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))); +/******/ currentDeps.map((dep) => (dep[webpackQueues](fnQueue))); +/******/ }); +/******/ return fn.r ? promise : getResult(); +/******/ }, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue))); +/******/ queue && queue.d < 0 && (queue.d = 0); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ var dataWebpackPrefix = "wasm:"; +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.setAttribute("data-webpack", dataWebpackPrefix + key); +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/wasm loading */ +/******/ (() => { +/******/ __webpack_require__.v = (exports, wasmModuleId, wasmModuleHash, importsObj) => { +/******/ var req = fetch(__webpack_require__.p + "" + wasmModuleHash + ".module.wasm"); +/******/ var fallback = () => (req +/******/ .then((x) => (x.arrayBuffer())) +/******/ .then((bytes) => (WebAssembly.instantiate(bytes, importsObj))) +/******/ .then((res) => (Object.assign(exports, res.instance.exports)))); +/******/ return req.then((res) => { +/******/ if (typeof WebAssembly.instantiateStreaming === "function") { +/******/ return WebAssembly.instantiateStreaming(res, importsObj) +/******/ .then( +/******/ (res) => (Object.assign(exports, res.instance.exports)), +/******/ (e) => { +/******/ if(res.headers.get("Content-Type") !== "application/wasm") { +/******/ console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); +/******/ return fallback(); +/******/ } +/******/ throw e; +/******/ } +/******/ ); +/******/ } +/******/ return fallback(); +/******/ }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ var scriptUrl; +/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; +/******/ var document = __webpack_require__.g.document; +/******/ if (!scriptUrl && document) { +/******/ if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') +/******/ scriptUrl = document.currentScript.src; +/******/ if (!scriptUrl) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ if(scripts.length) { +/******/ var i = scripts.length - 1; +/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; +/******/ } +/******/ } +/******/ } +/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration +/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. +/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); +/******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); +/******/ __webpack_require__.p = scriptUrl; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "main": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkwasm"] = self["webpackChunkwasm"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval devtool is used. +/******/ var __webpack_exports__ = __webpack_require__("./src/index.js"); +/******/ +/******/ })() +; \ No newline at end of file diff --git a/rust/wasm/hello_world/dist/pkg_wasm_js.js b/rust/wasm/hello_world/dist/pkg_wasm_js.js new file mode 100644 index 0000000..98318d4 --- /dev/null +++ b/rust/wasm/hello_world/dist/pkg_wasm_js.js @@ -0,0 +1,42 @@ +"use strict"; +/* + * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +(self["webpackChunkwasm"] = self["webpackChunkwasm"] || []).push([["pkg_wasm_js"],{ + +/***/ "./pkg/wasm.js": +/*!*********************!*\ + !*** ./pkg/wasm.js ***! + \*********************/ +/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ __wbg_alert_e63a4c41bbd7a3e9: () => (/* reexport safe */ _wasm_bg_js__WEBPACK_IMPORTED_MODULE_0__.__wbg_alert_e63a4c41bbd7a3e9),\n/* harmony export */ __wbg_set_wasm: () => (/* reexport safe */ _wasm_bg_js__WEBPACK_IMPORTED_MODULE_0__.__wbg_set_wasm),\n/* harmony export */ greet: () => (/* reexport safe */ _wasm_bg_js__WEBPACK_IMPORTED_MODULE_0__.greet)\n/* harmony export */ });\n/* harmony import */ var _wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wasm_bg.wasm */ \"./pkg/wasm_bg.wasm\");\n/* harmony import */ var _wasm_bg_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wasm_bg.js */ \"./pkg/wasm_bg.js\");\nvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_1__]);\n_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];\n\n\n\n(0,_wasm_bg_js__WEBPACK_IMPORTED_MODULE_0__.__wbg_set_wasm)(_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_1__);\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } });\n\n//# sourceURL=webpack://wasm/./pkg/wasm.js?"); + +/***/ }), + +/***/ "./pkg/wasm_bg.js": +/*!************************!*\ + !*** ./pkg/wasm_bg.js ***! + \************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ __wbg_alert_e63a4c41bbd7a3e9: () => (/* binding */ __wbg_alert_e63a4c41bbd7a3e9),\n/* harmony export */ __wbg_set_wasm: () => (/* binding */ __wbg_set_wasm),\n/* harmony export */ greet: () => (/* binding */ greet)\n/* harmony export */ });\nlet wasm;\nfunction __wbg_set_wasm(val) {\n wasm = val;\n}\n\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachedUint8ArrayMemory0 = null;\n\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nfunction greet() {\n wasm.greet();\n}\n\nfunction __wbg_alert_e63a4c41bbd7a3e9(arg0, arg1) {\n alert(getStringFromWasm0(arg0, arg1));\n};\n\n\n\n//# sourceURL=webpack://wasm/./pkg/wasm_bg.js?"); + +/***/ }), + +/***/ "./pkg/wasm_bg.wasm": +/*!**************************!*\ + !*** ./pkg/wasm_bg.wasm ***! + \**************************/ +/***/ ((module, exports, __webpack_require__) => { + +eval("/* harmony import */ var WEBPACK_IMPORTED_MODULE_0 = __webpack_require__(/*! ./wasm_bg.js */ \"./pkg/wasm_bg.js\");\nmodule.exports = __webpack_require__.v(exports, module.id, \"bd225cef621f4330ec1f\", {\n\t\"./wasm_bg.js\": {\n\t\t\"__wbg_alert_e63a4c41bbd7a3e9\": WEBPACK_IMPORTED_MODULE_0.__wbg_alert_e63a4c41bbd7a3e9\n\t}\n});\n\n//# sourceURL=webpack://wasm/./pkg/wasm_bg.wasm?"); + +/***/ }) + +}]); \ No newline at end of file diff --git a/rust/wasm/hello_world/package.json b/rust/wasm/hello_world/package.json new file mode 100644 index 0000000..5f9b4ff --- /dev/null +++ b/rust/wasm/hello_world/package.json @@ -0,0 +1,20 @@ +{ + "name": "wasm", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "serve": "webpack-dev-server" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "@lsy2246/wasm": "^0.1.0" + }, + "devDependencies": { + "webpack": "^5.95.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.1.0" + } +} diff --git a/rust/wasm/hello_world/src/index.html b/rust/wasm/hello_world/src/index.html new file mode 100644 index 0000000..1c9127d --- /dev/null +++ b/rust/wasm/hello_world/src/index.html @@ -0,0 +1,12 @@ + + + + + + WebAssembly Example + + +

WebAssembly Example

+ + + diff --git a/rust/wasm/hello_world/src/index.js b/rust/wasm/hello_world/src/index.js new file mode 100644 index 0000000..b175ffc --- /dev/null +++ b/rust/wasm/hello_world/src/index.js @@ -0,0 +1,5 @@ +const js = import("../pkg/wasm"); + +js.then((js) => { + js.greet(); +}) \ No newline at end of file diff --git a/rust/wasm/hello_world/src/lib.rs b/rust/wasm/hello_world/src/lib.rs new file mode 100644 index 0000000..98ae8a2 --- /dev/null +++ b/rust/wasm/hello_world/src/lib.rs @@ -0,0 +1,13 @@ +extern crate wasm_bindgen; + +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +extern { + pub fn alert(s: &str); +} + +#[wasm_bindgen] +pub fn greet() { + alert(&format!("Hello, world!")); +} diff --git a/rust/wasm/hello_world/webpack.config.js b/rust/wasm/hello_world/webpack.config.js new file mode 100644 index 0000000..76de70a --- /dev/null +++ b/rust/wasm/hello_world/webpack.config.js @@ -0,0 +1,16 @@ +module.exports = { + entry: './src/index.js', + mode: 'development', // 或 'production' + experiments: { + asyncWebAssembly: true, // 或 syncWebAssembly + }, + module: { + rules: [ + { + test: /\.wasm$/, + type: "webassembly/async" // 如果你选择异步方式 + } + ] + }, + // 其他配置 +};