mirror of
https://github.com/rustwasm/wasm-bindgen.git
synced 2024-12-17 14:31:45 +03:00
a2aa28e4d3
This commit adds a new attribute to `#[wasm_bindgen]`: `start`. The `start` attribute can be used to indicate that a function should be executed when the module is loaded, configuring the `start` function of the wasm executable. While this doesn't necessarily literally configure the `start` section, it does its best! Only one crate in a crate graph may indicate `#[wasm_bindgen(start)]`, so it's not recommended to be used in libraries but only end-user applications. Currently this still must be used with the `crate-type = ["cdylib"]` annotation in `Cargo.toml`. The implementation here is somewhat tricky because of the circular dependency between our generated JS and the wasm file that we emit. This circular dependency makes running initialization routines (like the `start` shim) particularly fraught with complications because one may need to run before the other but bundlers may not necessarily respect it. Workarounds have been implemented for various emission strategies, for example calling the start function directly after exports are wired up with `--no-modules` and otherwise working around what appears to be a Webpack bug with initializers running in a different order than we'd like. In any case, this in theory doesn't show up to the end user! Closes #74
34 lines
1.3 KiB
HTML
34 lines
1.3 KiB
HTML
<html>
|
|
<head>
|
|
<meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
|
|
</head>
|
|
<body>
|
|
<script>
|
|
// The `--no-modules`-generated JS from `wasm-bindgen` attempts to use
|
|
// `WebAssembly.instantiateStreaming` to instantiate the wasm module,
|
|
// but this doesn't work with `file://` urls. This example is frequently
|
|
// viewed by simply opening `index.html` in a browser (with a `file://`
|
|
// url), so it would fail if we were to call this function!
|
|
//
|
|
// Work around this for now by deleting the function to ensure that the
|
|
// `no_modules.js` script doesn't have access to it. You won't need this
|
|
// hack when deploying over HTTP.
|
|
delete WebAssembly.instantiateStreaming;
|
|
</script>
|
|
|
|
<!-- this is the JS generated by the `wasm-bindgen` CLI tool -->
|
|
<script src='./no_modules.js'></script>
|
|
|
|
<script>
|
|
window.addEventListener('load', async () => {
|
|
// the `wasm_bindgen` global is set to the exports of the Rust module
|
|
//
|
|
// here we tell bindgen the path to the wasm file so it can run
|
|
// initialization and return to us a promise when it's done
|
|
// also, we can use 'await' on the returned promise
|
|
await wasm_bindgen('./no_modules_bg.wasm');
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|