[HN Gopher] Window.js is an open-source JavaScript runtime for d...
       ___________________________________________________________________
        
       Window.js is an open-source JavaScript runtime for desktop graphics
       programming
        
       Author : EntICOnc
       Score  : 121 points
       Date   : 2022-01-10 12:53 UTC (1 days ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | marwis wrote:
       | Can this be ported to node as a module?
        
         | joaodasilvaz wrote:
         | Not quite, as this is a native program and not a Javascript
         | module.
         | 
         | Window.js is like Node itself, but has different APIs. The main
         | difference is that it gives you a desktop window and the Canvas
         | 2D API, and doesn't have any of Node's networking APIs.
         | 
         | Other differences to Node:
         | 
         | * every source is imported to Window.js as an ES6 module.
         | 
         | * Window.js does not support NPM and doesn't aim to.
         | 
         | * Node uses callbacks for async APIs, Window.js uses Promises
         | 
         | * Node is widely tested and used, Window.js is quite new and
         | experimental :-)
         | 
         | Other projects have built bindings for GLFW for Node. Have a
         | look at the GLFW documentation and search for "node":
         | 
         | https://www.glfw.org/community.html#bindings
        
       | [deleted]
        
       | noduerme wrote:
       | I'm really glad you mentioned PixiJS - that would be a very
       | compelling use case for me! I formerly built a lot of casual 2D /
       | 2.5D games in AIR. Pixi is my favorite screen graph library now
       | by far.
       | 
       | The biggest thing I think the JS/canvas/WebGL ecosystem is really
       | lacking, sorry to say, is the ability to compile to .ipa and
       | .apk, with something like AIR Native Extensions (which worked
       | along the lines of Phonegap plugins to centralize access to
       | Android and iOS APIs in a common library). Cordova is dead and
       | there's no replacement. And Cordova was never really meant for
       | writing games. Something like this with WebGL support that just
       | opened a full screen phone app running PixiJS - even with just
       | minimal connectivity APIs - would be a great option for quickly
       | building indie games.
        
         | melony wrote:
         | React native has Skia support
         | 
         | https://shopify.github.io/react-native-skia/
        
           | noduerme wrote:
           | Yeah... I looked into that a little, but I've always avoided
           | React like the plague. Looking at JSX just drives me up a
           | wall, and I'm not into the idea of the React Native pseudo-
           | DOM. Oddly it feels a little like Flex/MXML which also
           | annoyed me to no end.
        
       | evmar wrote:
       | How does this compare to http://www.plask.org/ ?
        
         | joaodasilvaz wrote:
         | From a quick look at plask.org:
         | 
         | * seems like Plask is only for macOS (Window.js also supports
         | Windows and Linux)
         | 
         | * Plask exposes the Skia APIs directly to Javascript; Window.js
         | exposes a <canvas>-alike API instead (but also based on Skia)
         | 
         | * Plask supports video playback with AVPlayer; Window.js
         | doesn't have video support (for now :-)
        
       | joaodasilvaz wrote:
       | Hi HN, author of windowjs here.
       | 
       | I was planning to have the project in a more complete state
       | before announcing to HN :-)
       | 
       | It was mostly a fun project to put together v8, GLFW and Skia,
       | and I hope others find it useful and fun to work on too.
       | 
       | If you find this interesting then consider getting in touch via
       | GitHub Discussions or the mailing list and helping out with the
       | next features: WebGL 2 API, networking (fetch) API, sound, etc.
       | 
       | I don't have much experience collaborating in opensource projects
       | so any feedback is very welcome. Thanks for having a look!
        
         | matthewfcarlson wrote:
         | I'm curious what the resulting package would look like. Like
         | you're including the v8 runtime but not chrome itself (A la
         | electron). I suspect it would be smaller but no idea how much
         | smaller.
        
           | joaodasilvaz wrote:
           | It's quite a bit smaller though I'm not familiar with how big
           | Electron is nowadays.
           | 
           | The largest part is, by far, v8; I think there's room to
           | remove unused code there.
           | 
           | You can see the size of the binary in the GitHub Actions
           | builds:
           | 
           | https://github.com/windowjs/windowjs/actions
           | 
           | Each build workflow has a "Binary size" step at the end, that
           | outputs the binary size, size after stripping, and size after
           | using UPX.
           | 
           | Here's what the latest build got:
           | 
           | * Windows: 6,639,616 bytes (19,523,072 before UPX)
           | 
           | * macOS: 8,196,112 bytes (23,431,800 before UPX)
           | 
           | * Linux: 8,186,668 bytes (28,679,960 before UPX and
           | stripping, 22,346,264 bytes after stripping)
        
         | modeless wrote:
         | You may already know this, but for WebGL you should use ANGLE.
         | It's what the browsers mostly use and will guarantee
         | compatibility across platforms. Trying to implement the WebGL
         | API over desktop GL yourself will be a never ending black hole
         | of issues.
         | https://chromium.googlesource.com/angle/angle/+/main/README....
        
           | joaodasilvaz wrote:
           | Thanks for the hint!
           | 
           | Do you happen to be familiar with ANGLE? What happens if I
           | just expose GLES 3.0 bindings as WebGL2 based on the native
           | drivers on each platform?
           | 
           | (my earlier understanding was that ANGLE was a WebGL-to-
           | Direct3D translation layer, for compat on Windows.)
        
             | modeless wrote:
             | Most desktop platforms unfortunately don't provide a native
             | GLES driver, so you'd have to translate desktop GL to GLES.
             | This is harder than it sounds, if you care about getting
             | everything right. ANGLE handles that for you. Additionally
             | it contains dozens of workarounds for serious driver issues
             | on various platforms. And implementations of WebGL
             | extensions that differ from GL/GLES extensions.
             | 
             | In addition to all that, it does let you use DirectX on
             | Windows instead of GL (and Metal on Mac and Vulkan
             | wherever). The reason you want that is that many Windows
             | PCs do not have a GL driver installed. Microsoft does not
             | ship one, so if the OEM didn't install one and the user
             | didn't install one then it simply doesn't exist. And even
             | when the GL driver is installed, it is often buggier than
             | the DirectX driver. Similarly on Mac, GL is buggier than
             | Metal (and officially deprecated).
        
               | mikepavone wrote:
               | > Most desktop platforms unfortunately don't provide a
               | native GLES driver, so you'd have to translate desktop GL
               | to GLES.
               | 
               | This is somewhat less true than it used to be since one
               | of the required features of OpenGL 4.3 is GLES 3.0
               | compatibility. Unfortunately, Mac OS is stuck on GL 4.1
               | forever (at least until they drop support completely
               | anyway) and the other points you bring up are quite
               | valid.
        
               | klabb3 wrote:
               | This is very useful info for everyone aspiring to do
               | cross platform graphics, thanks a ton!
        
               | modeless wrote:
               | For new development in native cross platform graphics I
               | would recommend Dawn or wgpu-native as a base instead of
               | GL. That will get you excellent portability with a modern
               | style of API.
        
           | bmitc wrote:
           | Could you say more about this? I'm currently trying to learn
           | in this space, and it was my understanding that Skia already
           | uses or can use ANGEL.
        
         | tylerchilds wrote:
         | Very cool! I'm a web dev and I've wanted to get into game dev.
         | From my cursory glance, this seems like exactly what I'd like
         | to build on top of: just the essentials for a performant
         | interactive application.
         | 
         | My one question: Would it be possible to integrate with SDL2?
         | https://www.libsdl.org/
        
           | joaodasilvaz wrote:
           | libsdl and GLFW are very similar! I ended up using GLFW
           | because it's closer to what I wanted to do with Skia and
           | WebGL, and I didn't need the 2D functionality of SDL.
           | 
           | Note that Window.js does not expose GLFW directly; it exposes
           | APIs that are more similar to the web, for familiarity to web
           | devs.
           | 
           | For example, GLFW has this for mouse input:
           | 
           | https://www.glfw.org/docs/latest/input_guide.html#input_mous.
           | ..
           | 
           | But Window.js wraps that in window.addEventListener and
           | "mousedown" events:
           | 
           | https://windowjs.org/doc/window#window.addEventListener
           | https://windowjs.org/doc/window#event-mousedown
           | 
           | If you give it a try to build a game then keep in mind that
           | it doesn't have a sound API yet, though that's part of the
           | future plans.
           | 
           | Finally, is there something specific in libsdl that you'd
           | like to have and Window.js doesn't support?
        
             | tylerchilds wrote:
             | Awesome! I hadn't heard of GLFW before. My main use case is
             | wanting gamepad support which it looks like GLFW has.
             | 
             | From all my user research, it looks like nothing beats up,
             | down, left, right, confirmation and cancellation actions,
             | so that's all I really need.
             | 
             | Are those gamepad events accessible through
             | addEventListener?
        
               | joaodasilvaz wrote:
               | Not right now. I've just filed an issue to track this:
               | 
               | https://github.com/windowjs/windowjs/issues/19
               | 
               | Window.js replicates web APIs where it makes sense, so
               | I'd look into duplicating the Gamepad API:
               | 
               | https://developer.mozilla.org/en-
               | US/docs/Web/API/Gamepad_API
               | 
               | Does that make sense to you?
        
               | tylerchilds wrote:
               | 100%. Sticking close to web APIs will guarantee the
               | longest shelf life of code written against it. I'm a big
               | fan of Deno rather than Node for the same reasons.
               | 
               | Thanks for building a cool project, I'll definitely be
               | tracking along.
               | 
               | I've been working on something that should be fairly
               | compatible, but I'll need to do a little tweaking on my
               | end for windowjs: https://thelanding.page/tag/
               | 
               | It's basically a reactive client-side library that aims
               | to decouple the necessary UI things like state management
               | and event delegation from the DOM. It's tiny (~300 lines
               | of code iirc). No external dependencies besides a lazy
               | loaded Virtual DOM library that wouldn't be needed in a
               | windowjs environment.
               | 
               | instead of an html function that renders when state
               | changes, i can create a function that can draw on the
               | windowjs canvas, probably on requestAnimationFrame.
        
         | cabalamat wrote:
         | Will there be a TypeScript version?
        
           | joaodasilvaz wrote:
           | I had two ideas for Typescript in mind:
           | 
           | 1. provide type declarations for the Window.js APIs, and
           | 
           | 2. integrate with the Typescript compiler during development
           | (e.g. F5 to reload, run typescript sources "directly", show
           | compiler errors in the console / main window, etc.)
           | 
           | I've just started these discussion on GitHub, please share
           | your thoughts:
           | 
           | https://github.com/windowjs/windowjs/discussions/27
           | 
           | https://github.com/windowjs/windowjs/discussions/28
           | 
           | Does this cover what you had in mind? Are there better ways
           | to support Typescript?
        
           | EMM_386 wrote:
           | I'd be willing to help out putting together a TypeScript
           | version of this depending on what the author wants to do.
        
             | joaodasilvaz wrote:
             | Please do! I've just started discussions to figure out how
             | to do this, please share your thoughts:
             | 
             | https://github.com/windowjs/windowjs/discussions/27
             | 
             | https://github.com/windowjs/windowjs/discussions/28
        
       | udbhavs wrote:
       | Implementing an identical canvas API on skia is an interesting
       | idea. I wonder how the performance is compared to regular web
       | canvas.
        
         | joaodasilvaz wrote:
         | Note that Chrome also builds on Skia, via the Blink rendering
         | engine. So Skia is very well aligned with the needs of the
         | Canvas API.
         | 
         | As for performance, Window.js has a bit less overhead since it
         | doesn't have a DOM and doesn't implement web security.
         | 
         | On the other hand, Chrome is widely used and has a super
         | talented team that knows systems programming, GPU programming,
         | etc in a lot of depth and have spent a ton of time optimizing
         | web APIs. So I wouldn't be surprised if Chrome and Electron
         | have better performance in benchmarks -- this is definitely
         | something to measure!
         | 
         | As an example, this p5js example runs very slowly on Window.js:
         | 
         | https://p5js.org/examples/simulate-smokeparticles.html
         | 
         | The reason is that it's doing something like a getPixel(x, y)
         | call in a loop, which Chrome somehow optimizes; in Window.js
         | this is going to be a roundtrip to the GPU _for each pixel_ ,
         | which is extremely expensive.
         | 
         | (IMO, the right way to implement getPixel based on the Canvas
         | API would be to read all the pixels once via
         | canvas.getImageData)
        
       | [deleted]
        
       | [deleted]
        
       | easrng wrote:
       | This is really cool! Have you thought about exposing a11y APIs?
        
         | joaodasilvaz wrote:
         | What kind of APIs do you have in mind?
         | 
         | Ideally yes, Window.js should make it possible (and easy!) to
         | build fully accessible programs. I don't have much experience
         | in this area though, so I'd have to look for help building this
         | :-)
        
           | easrng wrote:
           | There's AccessKit which would work great if we were a few
           | years in the future and they'd finished their bindings and
           | non-windows implementations. Other than that I don't know of
           | anything cross-platform other than Qt which is rather large.
        
       | nevir wrote:
       | Awesome to see projects like this!
       | 
       | Browsers have a large amount of overlap with operating systems -
       | and with efforts to move more of web tech into userland (web
       | components/etc all starting to rationalize HTML and other layers
       | as being built on top of other more fundamental web APIs, etc)
        
       | gnabgib wrote:
       | The documentation website: https://windowjs.org/ is quite a bit
       | more helpful (especially since almost all of the github links are
       | to that domain). But that would be a dupe of
       | https://news.ycombinator.com/item?id=29865107 (2 days ago, 2pts,
       | 0 comments)
        
       | T3RMINATED wrote:
        
       | apatheticonion wrote:
       | After seeing how pretty Windows 11 applications are, I've been
       | trying to create Windows desktop applications using Go or Rust
       | but I have no idea what the Windows GUI API looks like and am
       | unable to find/create bindings.
       | 
       | Linux's GTK4 is pretty easy to use, it's like vanilla JS and it's
       | easy to get started.
       | 
       | Microsoft made it really hard to get started, and I gave up not
       | long after I started.
        
         | EMM_386 wrote:
         | You will likely need to use the Windows UI Library (WinUI).
         | 
         | Documentation is here:
         | 
         | https://docs.microsoft.com/en-us/windows/apps/winui/winui2/
        
       | AshleysBrain wrote:
       | It looks like a cool project, but... why not use lightweight
       | webviews (WebView2/WKWebView)? Or even the heavyweight
       | Electron/NW.js? These brings you full web API compatibility,
       | extensibility points, and webviews have a small footprint too.
       | What does this project aim to do differently? I don't mean to
       | criticise a hobby project if that's what this is, it's all well
       | and good, I'm just wondering what the thinking is.
        
         | WorldMaker wrote:
         | One immediate comparison that springs to my mind is the Love 2D
         | engine [1], which is a tiny game engine written entirely around
         | Lua scripting (so that Lua includes the full game run loop as
         | well).
         | 
         | Lua is a good scripting language, but it doesn't have the
         | ubiquity of JS (and Love doesn't have the ubiquitous deployment
         | of the modern browser). Also, Lua doesn't have a static type
         | ecosystem (though there are interesting projects like
         | TypescriptToLua [2] exploring that space, but you can from the
         | name they are following/lagging the JS ecosystem here).
         | 
         | There probably is a need to package more browser games as
         | "real" games and a lightweight Canvas-focused approach _could_
         | find a nice like Love, especially if it were easier, for
         | instance, to maybe port to consoles for small /indie game teams
         | than one of the web views or Electron. (Though certainly
         | Microsoft already has a version of WebView2 running on the
         | Xbox.)
         | 
         | [1] https://love2d.org/
         | 
         | [2] https://github.com/TypeScriptToLua/TypeScriptToLua
        
         | joaodasilvaz wrote:
         | Electron is a lot more feature-complete and mature, and that's
         | what should be used for any serious projects indeed :-)
         | 
         | Window.js is a subset; it doesn't include the DOM nor the CSS
         | APIs, nor a lot of web APIs.
         | 
         | Window.js is a tool I wish I had for exploratory 2D (and 3D)
         | programming, without having to install multiple tools, SDKs and
         | runtimes, and without the restrictions that web pages have when
         | it comes to desktop applications. I wanted something like
         | Processing but with more control, or like <canvas> but without
         | all the browser cruft around it, and in a native window.
         | 
         | I think it could be a very useful tool to learn WebGL via
         | webglfundamental.org, for example, and having something that
         | runs on the desktop quickly.
         | 
         | A goal of Window.js is to eventually run Processing (p5.js),
         | Pixi.js, Phaser and Threejs programs, as long as they don't use
         | the DOM too much.
        
           | softfalcon wrote:
           | I am curious how you intend to get ThreeJS (or similar)
           | working without a canvas DOM element?
           | 
           | Isn't that a lot of work? Or is there an obvious way to hook
           | it up that I'm missing?
        
             | joaodasilvaz wrote:
             | Three.js should load and run as long as its usage of
             | window, document, etc works as it expects. So the plan is
             | to have a small loader that prepares the environment that
             | Three.js expects before loading it.
             | 
             | This has already been done for Processing/p5.js:
             | 
             | https://windowjs.org/about/processing
             | 
             | After the initial load, all of the p5.js APIs make
             | CanvasRendering2DContext calls, which Window.js implements
             | natively.
             | 
             | Almost all of the p5.js examples work with this approach,
             | except those that use DOM elements like buttons and
             | sliders. Those elements could also be faked, with some
             | patience :-)
             | 
             | I think it's pretty cool that p5.js scripts can run on a
             | desktop window this way, outside of the browser!
             | 
             | As an aside, I also originally intended to implement an
             | HTML renderer on something like Window.js, and make a
             | "browser from scratch" based on it. Maybe for another
             | day...
        
       ___________________________________________________________________
       (page generated 2022-01-11 23:00 UTC)