Skip to content

Commit

Permalink
added default module path inside init function when target is web
Browse files Browse the repository at this point in the history
  • Loading branch information
ibaryshnikov committed Jun 7, 2019
1 parent 96d333a commit 8ace828
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
13 changes: 13 additions & 0 deletions crates/cli-support/src/js/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,17 @@ impl<'a> Context<'a> {
} else {
""
};

let default_module_path = match self.config.mode {
OutputMode::Web => {
"\
if (typeof module === 'undefined') {
module = import.meta.url.replace(/\\.js$/, '_bg.wasm');
}"
}
_ => "",
};

let ts = Self::ts_for_init_fn(mem.import.is_some());

// Initialize the `imports` object for all import definitions that we're
Expand All @@ -475,6 +486,7 @@ impl<'a> Context<'a> {
let js = format!(
"\
function init(module{init_memory_arg}) {{
{default_module_path}
let result;
const imports = {{}};
{imports_init}
Expand Down Expand Up @@ -518,6 +530,7 @@ impl<'a> Context<'a> {
}}
",
init_memory_arg = init_memory_arg,
default_module_path = default_module_path,
init_memory1 = init_memory1,
init_memory2 = init_memory2,
start = if needs_manual_start {
Expand Down
7 changes: 5 additions & 2 deletions examples/without-a-bundler/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,23 @@
// will "boot" the module and make it ready to use. Currently browsers
// don't support natively imported WebAssembly as an ES module, but
// eventually the manual initialization won't be required!
import { add, default as init } from './pkg/without_a_bundler.js';
import init, { add } from './pkg/without_a_bundler.js';

async function run() {
// First up we need to actually load the wasm file, so we use the
// default export to inform it where the wasm file is located on the
// server, and then we wait on the returned promise to wait for the
// wasm to be loaded.
// It may look like this: `await init('./pkg/without_a_bundler_bg.wasm');`,
// but there is also a handy default inside `init` function, which uses
// `import.meta` to locate the wasm file relatively to js file
//
// Note that instead of a string here you can also pass in an instance
// of `WebAssembly.Module` which allows you to compile your own module.
// Also note that the promise, when resolved, yields the wasm module's
// exports which is the same as importing the `*_bg` module in other
// modes
await init('./pkg/without_a_bundler_bg.wasm');
await init();

// And afterwards we can use all the functionality defined in wasm.
const result = add(1, 2);
Expand Down

0 comments on commit 8ace828

Please sign in to comment.