Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch from trunk to bevy run web #312

Open
wants to merge 11 commits into
base: main
Choose a base branch
from

Conversation

TimJentzsch
Copy link

@TimJentzsch TimJentzsch commented Sep 29, 2024

Objective

Closes #297.

This PR prepares the project to use the Bevy CLI, mainly the bevy run command.
It simplifies especially running for the web target, which previously required use of trunk (and a bunch of additional configuration).

Solution

  • Remove custom web assets. Use the defaults provided by Bevy CLI instead.
  • Remove custom compilation profiles for the web build. The CLI will automatically use custom web and web-release profiles which use sensible defaults for web builds.
  • Adjust the release CI workflow to use the Bevy CLI with --bundle instead of trunk.
  • Update the README to use Bevy CLI instead of trunk.

Note that this introduces a "regression" to the user that they now have to specify --no-default-features, which was automatically passed to trunk.
I created TheBevyFlock/bevy_cli#250 so we can do that in Bevy CLI as well.

Testing

  1. Install the Bevy CLI:
    cargo install --git https://github.com/TheBevyFlock/bevy_cli --locked bevy_cli
    
  2. Checkout this branch: gh pr checkout 312 (with the GitHub CLI)
  3. Run the app in the browser:
    bevy run --no-default-features web --open
    

TimJentzsch added a commit to TheBevyFlock/bevy_cli that referenced this pull request Oct 3, 2024
Add a `bevy run` command which conveniently runs your Bevy app.

It mostly wraps `cargo run`, but also provides a `web` sub command,
which makes it a lot easier to target the browser.

This option will compile your app for WASM, create JS bindings, add an
`index.html` file if you don't provide one yourself and serves the build
locally to open it in your browser.
The default `index.html` file is mostly what we had in
`bevy_quickstart`.

This is the last part of #24.
Closes #8.

# Testing

1. Checkout the `bevy-run` branch.
2. Run `cargo install --path .` to install this version of the Bevy CLI.
3. Navigate to your Bevy app.
4. Run `bevy run web`.

Note that your app must be compatible with WASM. If you have features or
profiles enabled by default which are not compatible with WASM, you need
to disable them. E.g. `bevy run --no-default-features web`.
If you have a custom `index.html` configured for `trunk`, it might also
not work out of the box. You can try removing the entire `web` folder to
try the default setup.

A good example project is of course `bevy_new_2d`, which you can test on
this branch: <TheBevyFlock/bevy_new_2d#312>
TimJentzsch added a commit to TheBevyFlock/bevy_cli that referenced this pull request Dec 29, 2024
# Objective

Closes #196, unblocks
<TheBevyFlock/bevy_new_2d#312>.

With `wasm-opt`, we can further increase the performance and reduce the
file size of the Wasm binary we use for web builds.
This speeds ups the app both in-game and the loading times.

# Solution

As a simple first solution, we add a hard-coded size optimization pass
in release mode.
In future PRs, we can make this more configurable.

To the user, we log the time the optimization took as well as the file
size reduction as percentage.

This is behind the `wasm-opt` feature flag (currently disabled by
default), to give the user a way to turn this off and because this
increases compile times of the CLI quite a bit.
BD103 pushed a commit to TheBevyFlock/bevy_cli that referenced this pull request Dec 29, 2024
# Objective

Closes #68.

Adds the `--bundle` argument to the `bevy build web` and `bevy run web`
commands.
This will pack all files needed for the web into a single folder.
The location of the bundle will be `target/bevy_web/{profile}/{binary}`.

This makes it a lot easier to deploy the app e.g. on itch.io or a
generic web server.
It also unblocks the switch from `trunk` to the Bevy CLI for the Bevy 2D
template: <TheBevyFlock/bevy_new_2d#312>.

# Solution

- Add the `--bundle` option to the build and run web commands.
- Create a new `WebBundle` enum, which can represent a linked or packed
bundle:
- A linked bundle is what we use by default, which is optimized for dev.
It keeps e.g. the asset folder and WASM artifacts in their place to
avoid duplication and copy operations. When running the app, the local
web server will "link" together all the files and folders needed to run
the app.
- A packed bundle is a folder that contains all the necessary web
artifacts. They will be copied in the directory. This option is most
useful to deploy the web app.
@TimJentzsch
Copy link
Author

Current status:

  • Release CI needs testing (for web), @benfrankel do you know an easy way to do that?
  • Web sound is not working yet locally. Warning in console:
    An AudioContext was prevented from starting automatically. It must be created or resumed after a user gesture on the page.
    

@benfrankel
Copy link
Collaborator

benfrankel commented Jan 25, 2025

Release CI needs testing (for web), @benfrankel do you know an easy way to do that?

The release workflow can be triggered manually, but not from a PR, I believe. There are a few options:

  1. Merge this PR once it's ready and been reviewed, then test the release CI and make a fix PR if necessary.
  2. Merge this PR in a temporary branch and run the release CI there.
  3. Run the release CI in a fork.

@TimJentzsch
Copy link
Author

The audio will be fixed by TheBevyFlock/bevy_cli#249.

@TimJentzsch
Copy link
Author

@benfrankel This should be ready now.

For the CI I'm still uncertain if it already works as expected, but I'm fine with the options you proposed.
Option 1 is probably the easiest, but also with a bit of risk. But I guess it wouldn't break the already deployed version, so it's not that big of a deal.

BD103 pushed a commit to TheBevyFlock/bevy_cli that referenced this pull request Jan 29, 2025
# Objective

The script for restarting the audio context for web apps didn't work.
This resulted in the app not getting any audio.

# Solution

The fix is simple: The script for restarting the audio context needs to
be called _before_ the app is loaded, I assume to ensure that the
creation of the audio context is tracked correctly.

# Testing

You can test it on the current prototype of the [`bevy_new_2d`
port](TheBevyFlock/bevy_new_2d#312).

Compare `bevy run --no-default-features web --open` with the current
`main` and this branch.
This branch should have sound when you click the buttons.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Switch from Trunk to bevy run web
2 participants