| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/zh-CN/docs/WebAssembly/Guides/Using_the_JavaScript_API | [Back] [Original] |
Get to know MDN better
WebAssembly Javascript API wasm
webassembly-examples GitHub
wasm simple.wasm
wasm WebAssembly wasm
(module
(func $i (import "my_namespace" "imported_func") (param i32))
(func (export "exported_func")
i32.const 42
call $i))
$i my_namespace.imported_func wasm JavaScript HTML <script></script>
const importObject = {
my_namespace: { imported_func: (arg) => console.log(arg) },
};
Firefox 58 WebAssembly WebAssembly.compileStreaming() WebAssembly.instantiateStreaming() / Response ArrayBuffer
GitHub instantiate-streaming.html instantiateStreaming() Wasm JavaScript
WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
(obj) => obj.instance.exports.exported_func(),
);
WebAssembly exported_func JavaScript imported_func WebAssembly 42 WebAssembly
Web WebAssembly JavaScript WebAssembly JavaScript
WebAssembly.compile()/WebAssembly.instantiate()
/ Wasm ArrayBuffer
fetch("simple.wasm")
.then((response) => response.arrayBuffer())
.then((bytes) => WebAssembly.instantiate(bytes, importObject))
.then((results) => {
results.instance.exports.exported_func();
});
Firefox 54+ Wasm wasm://
WebAssembly WebAssembly
C/C++ C/C++ WebAssembly WebAssembly WebAssembly postMessage() Window Worker
JavaScript Memory ArrayBuffer SharedArrayBuffer ArrayBuffers Web Memory WebAssembly.Memory() shared
const memory = new WebAssembly.Memory({ initial: 10, maximum: 100 });
WebAssembly 64KB 640KB 6.4MB
WebAssembly ArrayBuffer getter / setter 42
const data = new DataView(memory.buffer);
data.setUint32(0, 42, true);
true WebAssembly
data.getUint32(0, true);
JavaScript
Memory.prototype.grow() WebAssembly
memory.grow(1);
ArrayBuffer byteLength Memory.prototype.grow() getter ArrayBuffer byteLength ArrayBuffer
JavaScript WebAssembly.Memory WebAssembly Instance.prototype.exports
WebAssembly memory.wasm
memory.wasm
memory.html wasm
WebAssembly.instantiateStreaming(fetch("memory.wasm"), {
js: { mem: memory },
}).then((results) => {
//
});
accumulate() mem
const summands = new DataView(memory.buffer);
for (let i = 0; i < 10; i++) {
summands.setUint32(i * 4, i, true);
}
const sum = results.instance.exports.accumulate(0, 10);
console.log(sum);
Memory.prototype.buffer DataView
JavaScript
WebAssembly JavaScript WebAssembly
WebAssembly WebAssembly
C/C++ C/C++
WebAssembly
Table.prototype.set() Table.prototype.grow() JavaScript wasm JavaScript Table.prototype.get()
WebAssembly 0 13 1 42 table.wasm
table.wasm
HTML table.html.
wasm HTML body <script>
WebAssembly.instantiateStreaming(fetch("table.wasm")).then((results) => {
//
});
const tbl = results.instance.exports.tbl;
console.log(tbl.get(0)()); // 13
console.log(tbl.get(1)()); // 42
WebAssembly JavaScript WebAssembly.Module /
JavaScript WebAssembly WebAssembly.Global()
const global = new WebAssembly.Global({ value: "i32", mutable: true }, 0)
value WebAssembly i32i64f32 f64mutable i32 0
Global.value 42 global.wasm incGlobal() 43 1
const output = document.getElementById("output");
function assertEq(msg, got, expected) {
const result =
got === expected
? `SUCCESS! Got: ${got}\n`
: `FAIL!\nGot: ${got}\nExpected: ${expected}\n`;
output.innerText += `Testing ${msg}: ${result}`;
}
assertEq("WebAssembly.Global exists", typeof WebAssembly.Global, "function");
const global = new WebAssembly.Global({ value: "i32", mutable: true }, 0);
WebAssembly.instantiateStreaming(fetch("global.wasm"), { js: { global } }).then(
({ instance }) => {
assertEq(
"getting initial value from wasm",
instance.exports.getGlobal(),
0,
);
global.value = 42;
assertEq(
"getting JS-updated value from wasm",
instance.exports.getGlobal(),
42,
);
instance.exports.incGlobal();
assertEq("getting wasm-updated value from JS", global.value, 43);
},
);
WebAssembly WebAssembly
WebAssembly JavaScript API JavaScript WebAssembly JavaScript WebAssembly
| Web Proxy Viewer | New URL | Original Page |