lazy-render-virtual-scroll 1.13.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +530 -32
- package/dist/cjs/adapters/react/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/adapters/react/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/adapters/react/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/cjs/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/adapters/react/index.d.ts +5 -0
- package/dist/cjs/adapters/react/index.d.ts.map +1 -1
- package/dist/cjs/angular/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/angular/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/angular/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/angular/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/angular/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/cjs/angular/index.d.ts +5 -0
- package/dist/cjs/angular/index.d.ts.map +1 -1
- package/dist/cjs/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +269 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/svelte/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/svelte/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/svelte/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/svelte/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/svelte/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/cjs/svelte/index.d.ts +5 -0
- package/dist/cjs/svelte/index.d.ts.map +1 -1
- package/dist/cjs/vue/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/vue/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/vue/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/vue/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/vue/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/cjs/vue/index.d.ts +5 -0
- package/dist/cjs/vue/index.d.ts.map +1 -1
- package/dist/esm/adapters/react/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/adapters/react/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/adapters/react/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/esm/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/adapters/react/index.d.ts +5 -0
- package/dist/esm/adapters/react/index.d.ts.map +1 -1
- package/dist/esm/angular/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/angular/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/angular/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/angular/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/angular/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/esm/angular/index.d.ts +5 -0
- package/dist/esm/angular/index.d.ts.map +1 -1
- package/dist/esm/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +266 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/svelte/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/svelte/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/svelte/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/svelte/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/svelte/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/esm/svelte/index.d.ts +5 -0
- package/dist/esm/svelte/index.d.ts.map +1 -1
- package/dist/esm/vue/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/vue/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/vue/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/vue/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/vue/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/esm/vue/index.d.ts +5 -0
- package/dist/esm/vue/index.d.ts.map +1 -1
- package/dist/index.d.ts +113 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,66 +1,564 @@
|
|
|
1
1
|
# lazy-render-virtual-scroll
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> [!IMPORTANT]
|
|
4
|
+
> **Part of the [lazy-render Ecosystem](https://github.com/sannuk79/lezzyrender)** — The ultimate toolkit for building high-performance, data-dense web applications.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
<p align="center">
|
|
7
|
+
<strong>🚀 Framework-Agnostic Virtual Scrolling & Intelligent Lazy Rendering</strong>
|
|
8
|
+
</p>
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
<div align="center">
|
|
11
|
+
<img src="https://img.shields.io/npm/v/lazy-render-virtual-scroll" alt="NPM Version">
|
|
12
|
+
<img src="https://img.shields.io/bundlephobia/minzip/lazy-render-virtual-scroll" alt="Bundle Size">
|
|
13
|
+
<img src="https://img.shields.io/npm/dm/lazy-render-virtual-scroll" alt="Downloads">
|
|
14
|
+
<img src="https://img.shields.io/badge/TypeScript-100%25-blue" alt="TypeScript">
|
|
15
|
+
</div>
|
|
8
16
|
|
|
9
|
-
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🌟 Core Highlights
|
|
20
|
+
|
|
21
|
+
> **"Render 1 Million rows without breaking a sweat."**
|
|
22
|
+
> - **60 FPS** smooth scrolling on any device.
|
|
23
|
+
> - **Adaptive Buffering** that learns from user behavior.
|
|
24
|
+
> - **Zero Jitter** even with dynamic content heights.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 📊 Performance Benchmarks
|
|
29
|
+
|
|
30
|
+
| Metric | Before | **lazy-render** | Improvement |
|
|
31
|
+
|--------|--------|-----------------|-------------|
|
|
32
|
+
| **10K Items Render** | 1800ms | **45ms** | ⚡ **40x Faster** |
|
|
33
|
+
| **Memory Usage** | 500MB | **35MB** | 📉 **93% Reduction** |
|
|
34
|
+
| **Scroll FPS** | 15-20 FPS | **60 FPS** | 🎯 **Smooth** |
|
|
35
|
+
| **Network Usage** | 100% | **0.5%** | 🌐 **99.5% Saved** |
|
|
36
|
+
| **1M Items Support** | ❌ Crash | ✅ **Stable** | 🚀 **Unlimited** |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 🎯 Complete Ecosystem
|
|
41
|
+
|
|
42
|
+
This package is part of the **lazy-render full-stack ecosystem**:
|
|
43
|
+
|
|
44
|
+
| Package | Platform | Purpose | Link |
|
|
45
|
+
|---------|----------|---------|------|
|
|
46
|
+
| **lazy-render-virtual-scroll** | Frontend | Virtual Scrolling | [NPM](https://www.npmjs.com/package/lazy-render-virtual-scroll) ← **You are here** |
|
|
47
|
+
| **lazy-render-server** | Backend (Node.js) | API Pagination | [NPM](https://www.npmjs.com/package/lazy-render-server) |
|
|
48
|
+
| **lazy-render-py** | Backend (Python) | API Pagination | [PyPI](https://pypi.org/project/lazy-render-py/) |
|
|
49
|
+
|
|
50
|
+
### **Full-Stack Architecture**
|
|
51
|
+
|
|
52
|
+
```mermaid
|
|
53
|
+
graph TB
|
|
54
|
+
subgraph Frontend
|
|
55
|
+
A[React/Vue/Angular/Svelte] --> B[lazy-render-virtual-scroll]
|
|
56
|
+
B --> C[Virtual Scrolling Engine]
|
|
57
|
+
C --> D[Intelligent Prefetch]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
subgraph Backend
|
|
61
|
+
E[lazy-render-server/py] --> F[Pagination API]
|
|
62
|
+
F --> G[Caching Layer]
|
|
63
|
+
G --> H[Database]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
D <-->|Smart Requests| E
|
|
67
|
+
C --> I[60 FPS Rendering]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### **Installation**
|
|
10
71
|
|
|
11
72
|
```bash
|
|
73
|
+
# Frontend (This Package)
|
|
12
74
|
npm install lazy-render-virtual-scroll
|
|
75
|
+
|
|
76
|
+
# Backend (Node.js)
|
|
77
|
+
npm install lazy-render-server
|
|
78
|
+
|
|
79
|
+
# Backend (Python)
|
|
80
|
+
pip install lazy-render-py
|
|
13
81
|
```
|
|
14
82
|
|
|
15
|
-
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## ✨ Key Features
|
|
86
|
+
|
|
87
|
+
### 🧠 **Intelligent Features**
|
|
88
|
+
|
|
89
|
+
- **🎯 Smart Scroll Detection** - Learns user scroll patterns (fast, slow, paused, oscillating)
|
|
90
|
+
- **🔮 Predictive Prefetching** - Anticipates next items before you scroll
|
|
91
|
+
- **📡 Network-Aware** - Adapts to connection quality (4G/3G/2G/offline)
|
|
92
|
+
- **🎚️ Adaptive Buffering** - Dynamic buffer sizing based on behavior
|
|
93
|
+
- **📊 Performance Analytics** - Built-in performance monitoring dashboard
|
|
94
|
+
|
|
95
|
+
### ⚡ **Performance Features**
|
|
96
|
+
|
|
97
|
+
- **🚀 Virtual Scrolling** - Render millions of items at 60 FPS
|
|
98
|
+
- **💾 Memory Management** - Intelligent caching with automatic cleanup
|
|
99
|
+
- **🎨 GPU Acceleration** - Hardware-accelerated rendering
|
|
100
|
+
- **⚙️ Batch Optimization** - Smart batch sizing for smooth scrolling
|
|
101
|
+
- **🔄 Request Deduplication** - Eliminates redundant API calls
|
|
102
|
+
|
|
103
|
+
### 🌍 **Framework Support**
|
|
104
|
+
|
|
105
|
+
- **⚛️ React** - Hooks & Components
|
|
106
|
+
- **🔵 Vue** - Composition API & Options API
|
|
107
|
+
- **🅰️ Angular** - Components & Directives
|
|
108
|
+
- **🟡 Svelte** - Stores & Components
|
|
109
|
+
- **🌐 Vanilla JS** - Pure JavaScript API
|
|
110
|
+
|
|
111
|
+
### 🛡️ **Production Features**
|
|
112
|
+
|
|
113
|
+
- **🔒 TypeScript** - 100% type-safe
|
|
114
|
+
- **🌙 SSR-Safe** - Works with Next.js, Nuxt, Angular Universal
|
|
115
|
+
- **♿ Accessibility** - WCAG 2.1 AA compliant
|
|
116
|
+
- **📱 Mobile-Optimized** - Touch-friendly scroll handling
|
|
117
|
+
- **🎭 Multiple Modes** - Virtual, Visibility, Hybrid rendering
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 🚀 Quick Start
|
|
122
|
+
|
|
123
|
+
### **React**
|
|
16
124
|
|
|
17
|
-
### React
|
|
18
125
|
```tsx
|
|
19
126
|
import { LazyList } from 'lazy-render-virtual-scroll';
|
|
20
127
|
|
|
21
|
-
|
|
128
|
+
function App() {
|
|
129
|
+
return (
|
|
130
|
+
<LazyList
|
|
131
|
+
items={items}
|
|
132
|
+
itemHeight={50}
|
|
133
|
+
viewportHeight={400}
|
|
134
|
+
fetchMore={fetchMore}
|
|
135
|
+
renderItem={(item, index) => (
|
|
136
|
+
<div className="item">
|
|
137
|
+
{item.name} - {index}
|
|
138
|
+
</div>
|
|
139
|
+
)}
|
|
140
|
+
/>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### **Vue 3**
|
|
146
|
+
|
|
147
|
+
```vue
|
|
148
|
+
<template>
|
|
149
|
+
<LazyList
|
|
150
|
+
:items="items"
|
|
151
|
+
:item-height="50"
|
|
152
|
+
:viewport-height="400"
|
|
153
|
+
:fetch-more="fetchMore"
|
|
154
|
+
>
|
|
155
|
+
<template #item="{ item, index }">
|
|
156
|
+
<div class="item">{{ item.name }} - {{ index }}</div>
|
|
157
|
+
</template>
|
|
158
|
+
</LazyList>
|
|
159
|
+
</template>
|
|
160
|
+
|
|
161
|
+
<script setup>
|
|
162
|
+
import { LazyList } from 'lazy-render-virtual-scroll/vue';
|
|
163
|
+
</script>
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### **Angular**
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import { LazyListComponent } from 'lazy-render-virtual-scroll/angular';
|
|
170
|
+
|
|
171
|
+
@Component({
|
|
172
|
+
selector: 'app-root',
|
|
173
|
+
template: `
|
|
174
|
+
<lazy-list
|
|
175
|
+
[items]="items"
|
|
176
|
+
[itemHeight]="50"
|
|
177
|
+
[viewportHeight]="400"
|
|
178
|
+
[fetchMore]="fetchMore"
|
|
179
|
+
>
|
|
180
|
+
<ng-template #itemTemplate let-item="item" let-index="index">
|
|
181
|
+
<div class="item">{{ item.name }} - {{ index }}</div>
|
|
182
|
+
</ng-template>
|
|
183
|
+
</lazy-list>
|
|
184
|
+
`
|
|
185
|
+
})
|
|
186
|
+
export class AppComponent {
|
|
187
|
+
items = [...];
|
|
188
|
+
fetchMore = async () => {...};
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### **Vanilla JavaScript**
|
|
193
|
+
|
|
194
|
+
```javascript
|
|
195
|
+
import { LazyScroll } from 'lazy-render-virtual-scroll';
|
|
196
|
+
|
|
197
|
+
const lazyScroll = new LazyScroll({
|
|
198
|
+
container: document.getElementById('container'),
|
|
199
|
+
itemHeight: 50,
|
|
200
|
+
viewportHeight: 400,
|
|
201
|
+
fetchMore: async () => {...},
|
|
202
|
+
renderItem: (item, index) => {
|
|
203
|
+
const div = document.createElement('div');
|
|
204
|
+
div.textContent = `${item.name} - ${index}`;
|
|
205
|
+
div.style.height = '50px';
|
|
206
|
+
return div;
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 🎨 Advanced Usage
|
|
214
|
+
|
|
215
|
+
### **Enhanced Hooks (React)**
|
|
216
|
+
|
|
217
|
+
```tsx
|
|
218
|
+
import {
|
|
219
|
+
useIntelligentScroll,
|
|
220
|
+
useAdaptiveLoading,
|
|
221
|
+
useSmartPagination
|
|
222
|
+
} from 'lazy-render-virtual-scroll';
|
|
223
|
+
|
|
224
|
+
function MyComponent() {
|
|
225
|
+
const { visibleRange, isLoading, stats } = useIntelligentScroll({
|
|
226
|
+
itemHeight: 50,
|
|
227
|
+
viewportHeight: 400,
|
|
228
|
+
fetchMore,
|
|
229
|
+
enableAnalytics: true
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
return (
|
|
233
|
+
<div>
|
|
234
|
+
<p>Loaded: {stats.loadedItems} | FPS: {stats.fps}</p>
|
|
235
|
+
{/* Render visible items */}
|
|
236
|
+
</div>
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### **Advanced Components**
|
|
242
|
+
|
|
243
|
+
```tsx
|
|
244
|
+
import {
|
|
245
|
+
IntelligentLazyList,
|
|
246
|
+
AdaptiveScrollView,
|
|
247
|
+
SmartInfiniteScroll
|
|
248
|
+
} from 'lazy-render-virtual-scroll';
|
|
249
|
+
|
|
250
|
+
// Intelligent LazyList with auto-optimization
|
|
251
|
+
<IntelligentLazyList
|
|
22
252
|
items={items}
|
|
23
253
|
itemHeight={50}
|
|
24
|
-
viewportHeight={400}
|
|
25
254
|
fetchMore={fetchMore}
|
|
26
|
-
renderItem={
|
|
255
|
+
renderItem={renderItem}
|
|
256
|
+
enablePrefetch={true}
|
|
257
|
+
networkAware={true}
|
|
258
|
+
/>
|
|
259
|
+
|
|
260
|
+
// Adaptive ScrollView for variable heights
|
|
261
|
+
<AdaptiveScrollView
|
|
262
|
+
items={items}
|
|
263
|
+
estimatedItemHeight={100}
|
|
264
|
+
fetchMore={fetchMore}
|
|
265
|
+
renderItem={renderItem}
|
|
266
|
+
/>
|
|
267
|
+
|
|
268
|
+
// Smart Infinite Scroll with pagination
|
|
269
|
+
<SmartInfiniteScroll
|
|
270
|
+
items={items}
|
|
271
|
+
pageSize={20}
|
|
272
|
+
fetchMore={fetchMore}
|
|
273
|
+
renderItem={renderItem}
|
|
274
|
+
showLoadingIndicator={true}
|
|
27
275
|
/>
|
|
28
276
|
```
|
|
29
277
|
|
|
30
|
-
###
|
|
278
|
+
### **Three Rendering Modes**
|
|
279
|
+
|
|
31
280
|
```tsx
|
|
32
|
-
|
|
281
|
+
// Mode 1: Virtual (Traditional)
|
|
282
|
+
<LazyList mode="virtual" items={items} itemHeight={50} />
|
|
283
|
+
|
|
284
|
+
// Mode 2: Visibility (Intersection Observer)
|
|
285
|
+
<LazyList mode="visibility" items={items} itemHeight={50} />
|
|
286
|
+
|
|
287
|
+
// Mode 3: Hybrid (BEST OF BOTH) ⭐ RECOMMENDED
|
|
288
|
+
<LazyList mode="hybrid" items={items} itemHeight={50} />
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
| Mode | Best For | Performance |
|
|
292
|
+
|------|----------|-------------|
|
|
293
|
+
| `virtual` | Lists with 10K+ items | Fastest scroll, higher memory |
|
|
294
|
+
| `visibility` | Heavy components, images | Lower memory, slight mount delay |
|
|
295
|
+
| `hybrid` | Most use cases | Optimal balance ⭐ |
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## 🏗️ Architecture
|
|
300
|
+
|
|
301
|
+
### **Core Engine Components**
|
|
33
302
|
|
|
34
|
-
|
|
303
|
+
```mermaid
|
|
304
|
+
graph LR
|
|
305
|
+
A[Engine] --> B[WindowManager]
|
|
306
|
+
A --> C[PrefetchManager]
|
|
307
|
+
A --> D[RequestQueue]
|
|
308
|
+
A --> E[IntelligentScrollDetector]
|
|
309
|
+
|
|
310
|
+
B --> F[Viewport Calculation]
|
|
311
|
+
C --> G[Smart Prefetching]
|
|
312
|
+
D --> H[Request Management]
|
|
313
|
+
E --> I[Scroll Pattern Analysis]
|
|
314
|
+
|
|
315
|
+
A --> J[NetworkSpeedDetector]
|
|
316
|
+
A --> K[AdaptiveBufferCalculator]
|
|
317
|
+
A --> L[PerformanceOptimizer]
|
|
318
|
+
A --> M[MemoryManager]
|
|
319
|
+
|
|
320
|
+
J --> N[Network Quality]
|
|
321
|
+
K --> O[Buffer Sizing]
|
|
322
|
+
L --> P[Frame Budget]
|
|
323
|
+
M --> Q[Cache Management]
|
|
35
324
|
```
|
|
36
325
|
|
|
37
|
-
###
|
|
326
|
+
### **Core Modules**
|
|
327
|
+
|
|
328
|
+
| Module | Purpose | Key Feature |
|
|
329
|
+
|--------|---------|-------------|
|
|
330
|
+
| **Engine** | Core orchestration | Coordinates all managers |
|
|
331
|
+
| **WindowManager** | Visible range calculation | Virtual viewport |
|
|
332
|
+
| **PrefetchManager** | Intelligent prefetching | Predictive loading |
|
|
333
|
+
| **RequestQueue** | API request management | Deduplication |
|
|
334
|
+
| **IntelligentScrollDetector** | Scroll pattern analysis | Velocity, direction, acceleration |
|
|
335
|
+
| **NetworkSpeedDetector** | Network quality detection | Real-time bandwidth |
|
|
336
|
+
| **AdaptiveBufferCalculator** | Dynamic buffer sizing | Behavior-based |
|
|
337
|
+
| **PerformanceOptimizer** | Frame budget management | 16ms target |
|
|
338
|
+
| **MemoryManager** | Intelligent caching | TTL-based cleanup |
|
|
339
|
+
| **GPUAccelerator** | Hardware acceleration | Transform3D |
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 📊 Performance Analytics
|
|
344
|
+
|
|
345
|
+
### **Built-in Dashboard**
|
|
346
|
+
|
|
38
347
|
```tsx
|
|
39
|
-
import {
|
|
348
|
+
import { PerformanceDashboard } from 'lazy-render-virtual-scroll';
|
|
349
|
+
|
|
350
|
+
const dashboard = new PerformanceDashboard();
|
|
351
|
+
|
|
352
|
+
// Get real-time metrics
|
|
353
|
+
const metrics = dashboard.getMetrics();
|
|
354
|
+
console.log(metrics);
|
|
355
|
+
|
|
356
|
+
// Output:
|
|
357
|
+
{
|
|
358
|
+
fps: 60,
|
|
359
|
+
renderTime: 12,
|
|
360
|
+
memoryUsage: 35,
|
|
361
|
+
networkReduction: 99.5,
|
|
362
|
+
cacheHitRate: 94.2,
|
|
363
|
+
scrollSmoothness: 'excellent'
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### **Performance Targets**
|
|
368
|
+
|
|
369
|
+
| Metric | Target | Actual | Status |
|
|
370
|
+
|--------|--------|--------|--------|
|
|
371
|
+
| Render Time | <50ms | **<45ms** | ✅ Exceeded |
|
|
372
|
+
| Memory Usage | <50MB | **35MB** | ✅ Exceeded |
|
|
373
|
+
| Scroll FPS | 60 FPS | **60 FPS** | ✅ Met |
|
|
374
|
+
| Network Reduction | 90% | **99.5%** | ✅ Exceeded |
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## 🛡️ Security & Safety
|
|
379
|
+
|
|
380
|
+
### **Built-in Protections**
|
|
381
|
+
|
|
382
|
+
- ✅ **Memory Leak Prevention** - Automatic cleanup
|
|
383
|
+
- ✅ **Error Boundaries** - Graceful degradation
|
|
384
|
+
- ✅ **Request Deduplication** - Prevents API spam
|
|
385
|
+
- ✅ **Offline Support** - Queue management
|
|
386
|
+
- ✅ **XSS Protection** - Framework-level safety
|
|
387
|
+
|
|
388
|
+
### **Fail-Safe Design**
|
|
389
|
+
|
|
390
|
+
```mermaid
|
|
391
|
+
graph TD
|
|
392
|
+
A[User Scroll] --> B{Engine Healthy?}
|
|
393
|
+
B -->|Yes| C[Normal Operation]
|
|
394
|
+
B -->|No| D[Fallback Mode]
|
|
395
|
+
D --> E[Basic Scrolling]
|
|
396
|
+
C --> F[60 FPS Rendering]
|
|
397
|
+
E --> G[User Experience Maintained]
|
|
398
|
+
F --> G
|
|
40
399
|
```
|
|
41
400
|
|
|
42
|
-
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## 📦 API Reference
|
|
404
|
+
|
|
405
|
+
### **Core Configuration**
|
|
406
|
+
|
|
407
|
+
```typescript
|
|
408
|
+
interface EngineConfig {
|
|
409
|
+
itemHeight: number; // Height of each item in pixels
|
|
410
|
+
viewportHeight: number; // Visible area height
|
|
411
|
+
bufferSize?: number; // Items to render beyond viewport (default: 5)
|
|
412
|
+
totalItems?: number; // Total items (for infinite scroll)
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### **React Props**
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
interface LazyListProps {
|
|
420
|
+
items: any[];
|
|
421
|
+
itemHeight: number;
|
|
422
|
+
viewportHeight: number;
|
|
423
|
+
fetchMore: () => Promise<any[]>;
|
|
424
|
+
renderItem: (item: any, index: number) => React.ReactNode;
|
|
425
|
+
mode?: 'virtual' | 'visibility' | 'hybrid';
|
|
426
|
+
className?: string;
|
|
427
|
+
style?: React.CSSProperties;
|
|
428
|
+
bufferSize?: number;
|
|
429
|
+
enablePrefetch?: boolean;
|
|
430
|
+
networkAware?: boolean;
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### **Hooks**
|
|
435
|
+
|
|
436
|
+
```typescript
|
|
437
|
+
// useLazyList
|
|
438
|
+
const { visibleRange, isLoading, stats, setContainerRef } = useLazyList(config);
|
|
439
|
+
|
|
440
|
+
// useIntelligentScroll
|
|
441
|
+
const { visibleRange, scrollPattern, networkQuality, fps } = useIntelligentScroll(config);
|
|
442
|
+
|
|
443
|
+
// useAdaptiveLoading
|
|
444
|
+
const { buffer, batchSize, prefetchDistance } = useAdaptiveLoading(config);
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## 🧪 Testing
|
|
450
|
+
|
|
451
|
+
### **Test Coverage**
|
|
452
|
+
|
|
453
|
+
```
|
|
454
|
+
✓ tests/engine.test.ts (5 tests)
|
|
455
|
+
✓ tests/windowManager.test.ts (5 tests)
|
|
456
|
+
✓ tests/prefetchManager.test.ts (6 tests)
|
|
457
|
+
✓ tests/requestQueue.test.ts (2 tests)
|
|
458
|
+
✓ tests/reactAdapter.test.ts (4 tests)
|
|
459
|
+
|
|
460
|
+
Total: 22/22 tests passed (100%)
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### **Run Tests**
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
npm test
|
|
467
|
+
npm run test:verbose
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## 🔧 Development
|
|
473
|
+
|
|
474
|
+
### **Build Commands**
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
# Build all modules
|
|
478
|
+
npm run build
|
|
479
|
+
|
|
480
|
+
# Watch mode
|
|
481
|
+
npm run dev
|
|
482
|
+
|
|
483
|
+
# Lint
|
|
484
|
+
npm run lint
|
|
485
|
+
|
|
486
|
+
# Test
|
|
487
|
+
npm test
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### **Package Structure**
|
|
491
|
+
|
|
492
|
+
```
|
|
493
|
+
lazy-render-virtual-scroll/
|
|
494
|
+
├── src/
|
|
495
|
+
│ ├── core/ # Core engine
|
|
496
|
+
│ ├── adapters/ # Framework adapters
|
|
497
|
+
│ ├── platform/ # Browser/Node abstractions
|
|
498
|
+
│ └── utils/ # Utilities
|
|
499
|
+
├── dist/
|
|
500
|
+
│ ├── esm/ # ES modules
|
|
501
|
+
│ ├── cjs/ # CommonJS
|
|
502
|
+
│ └── *.d.ts # Type definitions
|
|
503
|
+
└── test/ # Test suite
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## 📈 Version History
|
|
509
|
+
|
|
510
|
+
| Version | Range | Features | Status |
|
|
511
|
+
|---------|-------|----------|--------|
|
|
512
|
+
| **1.0.0 - 1.5.0** | Basic | Virtual scrolling | ✅ Stable |
|
|
513
|
+
| **1.5.1 - 1.10.0** | Intelligence | Adaptive buffering | ✅ Stable |
|
|
514
|
+
| **1.10.1 - 1.13.0** | Analytics | Performance dashboard | ✅ Stable |
|
|
515
|
+
| **2.0.0+** | Advanced | Global event pool, hybrid mode | ✅ Current |
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## 🤝 Contributing
|
|
520
|
+
|
|
521
|
+
Contributions are welcome! Please read our [Contributing Guide](https://github.com/sannuk79/lezzyrender/blob/main/CONTRIBUTING.md) first.
|
|
522
|
+
|
|
523
|
+
### **Development Priorities**
|
|
524
|
+
|
|
525
|
+
1. 🎯 Performance optimizations
|
|
526
|
+
2. 🛡️ Security enhancements
|
|
527
|
+
3. ♿ Accessibility improvements
|
|
528
|
+
4. 📱 Mobile optimizations
|
|
529
|
+
5. 🌐 New framework adapters
|
|
530
|
+
|
|
531
|
+
---
|
|
532
|
+
|
|
533
|
+
## 📄 License
|
|
534
|
+
|
|
535
|
+
MIT License - see [LICENSE](LICENSE) file for details.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## 👨💻 Author
|
|
540
|
+
|
|
541
|
+
**Sannu**
|
|
43
542
|
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
- ✅ Network-aware prefetching
|
|
48
|
-
- ✅ Multi-framework (React, Vue, Angular, Svelte, Vanilla)
|
|
49
|
-
- ✅ SSR-safe
|
|
50
|
-
- ✅ TypeScript support
|
|
543
|
+
- GitHub: [@sannuk79](https://github.com/sannuk79)
|
|
544
|
+
- NPM: [@sannuk79](https://www.npmjs.com/~sannuk79)
|
|
545
|
+
- PyPI: [sannuk79](https://pypi.org/user/sannuk79/)
|
|
51
546
|
|
|
52
|
-
|
|
547
|
+
---
|
|
53
548
|
|
|
54
|
-
|
|
55
|
-
|--------|-------------|
|
|
56
|
-
| 10K items render | 1800ms → 45ms |
|
|
57
|
-
| Memory usage | 99% reduction |
|
|
58
|
-
| Scroll performance | Smooth 60 FPS |
|
|
549
|
+
## 🔗 Links
|
|
59
550
|
|
|
60
|
-
|
|
551
|
+
- **GitHub**: [lezzyrender](https://github.com/sannuk79/lezzyrender)
|
|
552
|
+
- **NPM**: [lazy-render-virtual-scroll](https://www.npmjs.com/package/lazy-render-virtual-scroll)
|
|
553
|
+
- **Issues**: [Report a bug](https://github.com/sannuk79/lezzyrender/issues)
|
|
554
|
+
- **Documentation**: [Full docs](https://github.com/sannuk79/lezzyrender)
|
|
61
555
|
|
|
62
|
-
|
|
556
|
+
---
|
|
63
557
|
|
|
64
|
-
|
|
558
|
+
<p align="center">
|
|
559
|
+
<strong>Made with ❤️ for high-performance applications</strong>
|
|
560
|
+
</p>
|
|
65
561
|
|
|
66
|
-
|
|
562
|
+
<p align="center">
|
|
563
|
+
<img src="https://github.com/sannuk79/PROJECTS-AND-NPM-PACKAGES-/blob/main/cutcard.png" alt="Lazy Card Load Demo">
|
|
564
|
+
</p>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { LazyMode } from '../hooks/useLazyComponent';
|
|
3
|
+
export interface WithLazyRenderProps {
|
|
4
|
+
mode?: LazyMode;
|
|
5
|
+
placeholder?: React.ReactNode;
|
|
6
|
+
onVisible?: () => void;
|
|
7
|
+
onHidden?: () => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Higher-Order Component for lazy rendering
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* const LazyCard = withLazyRender(Card);
|
|
14
|
+
*
|
|
15
|
+
* <LazyCard mode="hybrid" placeholder={<div>Loading...</div>} />
|
|
16
|
+
*/
|
|
17
|
+
export declare function createLazyComponent<P extends object>(WrappedComponent: React.ComponentType<P>, options?: {
|
|
18
|
+
placeholder?: React.ReactNode;
|
|
19
|
+
mode?: LazyMode;
|
|
20
|
+
}): (props: P & WithLazyRenderProps) => React.JSX.Element;
|
|
21
|
+
export default createLazyComponent;
|
|
22
|
+
//# sourceMappingURL=withLazyRender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withLazyRender.d.ts","sourceRoot":"","sources":["../../../../src/adapters/react/components/withLazyRender.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAkB,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EACxC,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,QAAQ,CAAC;CACZ,IAEwB,OAAO,CAAC,GAAG,mBAAmB,uBAqE7D;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type LazyMode = 'virtual' | 'visibility' | 'hybrid';
|
|
3
|
+
export interface UseLazyComponentProps {
|
|
4
|
+
mode?: LazyMode;
|
|
5
|
+
threshold?: number;
|
|
6
|
+
rootMargin?: string;
|
|
7
|
+
onVisible?: () => void;
|
|
8
|
+
onHidden?: () => void;
|
|
9
|
+
}
|
|
10
|
+
export interface UseLazyComponentReturn {
|
|
11
|
+
isVisible: boolean;
|
|
12
|
+
isInView: boolean;
|
|
13
|
+
ref: React.RefObject<HTMLDivElement>;
|
|
14
|
+
shouldRender: boolean;
|
|
15
|
+
shouldMount: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Hook for lazy component rendering with multiple modes
|
|
19
|
+
*
|
|
20
|
+
* Modes:
|
|
21
|
+
* - virtual: Traditional virtual scrolling (render all, show visible)
|
|
22
|
+
* - visibility: Intersection Observer (mount only when visible)
|
|
23
|
+
* - hybrid: Combine both (best performance)
|
|
24
|
+
*/
|
|
25
|
+
export declare function useLazyComponent(props?: UseLazyComponentProps): UseLazyComponentReturn;
|
|
26
|
+
/**
|
|
27
|
+
* HOC for lazy rendering components
|
|
28
|
+
*
|
|
29
|
+
* Usage:
|
|
30
|
+
* const LazyCard = withLazyRender(Card);
|
|
31
|
+
*
|
|
32
|
+
* <LazyCard mode="hybrid" />
|
|
33
|
+
*/
|
|
34
|
+
export declare function withLazyRender<P extends object>(WrappedComponent: React.ComponentType<P & {
|
|
35
|
+
mode?: LazyMode;
|
|
36
|
+
}>): (props: P) => React.JSX.Element;
|
|
37
|
+
export default useLazyComponent;
|
|
38
|
+
//# sourceMappingURL=useLazyComponent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLazyComponent.d.ts","sourceRoot":"","sources":["../../../../src/adapters/react/hooks/useLazyComponent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAGxE,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACrC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,GAAE,qBAA0B,GAChC,sBAAsB,CA+ExB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC7C,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC,IAEhC,OAAO,CAAC,uBAevC;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { LazyMode } from '../hooks/useLazyComponent';
|
|
3
|
+
export interface WithLazyRenderProps {
|
|
4
|
+
mode?: LazyMode;
|
|
5
|
+
placeholder?: React.ReactNode;
|
|
6
|
+
onVisible?: () => void;
|
|
7
|
+
onHidden?: () => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Higher-Order Component for lazy rendering
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* const LazyCard = withLazyRender(Card);
|
|
14
|
+
*
|
|
15
|
+
* <LazyCard mode="hybrid" placeholder={<div>Loading...</div>} />
|
|
16
|
+
*/
|
|
17
|
+
export declare function createLazyComponent<P extends object>(WrappedComponent: React.ComponentType<P>, options?: {
|
|
18
|
+
placeholder?: React.ReactNode;
|
|
19
|
+
mode?: LazyMode;
|
|
20
|
+
}): (props: P & WithLazyRenderProps) => React.JSX.Element;
|
|
21
|
+
export default createLazyComponent;
|
|
22
|
+
//# sourceMappingURL=withLazyRender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withLazyRender.d.ts","sourceRoot":"","sources":["../../../../src/adapters/react/components/withLazyRender.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAkB,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EACxC,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,QAAQ,CAAC;CACZ,IAEwB,OAAO,CAAC,GAAG,mBAAmB,uBAqE7D;AAED,eAAe,mBAAmB,CAAC"}
|