Taffy: Een high-performance UI-layoutbibliotheek aangedreven door Rust

Momenteel implementeert de bibliotheek de layout-algoritmen voor CSS Block, Flexbox en CSS Grid. Ondersteuning voor andere paradigma's is gepland; voor meer informatie over dit en andere toekomstige ontwikkelingsplannen kan worden verwezen naar de roadmap-issue.

Deze crate is een collaboratief project tussen verschillende teams en is ontworpen om te worden gebruikt als afhankelijkheid (dependency) voor andere UI- en GUI-bibliotheken.

Projecten die Taffy gebruiken

Op dit moment wordt Taffy ingezet door onder andere:

  • Servo: een alternatieve webbrowser.
  • Blitz: een radicaal modulaire webengine.
  • Bevy: een ergonomische, ECS-first Rust game-engine.
  • Takumi: rendert React-componenten naar afbeeldingen.
  • iocraft: voor het maken van prachtige interfaces voor de terminal.
  • Slint: een declaratieve GUI-toolkit voor het bouwen van native gebruikersinterfaces.
  • Lapce: de teksteditor, via het Floem UI-framework.
  • Zed: de teksteditor, via het GPUI UI-framework.

Gebruik

use taffy::prelude::*;

// Maak eerst een instantie van TaffyTree
let mut tree : TaffyTree<()> = TaffyTree::new();

// Maak een boom van nodes met behulp van `TaffyTree.new_leaf` en `TaffyTree.new_with_children`.
// Deze functies geven beide een node-id terug waarmee naar die node verwezen kan worden.
// De Style-struct wordt gebruikt om stylinginformatie op te geven.
let header_node = tree
.new_leaf(
Style {
size: Size { width: length(800.0), height: length(100.0) },
..Default::default()
},
).unwrap();

let body_node = tree
.new_leaf(
Style {
size: Size { width: length(800.0), height: auto() },
flex_grow: 1.0,
..Default::default()
},
).unwrap();

let root_node = tree
.new_with_children(
Style {
flex_direction: FlexDirection::Column,
size: Size { width: length(800.0), height: length(600.0) },
..Default::default()
},
&[header_node, body_node],
)
.unwrap();

// Roep compute_layout aan op de wortel van de boom om het layout-algoritme uit te voeren
tree.compute_layout(root_node, Size::MAX_CONTENT).unwrap();

// Inspecteer de berekende layout met `TaffyTree.layout`
assert_eq!(tree.layout(root_node).unwrap().size.width, 800.0);
assert_eq!(tree.layout(root_node).unwrap().size.height, 600.0);
assert_eq!(tree.layout(header_node).unwrap().size.width, 800.0);
assert_eq!(tree.layout(header_node).unwrap().size.height, 100.0);
assert_eq!(tree.layout(body_node).unwrap().size.width, 800.0);
assert_eq!(tree.layout(body_node).unwrap().size.height, 500.0); // Deze waarde was niet expliciet ingesteld, maar berekend door Taffy

Bindingen naar andere talen

  • Python via stretchable
  • WIP C-bindingen
  • WIP WASM-bindingen

Leermiddelen

Taffy implementeert de Flexbox- en CSS Grid-specificaties getrouw, waardoor documentatie die voor het web is ontworpen direct vertaalbaar is naar de implementatie van Taffy. Voor referentiedocumentatie over individuele style-eigenschappen raden we de MDN-documentatie aan (bijvoorbeeld de pagina over de width-eigenschap). Dergelijke pagina's zijn meestal te vinden door te zoeken op "MDN [eigenschapsnaam]".

Voor gidsen over CSS-layout raden we de volgende bronnen aan:

Flexbox

  • Flexbox Froggy: een interactieve tutorial/game waarmee je op een leuke manier de essentiële onderdelen van Flexbox leert.
  • A Complete Guide To Flexbox (CSS Tricks): een gedetailleerde gids met illustraties en uitgebreide schriftelijke uitleg over de verschillende Flexbox-eigenschappen en hun werking.

CSS Grid

  • CSS Grid Garden: een interactieve tutorial/game waarmee je op een leuke manier de essentiële onderdelen van CSS Grid leert.
  • A Complete Guide To CSS Grid (CSS Tricks): een gedetailleerde gids met illustraties en uitgebreide schriftelijke uitleg over de verschillende CSS Grid-eigenschappen en hun werking.

Benchmarks (vs. Yoga)

De benchmarks zijn uitgevoerd op een 2021 MacBook Pro met M1 Pro-processor met behulp van criterion.

Belangrijke opmerkingen:

  • De benchmarks meten uitsluitend de berekening van de layout. Het aanmaken van de boom wordt niet meegemeten.
  • De benchmarks voor Yoga zijn uitgevoerd via de yoga crate (Rust-bindingen).
  • De meeste populaire websites lijken tussen de 3.000 en 10.000 nodes te hebben (hoewel zij ook tekstlayout vereisen, iets wat noch Yoga, noch Taffy implementeren).
  • Let op dat de onderstaande tabel verschillende eenheden bevat (milliseconden vs. microseconden).
BenchmarkAantal NodesDiepteYoga (ba27f9d)Taffy (71027a8)
yoga 'huge nested'1.0003364.60 µs329.04 µs
yoga 'huge nested'10.00044.1988 ms4.3486 ms
yoga 'huge nested'100.000545.804 ms38.559 ms
big trees (wide)1.0001737.77 µs505.99 µs
big trees (wide)10.00017.1007 ms8.3395 ms
big trees (wide)100.0001135.78 ms247.42 ms
big trees (deep)4.000122.2333 ms1.7400 ms
big trees (deep)10.000145.9477 ms4.4445 ms
big trees (deep)100.0001776.755 ms63.778 ms
super deep1.0001.000555.32 µs472.85 µs

Bijdragen

Bijdragen zijn welkom:

  • Als je Taffy wilt gebruiken, verbeteren of verder uitbouwen, neem dan gerust contact op, open een issue of dien een PR in.
  • Heb je vragen over hoe je Taffy moet gebruiken? Open dan een discussie, zodat we je vragen kunnen beantwoorden op een manier die ook voor anderen vindbaar is.