feat(cdk/scrolling): Integrate Pretext Library for Precise Text Measurement in Auto-Size Virtual Scroll
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Da chiarire
- Stato di attività
- Tranquilla
- Stack tecnologico
- angular, typescript
- Ambito
- frontend, performance
Direzione di ricerca
Inizia con AutoSizeVirtualScrollStrategy e il relativo ItemSizeAverager, quindi esamina le API prepare() e layout() proposte di Pretext e il modo in cui gli elementi ricchi di testo differiscono dai layout complessi. Definisci l’ambito dell’integrazione, il comportamento di fallback e la validazione necessaria per dimostrare un dimensionamento accurato senza regressioni.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Feature Description
Description:
Problem Statement
The current AutoSizeVirtualScrollStrategy implementation relies on ItemSizeAverager to estimate the size of unseen items based on historical measurements. While this approach works for many scenarios, it has several limitations:
- Reflow overhead: Must render elements first before measuring, triggering expensive layout reflows
- Inaccurate predictions: Averaging-based estimation can be imprecise for heterogeneous content, especially variable-height text items
- Performance bottlenecks: Frequent DOM measurements during scrolling impact performance
- Layout shifts: Predictive scrolling may cause visual jumps when estimated sizes differ significantly from actual sizes
Proposed Solution
I'd like to propose integrating the Pretext library (https://github.com/chenglou/pretext) into the auto-size virtual scroll strategy. Pretext is a pure JavaScript/TypeScript library that provides:
- Accurate text measurement without DOM: Calculates text dimensions using pure arithmetic, avoiding
getBoundingClientRectandoffsetHeight - Excellent performance: Benchmarks show
layout()operations at ~0.09ms for 500 texts (hot path) - Comprehensive language support: Handles all languages, emojis, and mixed-bidi text correctly
- Predictive sizing: Enables pre-rendering size calculations for virtual lists
Implementation Ideas
The integration could work as follows:
-
For text-heavy virtual lists:
- When items contain primarily text content with known font/line-height configurations
- Use Pretext's
prepare()+layout()API to calculate heights before rendering - This allows the scroll strategy to know exact item sizes upfront
-
Hybrid approach:
- Use Pretext for text content measurement
- Fall back to current DOM measurement for non-text or complex layouts
- Combine both for maximum accuracy
-
Performance optimization:
- Cache
PreparedTextobjects for reuse during resize events - Only re-run
layout()(the cheap 0.09ms operation) when container width changes
- Cache
Benefits
- Eliminates layout reflow for text measurement in virtual lists
- More accurate scrolling behavior with predictable item sizes
- Better performance especially for long lists with variable-height text items
- Reduced visual jumps during scrolling since sizes are pre-calculated
- Support for all languages and scripts including complex layouts
Example Use Case
- Chat applications with varying message lengths.
- Feeds/Dashboards with dynamic text content.
Use Case
No response
- Lingua principale
- TypeScript
- Stelle
- 25k
- Fork
- 6.8k
- Merge medio
- 1g 1h
- PR unite (30g)
- 84
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di angular/components
-
area: material/tree docs gemini-triaged needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
angular/components#33832 ·
-
area: material/datepicker gemini-triaged P4
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
angular/components#33763 · 2 commenti · 3 reazioni ·
-
area: material/table gemini-triaged P4
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
angular/components#33709 · 1 commento ·
-
area: material/table docs gemini-triaged P4
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
angular/components#33455 ·
-
area: material/core gemini-triaged P3
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
angular/components#33059 · 2 commenti ·
Tutte le issue di angular/components
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
bcgov/bc-wallet-mobile#4761 · 1 commento ·
-
external-issue to-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
-
area-deployment area-integrations triage:bot-seen
Difficoltà 2/5 Mezza giornata Idoneità per principianti 86/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
-
refactor
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100