diff --git a/Cargo.toml b/Cargo.toml index 3ddcf9e..2a7f490 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -156,3 +156,19 @@ opt-level = 3 [profile.release] opt-level = 3 lto = "thin" + +# Size-focused profile for the browser canvas build (solitaire_web → +# canvas_bg.wasm). Download size is the constraint on the web, not peak +# throughput: fat LTO + one codegen unit + opt-level "s" cut the Bevy wasm +# bundle substantially versus plain release. This is rustc-side sizing only — +# the binaryen pass in build_wasm.sh stays at wasm-opt -O2 because -Oz has +# miscompiled Bevy's render pipeline before (grey screen on first load). +[profile.wasm-release] +inherits = "release" +opt-level = "s" +lto = "fat" +codegen-units = 1 +# No `strip`: on wasm it also removes the target_features custom section, +# which makes wasm-opt reject the module ("all used features should be +# allowed" on trunc_sat). wasm-opt drops the name section in its output +# anyway, so strip buys nothing here. diff --git a/build_wasm.sh b/build_wasm.sh index 995d17d..cff37ab 100755 --- a/build_wasm.sh +++ b/build_wasm.sh @@ -67,7 +67,9 @@ if ! command -v wasm-bindgen &> /dev/null; then fi echo "Building solitaire_web (Bevy WASM app)..." -cargo build --release --target wasm32-unknown-unknown -p solitaire_web +# wasm-release is the size-focused profile (fat LTO, CGU=1, opt-level "s") — +# see [profile.wasm-release] in Cargo.toml. Download size is the constraint. +cargo build --profile wasm-release --target wasm32-unknown-unknown -p solitaire_web echo "Running wasm-bindgen for solitaire_web..." wasm-bindgen \ @@ -75,7 +77,7 @@ wasm-bindgen \ --out-name canvas \ --target web \ --no-typescript \ - "$REPO_ROOT/target/wasm32-unknown-unknown/release/solitaire_web.wasm" + "$REPO_ROOT/target/wasm32-unknown-unknown/wasm-release/solitaire_web.wasm" # Optional size optimisation — Bevy bundles are large (~5-15 MB uncompressed). # wasm-opt passes are skipped silently when the tool is not installed.