feat: router-based wasm bundle splitting (#3683)

* feat: wasm-split base implementation

* kinda sorta works with the cli

* okay great it actually works

* fix: cache busting for chunks

* cleaned up version

* it works with the router

* wip: migrate to a faster linear solution using id remapping

* add a good harness

* it works completely on the docsite

* the super tight build works too

* make parallelizable

* works on the docsite but not the harness

* light cleanups, fix for both harness and docsite

* make codegen smaller by extract some shared functions to prevent monos

* chunking works, but tbd on tuning heuristics

* extract used module

* wip: cleaning up module

* wip: much better understanding of how imports work

* fix the call graph

* working again...

* wip: thinking about ifuncs

* ifunc approach works

* yes the ifunc approach works!!

* it all works completely even with chunks

* small cleanups

* comments

* actually locate all of the symbols

* clean up final implementation

* clean up tomls, revert some mono changs

* clean up, add some more comments / docs in places

* hoist more packages

* clean up impl a bit more

* clean cli

* move harness to playwright

* update playwright

* extract codgen

* add lazy to components

* Add docs to split loader

* clippy

* typos

* clippy, don't generate splits if not on wasm

* whoops, const

* Typos and docs

* enable optimizations in ci

* add optimizations to ci

* add wasm-split router feature

* parallel playwright?

* fix no case check

* disable pre-compress... think that might be the issue

* better logging, no default pre-compress, caching of shared symbols
* Fix: compressing assets

* fix non-interactive logging for serve

* cache playwright even on failure, use the cli with optimizations

* fix prebuild

* fix playwright webserver
This commit is contained in:
Jonathan Kelley authored and GitHub committed 2025-02-13 18:54:38 -08:00
1 parent 14eb7597df
commit bdeedc13eb
59 files changed
+4249 -299

No files matched your search

+17
View File
@@ -0,0 +1,17 @@
[package]
name = "dioxus-config-macros"
edition = "2021"
version.workspace = true
authors = ["Dioxus Labs"]
description = "Macros used internally by codegen"
license = "MIT OR Apache-2.0"
repository = "https://github.com/DioxusLabs/dioxus/"
homepage = "https://dioxuslabs.com"
keywords = ["web", "desktop", "mobile", "gui", "wasm"]
rust-version = "1.79.0"
[dependencies]
[features]
default = []
wasm-split = []
+15
View File
@@ -0,0 +1,15 @@
# Dioxus Config Macros
These macros are used internally by codegen and are not intended for general use.
Dioxus will export its feature flags into this crate, allowing downstream codegen to use them under the "dioxus" namespace.
## License
This project is licensed under the [MIT license].
[mit license]: https://github.com/dioxuslabs/dioxus/blob/main/LICENSE-MIT
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in Dioxus by you shall be licensed as MIT without any additional
terms or conditions.
+39
View File
@@ -0,0 +1,39 @@
/// A macro for deciding whether or not to split the wasm bundle.
/// Used by the internal router-macro code. The contents here are considered to be semver exempt.
///
/// Only on wasm with the wasm-split feature will we prefer the `maybe_wasm_split` variant that emits
/// the "lefthand" tokens. Otherwise, we emit the non-wasm_split tokens
#[doc(hidden)]
#[cfg(all(feature = "wasm-split", target_arch = "wasm32"))]
#[macro_export]
macro_rules! maybe_wasm_split {
(
if wasm_split {
$left:tt
} else {
$right:tt
}
) => {
$left
};
}
/// A macro for deciding whether or not to split the wasm bundle.
/// Used by the internal router-macro code. The contents here are considered to be semver exempt.
///
/// Only on wasm with the wasm-split feature will we prefer the `maybe_wasm_split` variant that emits
/// the "lefthand" tokens. Otherwise, we emit the non-wasm_split tokens
#[doc(hidden)]
#[cfg(any(not(feature = "wasm-split"), not(target_arch = "wasm32")))]
#[macro_export]
macro_rules! maybe_wasm_split {
(
if wasm_split {
$left:tt
} else {
$right:tt
}
) => {
$right
};
}