ComponentizeJS icon indicating copy to clipboard operation
ComponentizeJS copied to clipboard

Compile components without a JS runtime

Open sandstrom opened this issue 9 months ago • 2 comments

Summary

For certain scenarios, it would be great if we could create WebAssembly Components from JS/ESM with this library, without requiring a JS runtime.

Background

If a backend service written in Python or Ruby would like to take an input string of Javascript, precompile a wasm component, and then run it using a Wasmtime host for Python or Ruby, needing a full JS runtime to do the compilation step will complicate things in that backend host.

Proposal

With the current trend that a lot of JS tooling is also available in Rust (Biome, Oxc, Rolldown, etc), would it be possible to see this project as a two-layer library?

The lower layer is implemented in Rust (maybe using existing ecosystem tools where available) to bundle and compile the JS code into a WebAssembly Component, and the higher layer would be bindings to the lower layer.

Those higher-layer bindings might be JS, which would give the end result of this project (lower layer + higher level), but those bindings might also be written in Python or Ruby, to pair with e.g. Wasmtime-Py or Wasmtime-Rb.

Let me know if I should elaborate!

sandstrom avatar Feb 24 '25 09:02 sandstrom

Sorry for not replying to this earlier!

I do agree that this would make sense, yes. Unfortunately it's a pretty tall order, for two reasons:

  1. much of the logic is written in JS, which would have to be ported
  2. we still need some native application that can invoke the tools involved—in particular wizer

All of this is in principle solvable, but hard to make a priority for the time being.

tschneidereit avatar Jun 25 '25 13:06 tschneidereit

First, thanks for responding!

I totally understand this isn't top priority right now.

Regarding 1; wouldn't it mostly be just rewriting src/componentize.js in Ruby/Python? Or are there large JS modules being imported that would also need rewriting?

Regarding 2; yes, totally makes sense! But for a Python or Ruby app, it would still remove the dependency on a JS toolchain to deploy/run the app, which would be a big win!

sandstrom avatar Jun 25 '25 14:06 sandstrom