Fetching documentation…
Status: future · Priority: medium · Depends on: Forge Renderer (scroll-shift), Performance (layout cost)
Note: This is a future plan, not a commitment. The syntax and API shown here are proposals — they can be completely different when actually implemented.
Every desktop app eventually shows a list that doesn't fit in memory — logs, files, messages, trades, tracks. Rendering all of them is how you turn a 30 MB app into a 3 GB app. Virtualization renders only the visible window plus a small overscan buffer, recycling nodes as you scroll. Every framework users love has this (virtualized lists are why your chat app doesn't die at 50k messages); Morph's list story today is "render everything and hope."
<VirtualList> that stays fast at any length means devs never have to learn windowing to ship a log viewerimport { VirtualList } from 'morph'
<VirtualList
count={messages.length}
rowHeight={56} // fixed fast path
overscan={4} // extra rows above/below the viewport
renderRow={(i) => <MessageRow msg={messages[i]} />}
/>morphState inside rows keys by item, or it will haunt you)morph check guidance — .map() over 10k items without virtualization warns with the conversion; key misuse (the existing mx-key-misuse rule) becomes load-bearing here and errors instead of warning inside virtual lists| Piece | State |
|---|---|
List rendering (.map() templates, keyed reconciliation) |
✅ Shipped |
mx-key-misuse lint |
✅ Shipped |
| Dirty-flag layout skipping | ✅ Shipped |
<VirtualList> element + recycling |
❌ Not built |
| Variable-height measured cache | ❌ Not built |
| Prepend anchoring | ❌ Not built |
morphState inside a recycled row: key by item id automatically, or require explicit keys? (Automatic is friendly; explicit is honest. Probably automatic with an escape hatch.)estimateHeight? (Cache first; estimates lie.)<VirtualList> fixed-height with recycling + overscanmorph check: large-.map() nudge + strict keys inside virtual lists