From 7f8eca6d61fafd158cd071fb2735a6ef677dbdb5 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 7 Mar 2019 07:33:40 -0800 Subject: [PATCH] Switch the `--browser` argument to `--web` This commit reverts part of the implementation of [RFC 6]. That RFC specified that the `--browser` flag was going to be repurposed for the new "natively loadable as ES module output", but unfortunately the breakage is far broader than initially expected. It turns out that `wasm-pack` passes `--browser` by default which means that a change to break `--browser` would break all historical versions of `wasm-pack` which is a bit much for now. To solve this the `--browser` flag is going back to what it represents on the current released version of `wasm-bindgen` (optimize away some node.js checks in a few places for bundler-style output) and a new `--web` flag is being introduced as the new deployment strategy. [RFC 6]: https://github.com/rustwasm/rfcs/pull/6 Closes #1318 --- crates/cli-support/src/js/mod.rs | 20 ++++++------ crates/cli-support/src/lib.rs | 31 +++++++++++++------ crates/cli/src/bin/wasm-bindgen.rs | 5 ++- .../without-a-bundler-no-modules/README.md | 4 +-- .../without-a-bundler-no-modules/index.html | 4 +-- examples/without-a-bundler/README.md | 2 +- examples/without-a-bundler/build.sh | 4 +-- guide/src/examples/without-a-bundler.md | 8 ++--- guide/src/reference/cli.md | 23 ++++++++++---- guide/src/reference/deployment.md | 10 +++--- guide/src/reference/js-snippets.md | 2 +- 11 files changed, 69 insertions(+), 44 deletions(-) diff --git a/crates/cli-support/src/js/mod.rs b/crates/cli-support/src/js/mod.rs index ec0c10d8cfe1..10552295bdb6 100644 --- a/crates/cli-support/src/js/mod.rs +++ b/crates/cli-support/src/js/mod.rs @@ -166,7 +166,7 @@ impl<'a> Context<'a> { format!("__exports.{} = {};\n", name, contents) } } - OutputMode::Bundler + OutputMode::Bundler { .. } | OutputMode::Node { experimental_modules: true, } => { @@ -178,7 +178,7 @@ impl<'a> Context<'a> { format!("export const {} = {};\n", name, contents) } } - OutputMode::Browser => { + OutputMode::Web => { // In browser mode there's no need to export the internals of // wasm-bindgen as we're not using the module itself as the // import object but rather the `__exports` map we'll be @@ -202,7 +202,7 @@ impl<'a> Context<'a> { }; self.global(&global); - if self.config.mode.browser() { + if self.config.mode.web() { self.global(&format!("__exports.{} = {0};", name)); } } @@ -300,7 +300,7 @@ impl<'a> Context<'a> { } /// Performs the task of actually generating the final JS module, be it - /// `--no-modules`, `--browser`, or for bundlers. This is the very last step + /// `--no-modules`, `--web`, or for bundlers. This is the very last step /// performed in `finalize`. fn finalize_js(&mut self, module_name: &str, needs_manual_start: bool) -> (String, String) { let mut js = String::new(); @@ -340,7 +340,7 @@ impl<'a> Context<'a> { // With Bundlers and modern ES6 support in Node we can simply import // the wasm file as if it were an ES module and let the // bundler/runtime take care of it. - OutputMode::Bundler + OutputMode::Bundler { .. } | OutputMode::Node { experimental_modules: true, } => { @@ -354,7 +354,7 @@ impl<'a> Context<'a> { // browsers don't support natively importing wasm right now so we // expose the same initialization function as `--no-modules` as the // default export of the module. - OutputMode::Browser => { + OutputMode::Web => { js.push_str("const __exports = {};\n"); self.imports_post.push_str("let wasm;\n"); init = self.gen_init(&module_name, needs_manual_start); @@ -752,10 +752,10 @@ impl<'a> Context<'a> { })?; self.bind("__wbindgen_module", &|me| { - if !me.config.mode.no_modules() && !me.config.mode.browser() { + if !me.config.mode.no_modules() && !me.config.mode.web() { bail!( "`wasm_bindgen::module` is currently only supported with \ - --no-modules" + --no-modules and --web" ); } Ok(format!( @@ -2843,13 +2843,13 @@ impl<'a, 'b> SubContext<'a, 'b> { if is_local_snippet { bail!( "local JS snippets are not supported with `--no-modules`; \ - use `--browser` or no flag instead", + use `--web` or no flag instead", ); } if let decode::ImportModule::Named(module) = &import.module { bail!( "import from `{}` module not allowed with `--no-modules`; \ - use `--nodejs`, `--browser`, or no flag instead", + use `--nodejs`, `--web`, or no flag instead", module ); } diff --git a/crates/cli-support/src/lib.rs b/crates/cli-support/src/lib.rs index 6bd78e7ceaa1..3caca5fa10c6 100755 --- a/crates/cli-support/src/lib.rs +++ b/crates/cli-support/src/lib.rs @@ -36,8 +36,8 @@ pub struct Bindgen { } enum OutputMode { - Bundler, - Browser, + Bundler { browser_only: bool }, + Web, NoModules { global: String }, Node { experimental_modules: bool }, } @@ -59,7 +59,7 @@ impl Bindgen { Bindgen { input: Input::None, out_name: None, - mode: OutputMode::Bundler, + mode: OutputMode::Bundler { browser_only: false }, debug: false, typescript: false, demangle: true, @@ -93,7 +93,7 @@ impl Bindgen { fn switch_mode(&mut self, mode: OutputMode, flag: &str) -> Result<(), Error> { match self.mode { - OutputMode::Bundler => self.mode = mode, + OutputMode::Bundler { .. } => self.mode = mode, _ => bail!( "cannot specify `{}` with another output mode already specified", flag @@ -126,9 +126,9 @@ impl Bindgen { Ok(self) } - pub fn browser(&mut self, browser: bool) -> Result<&mut Bindgen, Error> { - if browser { - self.switch_mode(OutputMode::Browser, "--browser")?; + pub fn web(&mut self, web: bool) -> Result<&mut Bindgen, Error> { + if web { + self.switch_mode(OutputMode::Web, "--web")?; } Ok(self) } @@ -145,6 +145,16 @@ impl Bindgen { Ok(self) } + pub fn browser(&mut self, browser: bool) -> Result<&mut Bindgen, Error> { + if browser { + match &mut self.mode { + OutputMode::Bundler { browser_only } => *browser_only = true, + _ => bail!("cannot specify `--browser` with other output types"), + } + } + Ok(self) + } + pub fn no_modules_global(&mut self, name: &str) -> Result<&mut Bindgen, Error> { match &mut self.mode { OutputMode::NoModules { global } => *global = name.to_string(), @@ -660,15 +670,16 @@ impl OutputMode { fn always_run_in_browser(&self) -> bool { match self { - OutputMode::Browser => true, + OutputMode::Web => true, OutputMode::NoModules { .. } => true, + OutputMode::Bundler { browser_only } => *browser_only, _ => false, } } - fn browser(&self) -> bool { + fn web(&self) -> bool { match self { - OutputMode::Browser => true, + OutputMode::Web => true, _ => false, } } diff --git a/crates/cli/src/bin/wasm-bindgen.rs b/crates/cli/src/bin/wasm-bindgen.rs index 4cea6086bac5..03f025c99693 100644 --- a/crates/cli/src/bin/wasm-bindgen.rs +++ b/crates/cli/src/bin/wasm-bindgen.rs @@ -22,7 +22,8 @@ Options: --out-dir DIR Output directory --out-name VAR Set a custom output filename (Without extension. Defaults to crate name) --nodejs Generate output that only works in node.js - --browser Generate output that only works in a browser + --web Generate output that only works in a browser + --browser Hint that JS should only be compatible with a browser --no-modules Generate output that only works in a browser (without modules) --no-modules-global VAR Name of the global variable to initialize --typescript Output a TypeScript definition file (on by default) @@ -41,6 +42,7 @@ Options: struct Args { flag_nodejs: bool, flag_browser: bool, + flag_web: bool, flag_no_modules: bool, flag_typescript: bool, flag_no_typescript: bool, @@ -89,6 +91,7 @@ fn rmain(args: &Args) -> Result<(), Error> { let mut b = Bindgen::new(); b.input_path(input) .nodejs(args.flag_nodejs)? + .web(args.flag_web)? .browser(args.flag_browser)? .no_modules(args.flag_no_modules)? .debug(args.flag_debug) diff --git a/examples/without-a-bundler-no-modules/README.md b/examples/without-a-bundler-no-modules/README.md index 4747e2909b55..891d84795fbe 100644 --- a/examples/without-a-bundler-no-modules/README.md +++ b/examples/without-a-bundler-no-modules/README.md @@ -14,8 +14,8 @@ and then opening `index.html` in a browser should run the example! Note that this example is in contrast to the [without a bundler][wab] example which performs a similar purpose except it uses `--no-modules` instead of -`--browser`. The main difference here is how the shim JS and module are loaded, -where this example uses old-school `script` tags while `--browser` uses ES +`--web`. The main difference here is how the shim JS and module are loaded, +where this example uses old-school `script` tags while `--web` uses ES modules. [wab]: https://github.com/rustwasm/wasm-bindgen/tree/master/examples/without-a-bundler diff --git a/examples/without-a-bundler-no-modules/index.html b/examples/without-a-bundler-no-modules/index.html index 7d4e194abd1a..63d3e4df3b1a 100644 --- a/examples/without-a-bundler-no-modules/index.html +++ b/examples/without-a-bundler-no-modules/index.html @@ -7,8 +7,8 @@