Files
dioxus/packages/wasm-split/wasm-split-cli/src/__wasm_split.js
T
Jonathan Kelley bdeedc13eb 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
2025-02-13 18:54:38 -08:00

64 lines
1.6 KiB
JavaScript

// when running the harness we need to make sure to uncommon this out...
export function makeLoad(url, deps, fusedImports, initIt) {
let alreadyLoaded = false;
return async (callbackIndex, callbackData) => {
await Promise.all(deps.map((dep) => dep()));
if (alreadyLoaded) return;
try {
const response = await fetch(url);
const initSync = initIt || window.__wasm_split_main_initSync;
const mainExports = initSync(undefined, undefined);
let imports = {
env: {
memory: mainExports.memory,
},
__wasm_split: {
__indirect_function_table: mainExports.__indirect_function_table,
__stack_pointer: mainExports.__stack_pointer,
__tls_base: mainExports.__tls_base,
memory: mainExports.memory,
},
};
for (let mainExport in mainExports) {
imports["__wasm_split"][mainExport] = mainExports[mainExport];
}
for (let name in fusedImports) {
imports["__wasm_split"][name] = fusedImports[name];
}
let new_exports = await WebAssembly.instantiateStreaming(
response,
imports
);
alreadyLoaded = true;
for (let name in new_exports.instance.exports) {
fusedImports[name] = new_exports.instance.exports[name];
}
if (callbackIndex !== undefined) {
mainExports.__indirect_function_table.get(callbackIndex)(
callbackData,
true
);
}
} catch (e) {
console.error(
"Failed to load wasm-split module",
e,
url,
deps,
fusedImports
);
return;
}
};
}
let fusedImports = {};