Pular para o conteúdo
Djalma Jr.
Portfólio

Frame

Uma arquitetura de micro-frontend que compõe aplicações web independentes em um único shell, com um SDK tipado sobre Web Components, iframes e postMessage.

Ver projeto →

Entregue um produto como um único shell polido, mas construa-o como várias aplicações pequenas, cada uma com seu time dono de ponta a ponta. O Frame é a arquitetura de micro-frontend que torna isso possível: uma página hospedeira compõe aplicações web independentes em uma única experiência, e um SDK tipado mantém os dois lados conversando — sem nunca compartilhar um bundle. Publicado como @zomme/frame, é o shell de micro-frontends do Buntime.

O problema que ele resolve

Dividir um frontend em aplicações independentes normalmente significa abrir mão do isolamento ou da integração. Compartilhe um bundle e a atualização de um time quebra o build de outro; isole tudo em iframes e você perde a comunicação tipada e bidirecional que um produto de verdade exige. O Frame mantém os dois: cada aplicação continua um deploy separado por trás de um iframe, enquanto um canal tipado deixa hospedeira e filha trocarem props, chamarem métodos e trocarem eventos como se fossem uma só aplicação.

Como funciona

flowchart LR
  host["Host page · z-frame"] -->|"props · theme · apiUrl"| child["Embedded app · frame SDK"]
  child -->|"events · emit (postMessage)"| host

A hospedeira declara um elemento <z-frame> apontando para uma aplicação filha, define props, chama métodos e escuta eventos. A filha importa o SDK, se inicializa, lê suas props (incluindo callbacks) e emite ou escuta de volta para a hospedeira.

// Página hospedeira
const frame = document.querySelector("z-frame");
frame.apiUrl = "https://api.example.com";
frame.theme = "dark";
frame.onSuccess = user => console.log("criado", user);

frame.addEventListener("ready", () =>
  frame.emit("theme-change", { theme: "dark" })
);
frame.addEventListener("user-created", e => console.log(e.detail));

// Aplicação filha
import { frameSDK } from "@zomme/frame/sdk";

await frameSDK.initialize();
frameSDK.props.onSuccess({ id: 1 });
frameSDK.on("theme-change", ({ theme }) => applyTheme(theme));
frameSDK.watch(["apiUrl", "theme"], changes => reconfigure(changes));
frameSDK.emit("user-created", { id: 1 });
<z-frame
  name="admin"
  src="https://apps.example.com/admin"
  base="/admin"
></z-frame>

O que você ganha

Stack

Um monorepo Bun em TypeScript, com aplicações de exemplo (incluindo Vue) compiladas para bundles estáticos — prova de que a hospedeira permanece agnóstica de framework enquanto cada filha escolhe o seu.

Disponibilidade

Open source sob a licença Apache 2.0.