html5ever Native Addon — Next-Gen Rendering Engine (30–50× schnelleres DOM-Parsing + Parallel-Parsing) #128
Labels
No labels
bug
docs
feature
housekeeping
html-spec
performance
react-compat
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
glow-all/true-headless-browser#128
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
html5ever Native Addon — Next-Gen Rendering Engine
Problembeschreibung
Unser DOM ist spec-konform, 651 Tests bestehen und wir sind bereits schneller als Chrome/FF in unserem Use-Case (kein Layout, synthetische Werte). Aber der HTML5-Parser ist der letzte Engpass:
Problem im Detail
<template>,<svg>,<math>brauchen spezielle Insertion-Modesdocument.write→ eigener TreeBuilder muss suspend/resumeSend + SyncArchitektur-Analyse
Aktuell (TS-only)
Ziel (html5ever via N-API)
Kein JSON-Roundtrip — der TreeSink ruft direkt N-API-Funktionen auf, die in JS THB-Elemente erzeugen.
Option A: napi-rs + html5ever TreeSink (EMPFEHLUNG)
Beschreibung
Wrap html5ever via napi-rs — Rust-Kompilierung zu einer
.node-Shared-Library. Implementiere ein TreeSink-Trait, das jedescreateElement/appendChilddirekt als N-API-Callback aufruft.Vorteile
.nodeBundleNachteile
rustup,cargo)String→ JSString)Code-Skizze
Parallel-Parsing (der eigentliche Game-Changer)
Option B: Wapc + html5ever (Sandboxed)
Beschreibung
html5ever via wapc in einer WebAssembly-Sandbox ausführen.
Vorteile
Nachteile
Option C: C-bindgen + html5ever (C ABI)
Beschreibung
html5ever via C-ABI wrappen (cbindgen → FFI).
Vorteile
Nachteile
⚠️ Technische Risiken
commit()nach N appendChildcatch_unwindum jeden Einstiegspunktcrossparse_fragment()ist in html5ever vorhandenPerformance-Impact
Erwartete Latenz (10019 Corpus, Median-Seite ~150KB)
Speicher
Akzeptanzkriterien
Phase 1: Basis-N-API-Integration
napi-rsProjektstruktur innative/html5ever/parse_html()Funktion kompiliert und lädt in Bun<div>hello</div>wird korrekt als Document returnedPhase 2: TreeSink — Own DOM Integration
Element-Instanzen (keine generischen Nodes)setAttribute()gesetzt<svg>,<math>funktioniertPhase 3: Fragment-Mode + innerHTML
parse_fragment()für innerHTML setter<template>content parsingdocument.write()suspends/resumes korrektPhase 4: Parallel-Parsing
parseHTML()Aufrufe in N Rust-ThreadsPhase 5: Quantitative Benchmarks
Testplan
Unit Tests (30 Tests)
<div><span>text</span></div><table><tr><td>1</td></tr></table><p>a</p><p>b</p><ul><li>A<li>B</ul><a href="x">link</a><br/><hr/><script>alert(1)</script><!DOCTYPE html><!-- comment --><![CDATA[test]]><svg viewBox="0 0 100 100"><circle cx="50"/></svg><math><mi>x</mi></math><template><div>shadow</div></template><div><p>unclosed</div><div>stray close tag<b>bold <i>bold+italic</b> only bold</i>AB&el.innerHTML = el.innerHTMList stable<form><input name="x"></form><select><option>a<option>b</select><style>body { color: red }</style><td>cell</td>auf table<!--> <!-- --> <!--Integration Tests (10 Tests)
Performance Benchmarks (15 Tests)
Betroffene Dateien
native/html5ever/Cargo.tomlnative/html5ever/src/lib.rsnative/html5ever/build.rsnative/html5ever/package.jsonsrc/native/html5ever.tssrc/dom/innerhtml-parser.tssrc/dom/node.tssrc/html/tokenizer.tssrc/html/tree-construction.tstests/unit/html5ever-integration.test.tstests/performance/html5ever-vs-ts.bench.tstests/performance/parallel-parsing.bench.ts.github/workflows/html5ever-build.ymlDependencies
Zeitplan
parse_html()GrundfunktionGesamt: ~18h für vollständige Integration + Tests.
Branch
Dieses Issue referenziert Branch
feat/issue-118-119-dom-perfection(gepusht nachmaster):innerHTML setter,Rendering Pipeline,Resilience Layer,Factory IntegrationDeployment-Hinweise
rustup toolchain install nightlynapi-rsCLI:npm install -g @napi-rs/clicd native/html5ever && npx napi build --releasenpx napi build --platform --releasefür Linux x64 + ARM64.nodenicht lädt → TS-Tokenizer (kein Breaking Change)✅ Implementiert — 5 Phasen abgeschlossen
Branch:
feat/issue-128-html5ever-nativeCommit:
9322184Geliefert
parseHtml()Document ModeparseHtmlFragment()Fragment Modefeat/issue-128-html5ever-nativePerformance
<div>hello<p>(137KB)<span>(166KB)High-Performance Primitive
write!direkt in Buffer, keine intermediate Vec