* 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
64 lines
1.6 KiB
JavaScript
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 = {};
|