カスタムJavaScriptコールバック
WebAssemblyモジュール内から呼び出せるカスタムJavaScript関数を設計・実装します
「カスタムJavaScriptコールバック」はCoddyKit上の無料WebAssembly (WASM) for High Performance Appsレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはWebAssembly (WASM) for High Performance Apps学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 WebAssembly (WASM) for High Performance Appsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
Calling JavaScript from WASM
Sometimes, your WebAssembly (WASM) module needs to communicate back to the JavaScript environment it's running in. This is where custom JavaScript callbacks become essential!
They allow your WASM code to trigger actions or pass data back to your web page, making your applications more interactive.
Why WASM Needs Callbacks
Imagine your WASM module performs complex calculations or processes data. Once it's done, it often needs to:
- Update the UI: Notify JavaScript to refresh a chart or display a result.
- Access Browser APIs: Request JavaScript to use APIs WASM can't directly access, like `localStorage` or `fetch`.
- Log Information: Send debugging messages or status updates to the browser console.
- Handle Events: Respond to user interactions or system events managed by JavaScript.
JavaScript Provides the Function
From the JavaScript side, setting up a callback is straightforward. You simply define a regular JavaScript function. This function will then be made available to your WebAssembly module during its initialization.
Think of it as giving your WASM module a direct line to call back into your JavaScript application when needed.
WASM Declares the Import
On the WebAssembly side (e.g., in Rust or C/C++), you need to declare that your module expects to import a function from its host environment (JavaScript).
- In Rust, you use the
#[wasm_bindgen]attribute with anextern "C"block. - This declaration specifies the function's name and its expected signature (parameters and return type).
- It tells the WASM compiler that this function call will be resolved externally by JavaScript.
Rust Code: Importing JavaScript
Let's look at a Rust example. We'll import a JavaScript function named logMessageFromWasm. When Rust calls this, the corresponding JS function will execute.
/* lib.rs */
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
// Imports a JS function named 'logMessageFromWasm'
// It takes a string and returns nothing.
#[wasm_bindgen(js_name = logMessageFromWasm)]
fn log_message_from_wasm(s: &str);
}
#[wasm_bindgen]
pub fn call_js_log() {
log_message_from_wasm("Hello from Rust!");
}Running the Callback (JS + Rust)
To run the Rust code from the previous scene, we compile it to a .wasm module and use wasm-bindgen's glue code. Then, we define our JavaScript callback and load the WASM.
Check your browser's developer console after running!
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<title>WASM Callback Demo</title>
</head>
<body>
<h1>Check console for WASM message!</h1>
<script type="module">
// Assuming 'pkg/rust_wasm_module.js' is generated by wasm-pack
import init, { call_js_log } from './pkg/rust_wasm_module.js';
// Define the JavaScript function that WASM will call
window.logMessageFromWasm = (message) => {
console.log("JS received:", message);
};
async function run() {
await init(); // Initialize the WASM module
call_js_log(); // Call the Rust function, which calls JS
}
run();
</script>
</body>
</html>Passing Data to Callbacks
Callbacks are not just for simple notifications; they can also pass data from your WebAssembly module back to JavaScript. This is crucial for returning results or providing context.
- Primitive Types: Numbers (integers, floats) and booleans are passed directly.
- Strings: With
wasm-bindgen, Rust strings (`&str`) are efficiently converted to JavaScript strings. - Complex Objects: For more intricate data structures, `wasm-bindgen` provides mechanisms for seamless serialization and deserialization.
Callback with Arguments (Rust)
Let's enhance our Rust example to pass a number back to JavaScript. The `log_number_from_wasm` function is imported, expecting an integer argument.
Our Rust function `calculate_and_log` will perform a sum and then pass the result to this JS callback.
/* lib.rs */
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
// Imports a JS function that takes an i32 number
#[wasm_bindgen(js_name = logNumberFromWasm)]
fn log_number_from_wasm(num: i32);
}
#[wasm_bindgen]
pub fn calculate_and_log(a: i32, b: i32) {
let result = a + b;
log_number_from_wasm(result); // Call JS with the calculated result
}Running Callback with Arguments
Here's the JavaScript setup for the previous Rust example. Notice how the `window.logNumberFromWasm` function now accepts a numeric argument, which it then prints to the console.
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<title>WASM Callback Args Demo</title>
</head>
<body>
<h1>Check console for calculated result!</h1>
<script type="module">
import init, { calculate_and_log } from './pkg/rust_wasm_module.js';
// This JS function will receive a number from WASM
window.logNumberFromWasm = (number) => {
console.log("JS received result:", number);
};
async function run() {
await init();
calculate_and_log(10, 20); // Call Rust with arguments 10 and 20
}
run();
</script>
</body>
</html>Common Callback Scenarios
Custom callbacks are incredibly versatile and enable WASM to integrate smoothly with the browser's environment. Some common use cases include:
- User Interface Updates: Notifying JS to update elements after a WASM computation is complete.
- Browser API Access: Requesting JS to use `localStorage`, `fetch`, or directly manipulate the DOM.
- Event Handling: Allowing WASM to react to user input or browser events processed by JS.
- Logging and Debugging: Sending detailed messages to the browser console from within WASM for monitoring.
Quick Check on Callbacks
Understanding how to declare and use imported functions is key to effective WASM-JS communication.
Recap: Custom JS Callbacks
You've learned how to enable your WebAssembly modules to call back into JavaScript!
- WASM modules can import and call JavaScript functions.
wasm-bindgensimplifies this process in Rust, allowing type-safe data exchange.- Callbacks are crucial for UI updates, accessing browser APIs, and logging from WASM.
This powerful pattern makes WASM applications more dynamic and integrated with the web environment. Keep experimenting!
よくある質問
「カスタムJavaScriptコールバック」レッスンは無料ですか?
はい。「カスタムJavaScriptコールバック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、WebAssembly (WASM) for High Performance Appsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 WebAssembly (WASM) for High Performance Appsコースには全4レッスンが含まれています。
「カスタムJavaScriptコールバック」で何を学びますか?
WebAssemblyモジュール内から呼び出せるカスタムJavaScript関数を設計・実装します ブラウザで直接実行するハンズオンコードでWebAssembly (WASM) for High Performance Appsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
WebAssembly (WASM) for High Performance Appsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのWebAssembly (WASM) for High Performance Appsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「カスタムJavaScriptコールバック」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このWebAssembly (WASM) for High Performance Appsレッスンでコードを書いて実行できますか?
はい。すべてのWebAssembly (WASM) for High Performance Appsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- WASMによる非同期処理
- カスタムJavaScriptコールバック
- エラー処理と例外
- JSとWASMの境界を越えたメモリと型付き配列の共有