angular / angular/components

feat(cdk/scrolling): Integrate Pretext Library for Precise Text Measurement in Auto-Size Virtual Scroll

Ouverte
#33,011 1 commentaire 5 réactions 0 personnes assignées Voir sur GitHub
area: cdk/scrolling feature P4
Langage dominant
TypeScript
Étoiles
25k
Forks
6.8k
Merge moyen
1 j 8 h
PR mergées (30 j)
91

Description

### 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:

1. **Reflow overhead**: Must render elements first before measuring, triggering expensive layout reflows
2. **Inaccurate predictions**: Averaging-based estimation can be imprecise for heterogeneous content, especially variable-height text items
3. **Performance bottlenecks**: Frequent DOM measurements during scrolling impact performance
4. **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 `getBoundingClientRect` and `offsetHeight`
- **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:

1. **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

2. **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

3. **Performance optimization**:
- Cache `PreparedText` objects for reuse during resize events
- Only re-run `layout()` (the cheap 0.09ms operation) when container width changes

### 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_

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par AutoSizeVirtualScrollStrategy et son ItemSizeAverager, puis examinez les API prepare() et layout() proposées de Pretext ainsi que les différences entre les éléments riches en texte et les mises en page complexes. Définissez le périmètre de l’intégration, le comportement de repli et la validation nécessaire pour démontrer un dimensionnement précis sans régressions.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
angular, typescript
Domaine
frontend, performance
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
Calme
Clarté
À clarifier
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.