Hacker News new | ask | show | jobs
by silvajoao 568 days ago
https://windowjs.org is a very similar concept -- it wraps Skia and exposes it as the Canvas API, but also embeds v8 for a very small runtime instead of using Node.

It was my first open-source project, released about 3 years ago.

I had plans to also expose WebGL, audio, etc and make it a viable platform for Javascript-based games on desktop.

Life and other projects happened instead, and development was discontinued. Happy to see this project also making Canvas accessible outside the browser!

2 comments

That’s pretty cool! But v8 alone kind of sucks unless you specifically want isolation. Sometimes you just want to make a network request, you know?
That makes total sense in many applications, including games.

The idea was to have TCP sockets and Websockets to enable that.

Basically, have the same APIs you're familiar with in a Browser, but in a much smaller package that you can ship independently of the Browser.

(this is very similar to Electron)

> Sometimes you just want to make a network request

In a drawing tool / library?

That's just asking for trouble. By spec, SVG allows for XXE shenanigans. I'd rather not worry that any image file I process might exfiltrate my data.

Amazing project!

> but also embeds v8 for a very small runtime instead of using Node.

By how much does embedding just V8 instead of using Node.js decrease the binary size? Node.js uses V8, does most of Node's binary size come from its runtime and not V8?

I tried browsing the website and GitHub repo to find how many kBs or MBs typically is a Window.js binary, but didn't find an answer.

See the binary sizes in the (obsolete) releases page:

https://github.com/windowjs/windowjs/releases

About 8 MiB in the end. Note that these builds have a binary trimmed by UPX.

Wow, 8 MiB, that's impressively small IMO. I expected a program that embeds V8 (let alone also having windowing and Skia) to have a binary size much bigger. something closer to Node's or Deno's binary size 40MiB+.

Using the Window.js approach of embedding V8, instead of using a windowing library + a Skia Canvas library in Node.js ─really makes sense if you would like to keep the binary size minimally small and only pay for the libraries/modules you actually pull in and use, instead of having them statically linked in the binary by default. For example, an offline app/game that doesn't use the network doesn't need to have a "net" or "http" module in the binary. These may be bad examples though, I don't know how much do those Node runtime modules constitute out of the final Node binary, it may be an insignificant fraction.