Uma DSL de HTML segura para Rust e WebAssembly

Monte HTML em Rust puro.

O Molt oferece um builder fluente e a macro html!, escapa tudo uma vez na entrada e renderiza uma string simples. Zero dependências, cerca de 25 KB de WebAssembly e um site estático que você hospeda em qualquer lugar.

cargo add molt-framework

Licença MIT. Versão 1.x: o que compila hoje continua compilando.

main.rs
use molt::prelude::*;

fn main() {
    let name = "<script>alert(1)</script>";

    let card = div()
        .add_class("card")
        .child(h1().text("Hello, Molt"))
        .child(p().text(name));

    println!("{}", card.render());
    // <div class="card"><h1>Hello, Molt</h1><p>&lt;script&gt;alert(1)&lt;/script&gt;</p></div>
}
Uma página completa em poucas linhas. Rode e você recebe HTML.

Seguro por padrão, pequeno por projeto

Engines de template fazem você lembrar de escapar. Runtimes fazem você entregar quilobytes que ninguém pediu. O Molt não faz nenhuma das duas coisas: ele é só a camada de HTML e se encaixa no resto da sua stack por uma String.

  • Seguro por construção

    Valores de texto e de atributos são escapados uma única vez, onde entram. Uma URL javascript: vira #. Não existe como esquecer.

  • Zero dependências

    O cargo tree nas features padrão mostra uma única crate: o Molt. wasm-bindgen e rayon são opcionais.

  • Builder ou macro

    Use o builder fluente ou a macro html!. A macro expande para as mesmas chamadas do builder, nunca para um segundo caminho de código.

  • Gerador de site estático incluso

    Grave páginas e assets em disco, com sitemap e feed RSS. A saída é HTML puro que você hospeda em qualquer lugar.

  • Auditoria de acessibilidade

    Audite a árvore antes de publicar a página: imagens sem texto alternativo, botões e links sem nome, e mais.

  • Tranquilo sob entrada hostil

    Uma árvore com 100.000 níveis renderiza sem derrubar o processo, e fixtures golden travam a saída byte a byte: mudou a marcação, falhou um teste.

Rápido o bastante para nunca ser o gargalo

Números dos benchmarks e da suíte de testes do próprio projeto, medidos na máquina de desenvolvimento.

  • ≈ 400 µspara renderizar uma lista de 10.000 itens

    Modo compacto, medido com Criterion.

  • ≈ 25 KBde WebAssembly com gzip

    Ative com a feature wasm.

  • 0dependências obrigatórias

    O build padrão é uma única crate.

  • forbidcódigo unsafe

    A crate define unsafe_code como forbid.

Hospedar é a parte fácil

O Molt renderiza uma string e o gerador de site estático grava HTML puro. Não há servidor para manter nem nada para deixar aquecido. Este site foi feito com o próprio Molt.

  1. Rode cargo run e receba uma pasta dist com HTML puro.
  2. Envie o projeto para o GitHub.
  3. Deixe um host estático publicar. Este site usa o AWS Amplify, que compila a cada push.

O mesmo núcleo, no navegador

Compile com wasm-pack e chame o Molt pelo JavaScript. Mesmo renderizador, mesmas regras de escape, cerca de 25 KB com gzip.

Ler o guia de WebAssembly

Compile e depois chame pelo JavaScript.

Terminal
$ cargo install wasm-pack
$ wasm-pack build --target web --features wasm
# writes pkg/molt.js and pkg/molt_bg.wasm
# serve the folder over HTTP, ES modules need it
$ python3 -m http.server
main.js
import init, { element, WDocument } from "./pkg/molt.js";
await init();

const page = new WDocument("en")
  .addBody(element("h1").text("Hello, Molt"))
  .addBody(element("p").text("Same renderer."));

document.body.innerHTML = page.render();

Sua primeira página está a um cargo add de distância

Siga o guia Getting Started ou consulte a referência completa da API no docs.rs.