Skip to content

Conversation

@jkelleyrtp
Copy link
Member

@jkelleyrtp jkelleyrtp commented Feb 4, 2025

Implements router-based wasm bundle splitting under an experimental flag --experimental-wasm-split.

The main implementation fits in a single file, which I think is necessary to keep the code maintainable given its inherent complexity.


Takes a similar approach to https://github.com/jbms/wasm-split-prototype but does not manually encode wasm modules.

The original prototype is (imo) a bit too complex. The approach in this PR simply trims away portions of the modules and then uses the export/import map to connect them together. The only "indirect functions" we create are simply the functions at the #[wasm_split] boundaries.

I've tested everything against the harness, however I'd like to test it against the docsite which requires full dioxus-cli integration.

Everything is implemented (data section splitting, shared chunk extraction, lazy-loading, etc)


Todo:

  • wire up into the CLI
  • wire up into the router (ideally with help from @ealmloff)
  • Re-enable chunking
  • Documentation

@jkelleyrtp jkelleyrtp marked this pull request as ready for review February 13, 2025 03:42
@jkelleyrtp jkelleyrtp requested a review from a team as a code owner February 13, 2025 03:42
@jkelleyrtp jkelleyrtp merged commit bdeedc1 into main Feb 14, 2025
17 checks passed
@jkelleyrtp jkelleyrtp deleted the jk/bundle-splitting branch February 14, 2025 02:54
AnteDeliria pushed a commit to AnteDeliria/dioxus that referenced this pull request Jun 2, 2025
* 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
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.

2 participants