Portable, secure and lightweight: Wasm runtimes and use-cases

Wey Wey Web - Málaga | November 2023

Natalia Venditto

microfrontend.dev - @anfibiacreativa

Image credit DALL-E3

What makes JavaScript that popular?

© Austin Neil | Unsplash.com

The JavaScript ecosystem is like the Universe...

© Ivana Cajina | Unsplash.com

...hosting 16M developers worldwide.

© NASA | Unsplash.com

From 1.9 billion websites, 98% use JavaScript.​

microfrontend.dev - @anfibiacreativa

const                                            = 49%;

const                                                 = 63%;

pythonDevsWorldwide

javaScriptDevsWorldwide

Natalia Venditto

aka anfibiacreativa

Principal JavaScript DX Lead Microsoft Azure

Google Developer Expert for Angular and Web Technologies (Runtime Performance)

Author of https://microfrontend.dev

2021 Microsoft Most Valuable Professional

010101

 

101010

 

010101

 

AST

Bytes

Optimized Code

Script

PARSER

INTERPRETER

COMPILER

microfrontend.dev - @anfibiacreativa

010101

 

101010

 

010101

 

AST

ByteCode

Machine code

Script

PARSER

INTERPRETER

COMPILER

010101

 

101010

 

microfrontend.dev - @anfibiacreativa

const                                  = [       ,      ,...{}  ]

javaScriptEngines

High performance.

At low level, we perform better.

microfrontend.dev - @anfibiacreativa

© SpaceX | Unsplash.com

8" attention span

just a little patience!

8

(function() {
  let patience = 8;

  function runOutofPatience() {
    patience--;

    if (patience <= 0) {
      clearInterval(secondGone);
      console.log("This site is slow. Bye.");
    } else {
      console.log(`I got this ${patience} left`);
    }
  }

  const secondGone = setInterval(runOutofPatience, 1000);
})();

7

6

5

4

3

2

1

0

Runtime

CLIENT

Clientside Rendering

¿Where?

¿When?

We don't know the system capacity or

connection capabilities, of the user at any time, which can impact latency and code execution at runtime.

Metaframeworks

Frameworks that are built on top of other JavaScript frameworks or libraries, typically offering additional capabilities, like static generation, server side rendering, progressive hydration, etc.

microfrontend.dev - @anfibiacreativa

Runtime

SERVER

Serverside Rendering (SSR)

Typically implement aggressive server-side caching techniques and selective progressive hydration for dynamic areas of content in the HTML.

¿Where?

¿When?

Composable micro-frontends.

Combining or composing statically generated pages or server-side rendered HTML snippets, with dynamic and serialized elements, like state and other computed data.

Can run on the JavaScript main thread or a worker, also with Wasm.

microfrontend.dev - @anfibiacreativa

Local stack.

microfrontend.dev - @anfibiacreativa

Use case.

Pagefind, a Wasm search component.

microfrontend.dev - @anfibiacreativa

WebAssembly

Designed as a portable binary target, fully sand-boxed...it is a web platform standard.

microfrontend.dev - @anfibiacreativa

binary instructions format.

microfrontend.dev - @anfibiacreativa

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

microfrontend.dev - @anfibiacreativa

010101

 

101010

 

010101

 

TOOLCHAIN

Wasm

Wasm imported to JavaScript

Program

010101

 

101010

 

010101

 

TOOLCHAIN

Wasm

Wasm imported to JavaScript

Program

microfrontend.dev - @anfibiacreativa

Imports/Exports

microfrontend.dev - @anfibiacreativa

  (module 
      (import 'env' 'println'func $println (param i32))) 
        (func $hello_world (export  'hello_world') 
          (block $block 
            (call $println 
          (i32.const 0))
        )) 
      (memory 1) 
    (data (i32.const 0)'Hello, Wey Wey Web for UI Lovers') ))
   fetch("hello_world.wasm") 
     .then(response => response.arrayBuffer()) 
     .then(bytes => { 
      const wasmModule = WebAssembly.compile(bytes); 
      const instance = new WebAssembly.Instance(wasmModule, { 
        env: { 
        println: console.log 
      } 
     }); 
     instance.exports.hello_world(); 
    });
  

fetch/instaciate

microfrontend.dev - @anfibiacreativa

   fetch("hello_world.wasm") 
     .then(response => response.arrayBuffer()) 
     .then(bytes => { 
      const wasmModule = WebAssembly.compile(bytes); 
      const instance = new WebAssembly.Instance(wasmModule, { 
        env: { 
        println: console.log 
      } 
     }); 
     instance.exports.hello_world(); 
    });
  

Portability.

Parity between execution contexts.

microfrontend.dev - @anfibiacreativa

Even in the lightbulbs.

© Anthony Indraus | Unsplash.com

microfrontend.dev - @anfibiacreativa

010101

 

101010

 

010101

 

TOOLCHAIN

Wasm

Wasm imported to JavaScript

Program

ADDITIONAL INTERFACES

010101

 

101010

 

010101

 

TOOLCHAIN

Wasm

Wasm imported to JavaScript

Program

microfrontend.dev - @anfibiacreativa

ADDITIONAL INTERFACES

WASI

Modular system inteface built for WebAssembly, outside of the browser, fully compatible with POSIX systems.

It is a standard IN PREVIEW.

microfrontend.dev - @anfibiacreativa

WebAssembly System Interface

microfrontend.dev - @anfibiacreativa

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

010101

 

101010

 

010101

 

It is run in specific runtimes, like Wasmtime.

Isomorphism

Isomorphic apps allow the execution of the same code, in different environments.

 

JavaScript enables both isomorphism and  trisomorphism, leveraging browser and remote workers.

microfrontend.dev - @anfibiacreativa

Demo

 ...shared memories, that can be transfered between the Window and the worker with postMessage()...[].

Composable micro-frontends.

Composable user interfaces of this type, are built or composed remotely, typically in a worker running at the edge of the network (mostly on CDN PoPs very close to the end-user).

microfrontend.dev - @anfibiacreativa

Remote stack.

Security.

Fully type-checked, sand-boxed and memory-safe, within bounds.

microfrontend.dev - @anfibiacreativa

© Piron Guillaume | Unsplash.com

  • Memory Isolation

  • No Direct Pointers (Linear memory)

  • Limited Direct Interaction with Host

Trade-offs?

Sure.

microfrontend.dev - @anfibiacreativa

MORE LAYERS TO DEBUG.

STANDARDS ARE IN PREVIEW.

TOOLCHAINS ARE NOT AVAILABLE OR HAVE PARITY BETWEEN LANGUAGES.

There are more layers to debug to understand the source of an issue.

This new technologies are in preview and hence unstable and prone to change API defs.

Not all the interfaces are available for every

language.

microfrontend.dev - @anfibiacreativa

Development

Specification

Setup

Design

Integration

Delivery

Operations

DEVELOPMENT

DESIGN

DEPLOYMENT

DEV

OPS

ARQ

microfrontend.dev - @anfibiacreativa

Thank you!

@anfibiacreativa - https://www.microfrontend.dev

Bytecode Alliance Javy

WebAssembly.org

Microfrontend.dev

Bjorn3 WASI shim

Wasmtime

Demo

Learn more

Wasm Runtimes: Portable, secure and lightweight

By Natalia Venditto

Wasm Runtimes: Portable, secure and lightweight

  • 254