virtual-list-common 0.0.6

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/CHANGELOG.md ADDED
@@ -0,0 +1,183 @@
1
+ # Changelog
2
+
3
+
4
+ ## [0.1.0] - 2026-03-28
5
+
6
+ ### Added
7
+
8
+ #### Vue3 和 React 组件支持
9
+ - **Vue 3 组件 (`VirtualListVue`)**
10
+ - 提供原生 Vue 组件支持,支持 `v-model` 风格的数据绑定
11
+ - 支持通过 `renderItem` 属性或默认插槽自定义渲染
12
+ - 提供完整的组件生命周期管理(自动初始化/销毁)
13
+ - 支持响应式数据更新,自动监听 `items` 变化
14
+ - 暴露 `ref` 方法:`scrollToIndex`, `scrollToBottom`, `scrollToTop`, `scrollTo`, `getFirstVisibleIndex`, `getLastVisibleIndex`, `updateItems`, `destroy`
15
+ - 新增组件属性:`height`, `className`, `style`, `preloadCount`, `scrollDamping`
16
+ - 支持事件:`@itemClick`, `@scroll`, `@update`
17
+
18
+ - **React 组件 (`VirtualListReact`)**
19
+ - 提供原生 React 组件支持,使用 Hooks 实现
20
+ - 支持通过 `renderItem` 属性自定义渲染
21
+ - 使用 `forwardRef` 暴露组件方法
22
+ - 自动处理 React 18 的 `createRoot` API
23
+ - 暴露方法:`scrollToIndex`, `scrollToBottom`, `scrollToTop`, `scrollTo`, `getFirstVisibleIndex`, `getLastVisibleIndex`, `updateItems`, `destroy`
24
+ - 新增组件属性:`height`, `className`, `style`, `preloadCount`, `scrollDamping`
25
+ - 支持回调:`onItemClick`, `onScroll`
26
+
27
+ #### 包导出配置
28
+ - 新增 `exports` 字段,支持更精细的模块导入
29
+ - `virtual-list-common` - 核心 VirtualList 类
30
+ - `virtual-list-common/vue` - Vue 3 组件
31
+ - `virtual-list-common/react` - React 组件
32
+ - 添加 `peerDependencies` 配置,将 Vue 和 React 标记为可选依赖
33
+ - 更新 `files` 字段,包含 `CHANGELOG.md`
34
+
35
+ #### 构建配置
36
+ - 更新 Rollup 配置,添加 Vue 和 React 组件的打包任务
37
+ - 为组件版本保留类名和函数名,便于调试
38
+ - 生成独立的 sourcemap 文件
39
+
40
+ ### Changed
41
+
42
+ - 版本号从 `0.0.5` 升级到 `0.1.0`,标志着新增功能里程碑
43
+ - 更新 `keywords`,添加 `component` 标签
44
+
45
+ ### Documentation
46
+
47
+ - 更新 README.md,添加 Vue 和 React 组件的详细使用说明
48
+ - 添加完整的 CHANGELOG.md 文档
49
+
50
+ ---
51
+
52
+ ## [0.0.5] - 2026-03-27
53
+
54
+ ### Fixed
55
+
56
+ - **IntersectionObserver 兼容性修复**
57
+ - 添加对不支持 IntersectionObserver 的浏览器环境的降级处理
58
+ - 在降级模式下使用滚动事件替代 IntersectionObserver
59
+ - 修复降级模式下事件监听器未正确清理的问题
60
+ - 确保 `destroy()` 方法能正确移除降级滚动监听器
61
+
62
+ ### Improved
63
+
64
+ - 优化事件监听器清理逻辑,防止内存泄漏
65
+ - 改进私有字段 `#useIntersectionObserver` 的使用方式
66
+
67
+ ---
68
+
69
+ ## [0.0.4] - 2026-03-26
70
+
71
+ ### Performance
72
+
73
+ - **预加载集合内存优化**
74
+ - 添加 `cleanupPreloadedSet()` 方法,限制预加载集合大小
75
+ - 设置最大预加载项数为 500 (`CONFIG.MAX_PRELOADED_ITEMS`)
76
+ - 定期清理远离可见范围的预加载项,防止内存泄漏
77
+
78
+ - **图片加载版本防护**
79
+ - 添加 `_loadVersion` 机制,防止回收元素的回调污染
80
+ - 确保元素被回收再复用时,旧的加载回调自动失效
81
+
82
+ ### Fixed
83
+
84
+ - 修复图片加载完成后可能错误地更新已回收元素的问题
85
+
86
+ ---
87
+
88
+ ## [0.0.3] - 2026-03-25
89
+
90
+ ### Added
91
+
92
+ - **Lenis 平滑滚动集成**
93
+ - 集成 Lenis 库提供平滑滚动体验
94
+ - 添加 `scrollDamping` 配置项控制滚动阻尼
95
+ - 支持 `scrollToIndex`, `scrollToBottom`, `scrollToTop`, `scrollTo` 方法
96
+ - 添加默认缓动函数(cubic ease-out)
97
+
98
+ ### Changed
99
+
100
+ - 优化滚动性能,使用 `requestAnimationFrame` 进行节流
101
+ - 改进滚动事件处理机制
102
+
103
+ ---
104
+
105
+ ## [0.0.2] - 2026-03-24
106
+
107
+ ### Performance
108
+
109
+ - **DOM 元素池优化**
110
+ - 实现 DOM 元素池机制,复用 DOM 元素减少创建和销毁开销
111
+ - 添加 `maxPoolSize` 配置项(默认 50)
112
+ - 优化元素回收逻辑,限制池大小防止内存泄漏
113
+
114
+ - **位置缓存机制**
115
+ - 添加 `itemPositionCache` Map 缓存项目位置计算结果
116
+ - 仅在容器尺寸变化时清空缓存
117
+
118
+ - **批量 DOM 操作**
119
+ - 优化可见项目更新逻辑,减少重排次数
120
+ - 使用数组替代 Map 存储活跃元素,提高查找速度
121
+
122
+ ### Added
123
+
124
+ - **性能检测**
125
+ - 添加 `isHighPerformanceDevice()` 方法检测设备性能
126
+ - 根据设备性能自动调整缓冲区大小
127
+
128
+ ---
129
+
130
+ ## [0.0.1] - 2026-03-23
131
+
132
+ ### Added
133
+
134
+ - **初始版本发布**
135
+ - 实现基础虚拟列表功能
136
+ - 支持大数据集的高效渲染(仅渲染可见区域)
137
+ - DOM 元素复用机制
138
+ - 图片懒加载(使用 IntersectionObserver)
139
+ - 支持多列布局
140
+ - 自定义渲染函数支持 (`onRenderItem`)
141
+ - 滚动事件回调 (`onScroll`)
142
+ - 项目点击事件 (`onItemClick`)
143
+ - 响应式布局支持(监听窗口 resize)
144
+
145
+ ### Configuration
146
+
147
+ - 支持以下配置选项:
148
+ - `itemHeight`: 项目高度(默认 310px)
149
+ - `itemWidth`: 项目宽度(默认 200px)
150
+ - `columns`: 列数(默认 2)
151
+ - `gap`: 间距(默认 5px)
152
+ - `buffer`: 缓冲区大小(默认 2)
153
+ - `preloadCount`: 预加载数量(默认 24)
154
+ - `maxPoolSize`: 元素池最大大小(默认 50)
155
+ - `preloadDistance`: 预加载距离(默认 800px)
156
+
157
+ ### Build
158
+
159
+ - 配置 Rollup 构建工具
160
+ - 生成 ESM 和 UMD 格式
161
+ - 生成压缩版本(.min.js)
162
+ - 配置 Terser 移除注释和 console
163
+
164
+ ---
165
+
166
+ ## 版本号说明
167
+
168
+ 本项目遵循 [语义化版本控制](https://semver.org/lang/zh-CN/spec/v2.0.0.html) 规范:
169
+
170
+ - **主版本号 (MAJOR)**: 当进行不兼容的 API 修改时递增
171
+ - **次版本号 (MINOR)**: 当添加向下兼容的功能时递增
172
+ - **修订号 (PATCH)**: 当进行向下兼容的问题修复时递增
173
+
174
+ ### 版本历史概览
175
+
176
+ | 版本 | 发布日期 | 主要变更 |
177
+ |------|----------|----------|
178
+ | 0.1.0 | 2026-03-28 | 添加 Vue 和 React 组件支持 |
179
+ | 0.0.5 | 2026-03-27 | IntersectionObserver 兼容性修复 |
180
+ | 0.0.4 | 2026-03-26 | 预加载集合内存优化 |
181
+ | 0.0.3 | 2026-03-25 | Lenis 平滑滚动集成 |
182
+ | 0.0.2 | 2026-03-24 | DOM 元素池和位置缓存优化 |
183
+ | 0.0.1 | 2026-03-23 | 初始版本发布 |
package/README.md ADDED
@@ -0,0 +1,348 @@
1
+ # virtual-list 虚拟列表
2
+
3
+ 该项目是一个 Vue3、React 通用虚拟列表,用于高效渲染大量数据的列表,仅渲染可见区域的元素并复用 DOM。
4
+ 适用于 Vue3 和 React 项目。
5
+ 由于使用了 IntersectionObserver API,所以需要浏览器支持。
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ npm install virtual-list-common
11
+ # 或
12
+ pnpm add virtual-list-common
13
+ # 或
14
+ yarn add virtual-list-common
15
+ ```
16
+
17
+ ## 快速开始
18
+
19
+ ### 方式一:使用框架原生组件(推荐)
20
+
21
+ 从 v0.1.0 开始,提供了 Vue 和 React 的原生组件支持,使用更加便捷。
22
+
23
+ #### Vue 3 组件
24
+
25
+ ```vue
26
+ <template>
27
+ <VirtualList
28
+ :items="items"
29
+ :itemHeight="310"
30
+ :itemWidth="200"
31
+ :columns="2"
32
+ height="600px"
33
+ @itemClick="handleItemClick"
34
+ @scroll="handleScroll"
35
+ ref="virtualListRef"
36
+ :renderItem="renderItem"
37
+ >
38
+ </VirtualList>
39
+ </template>
40
+
41
+ <script setup>
42
+ import { ref } from 'vue';
43
+ import { VirtualListVue as VirtualList } from 'virtual-list-common/vue';
44
+
45
+ const items = ref([
46
+ 'https://picsum.photos/200/300?random=1',
47
+ 'https://picsum.photos/200/300?random=2',
48
+ // ...
49
+ ]);
50
+
51
+ const virtualListRef = ref(null);
52
+
53
+ // 自定义渲染函数
54
+ const renderItem = (index, itemData) => {
55
+ const div = document.createElement('div');
56
+ div.className = 'custom-item';
57
+ div.innerHTML = `<img src="${itemData}" alt="Item ${index}" /><span>Item ${index}</span>`;
58
+ return div;
59
+ };
60
+
61
+ const handleItemClick = ({ index, itemData }) => {
62
+ console.log('Clicked item:', index, itemData);
63
+ };
64
+
65
+ const handleScroll = ({ scrollTop, firstVisibleIndex, lastVisibleIndex }) => {
66
+ console.log('Scroll position:', scrollTop);
67
+ };
68
+
69
+ // 使用暴露的方法
70
+ const scrollToItem = (index) => {
71
+ virtualListRef.value?.scrollToIndex(index, { immediate: false });
72
+ };
73
+ </script>
74
+ ```
75
+
76
+ #### React 组件
77
+
78
+ ```jsx
79
+ import { useRef, useState } from 'react';
80
+ import { VirtualListReact as VirtualList } from 'virtual-list-common/react';
81
+
82
+ function App() {
83
+ const [items] = useState([
84
+ 'https://picsum.photos/200/300?random=1',
85
+ 'https://picsum.photos/200/300?random=2',
86
+ // ...
87
+ ]);
88
+
89
+ const virtualListRef = useRef(null);
90
+
91
+ // 自定义渲染函数
92
+ const renderItem = (index, itemData) => (
93
+ <div className="custom-item">
94
+ <img src={itemData} alt={`Item ${index}`} />
95
+ <span>Item {index}</span>
96
+ </div>
97
+ );
98
+
99
+ const handleItemClick = (index, itemData) => {
100
+ console.log('Clicked item:', index, itemData);
101
+ };
102
+
103
+ const handleScroll = ({ scrollTop, firstVisibleIndex, lastVisibleIndex }) => {
104
+ console.log('Scroll position:', scrollTop);
105
+ };
106
+
107
+ // 使用暴露的方法
108
+ const scrollToItem = (index) => {
109
+ virtualListRef.current?.scrollToIndex(index, { immediate: false });
110
+ };
111
+
112
+ return (
113
+ <VirtualList
114
+ ref={virtualListRef}
115
+ items={items}
116
+ itemHeight={310}
117
+ itemWidth={200}
118
+ columns={2}
119
+ height="600px"
120
+ renderItem={renderItem}
121
+ onItemClick={handleItemClick}
122
+ onScroll={handleScroll}
123
+ />
124
+ );
125
+ }
126
+ ```
127
+
128
+ ---
129
+
130
+ ### 方式二:使用核心类(高级用法)
131
+
132
+ 如果你需要更底层的控制,可以直接使用 VirtualList 核心类。
133
+
134
+ #### 核心类基础用法
135
+
136
+ ```js
137
+ import VirtualList from 'virtual-list-common';
138
+
139
+ const container = document.getElementById('container');
140
+ const items = [
141
+ 'https://picsum.photos/200/300?random=1',
142
+ 'https://picsum.photos/200/300?random=2',
143
+ // ...
144
+ ];
145
+
146
+ const virtualList = new VirtualList(container, items, {
147
+ itemHeight: 310,
148
+ itemWidth: 200,
149
+ columns: 2
150
+ });
151
+ ```
152
+
153
+ #### 自定义渲染(使用核心类)
154
+
155
+ ```js
156
+ // Vue 中使用核心类
157
+ import { createApp, h } from 'vue';
158
+ import VirtualList from 'virtual-list-common';
159
+ import MyVueComponent from './MyVueComponent.vue';
160
+
161
+ const virtualList = new VirtualList(container, items, {
162
+ onRenderItem: (index, itemData) => {
163
+ const wrapper = document.createElement('div');
164
+ const app = createApp({
165
+ render: () => h(MyVueComponent, { data: itemData, index })
166
+ });
167
+ app.mount(wrapper);
168
+ return wrapper;
169
+ }
170
+ });
171
+
172
+ // React 中使用核心类
173
+ import { createRoot } from 'react-dom/client';
174
+ import VirtualList from 'virtual-list-common';
175
+ import MyReactComponent from './MyReactComponent';
176
+
177
+ const virtualList = new VirtualList(container, items, {
178
+ onRenderItem: (index, itemData) => {
179
+ const wrapper = document.createElement('div');
180
+ const root = createRoot(wrapper);
181
+ root.render(<MyReactComponent data={itemData} index={index} />);
182
+ return wrapper;
183
+ }
184
+ });
185
+ ```
186
+
187
+ ---
188
+
189
+ ## 组件/类 API 参考
190
+
191
+ ### VirtualListVue 组件属性
192
+
193
+ | 属性 | 类型 | 默认值 | 说明 |
194
+ |------|------|--------|------|
195
+ | `items` | `Array` | 必填 | 列表数据数组 |
196
+ | `itemHeight` | `number` | 310 | 每个项目的高度(像素) |
197
+ | `itemWidth` | `number` | 200 | 每个项目的宽度(像素) |
198
+ | `columns` | `number` | 2 | 列数 |
199
+ | `gap` | `number` | 5 | 项目间距(像素) |
200
+ | `buffer` | `number` | 2 | 缓冲区大小(行数) |
201
+ | `height` | `string/number` | '100%' | 容器高度 |
202
+ | `className` | `string` | '' | 容器 CSS 类名 |
203
+ | `style` | `Object` | {} | 容器内联样式 |
204
+ | `preloadCount` | `number` | 24 | 初始预加载数量 |
205
+ | `scrollDamping` | `number` | 0.09 | 滚动阻尼系数 |
206
+ | `renderItem` | `Function` | null | 自定义渲染函数 `(index, itemData) => HTMLElement`,返回 DOM 元素 |
207
+ | `onItemClick` | `Function` | null | 点击事件回调 `(index, itemData, element) => void` |
208
+ | `onScroll` | `Function` | null | 滚动事件回调 `(scrollTop, firstVisibleIndex, lastVisibleIndex) => void` |
209
+
210
+ ### VirtualListVue 事件
211
+
212
+ | 事件名 | 参数 | 说明 |
213
+ |--------|------|------|
214
+ | `itemClick` | `{ index, itemData, element }` | 项目点击时触发 |
215
+ | `scroll` | `{ scrollTop, firstVisibleIndex, lastVisibleIndex }` | 滚动时触发 |
216
+ | `update` | `VirtualList 实例` | 实例更新时触发 |
217
+
218
+ ### VirtualListVue 方法(通过 ref 调用)
219
+
220
+ | 方法名 | 参数 | 说明 |
221
+ |--------|------|------|
222
+ | `scrollToIndex(index, options)` | index: 目标索引, options: `{ immediate?, duration?, easing? }` | 滚动到指定索引 |
223
+ | `scrollToBottom(options)` | options: `{ immediate?, duration?, easing? }` | 滚动到底部 |
224
+ | `scrollToTop(options)` | options: `{ immediate?, duration?, easing? }` | 滚动到顶部 |
225
+ | `scrollTo(scrollTop, options)` | scrollTop: 目标位置, options: `{ immediate?, duration?, easing? }` | 滚动到指定位置 |
226
+ | `getFirstVisibleIndex()` | - | 获取第一个可见项目索引 |
227
+ | `getLastVisibleIndex()` | - | 获取最后一个可见项目索引 |
228
+ | `updateItems(newItems)` | newItems: 新数据数组 | 更新数据源 |
229
+ | `destroy()` | - | 销毁实例,清理资源 |
230
+
231
+ ### VirtualListReact 组件属性
232
+
233
+ 与 Vue 组件属性相同,事件通过 `onItemClick` 和 `onScroll` 回调处理。
234
+
235
+ ### VirtualListReact 方法(通过 ref 调用)
236
+
237
+ 与 Vue 组件方法相同。
238
+
239
+ ### VirtualList 核心类配置
240
+
241
+ ```js
242
+ const options = {
243
+ itemHeight: 310, // 项目高度
244
+ itemWidth: 200, // 项目宽度
245
+ columns: 2, // 列数
246
+ gap: 5, // 间距
247
+ buffer: 2, // 缓冲区行数
248
+ preloadCount: 24, // 预加载数量
249
+ maxPoolSize: 50, // DOM 元素池最大大小
250
+ scrollDamping: 0.09, // 滚动阻尼
251
+ preloadDistance: 800, // 预加载距离
252
+ onRenderItem: null, // 自定义渲染函数
253
+ onScroll: null, // 滚动回调
254
+ onItemClick: null // 点击回调
255
+ };
256
+ ```
257
+
258
+ ---
259
+
260
+ ## 在 Vue 中使用核心类示例
261
+
262
+ ```vue
263
+ <template>
264
+ <div ref="container"></div>
265
+ </template>
266
+
267
+ <script setup>
268
+ import { ref, onMounted, onBeforeUnmount } from 'vue';
269
+ import VirtualList from 'virtual-list-common';
270
+
271
+ const container = ref(null);
272
+ let virtualList = null;
273
+
274
+ onMounted(() => {
275
+ const items = ['url1', 'url2', /* ... */];
276
+ virtualList = new VirtualList(container.value, items, {
277
+ itemHeight: 310,
278
+ columns: 2
279
+ });
280
+ });
281
+
282
+ onBeforeUnmount(() => {
283
+ virtualList?.destroy();
284
+ });
285
+ </script>
286
+ ```
287
+
288
+ ## 在 React 中使用核心类示例
289
+
290
+ ```jsx
291
+ import { useEffect, useRef } from 'react';
292
+ import VirtualList from 'virtual-list-common';
293
+
294
+ function App() {
295
+ const containerRef = useRef(null);
296
+
297
+ useEffect(() => {
298
+ const items = ['url1', 'url2', /* ... */];
299
+ const virtualList = new VirtualList(containerRef.current, items, {
300
+ itemHeight: 310,
301
+ columns: 2
302
+ });
303
+
304
+ return () => {
305
+ virtualList.destroy();
306
+ };
307
+ }, []);
308
+
309
+ return <div ref={containerRef} />;
310
+ }
311
+ ```
312
+
313
+ ---
314
+
315
+ ## 注意事项
316
+
317
+ 1. **生命周期管理**:在 Vue/React 组件销毁时,虚拟列表会自动清理资源。但如果直接使用核心类,需要手动调用 `virtualList.destroy()`。
318
+
319
+ 2. **响应式数据**:
320
+ - 使用 Vue 组件时,`items` 是响应式的,数据变化会自动更新列表。
321
+ - 使用 React 组件时,`items` 变化会自动触发更新。
322
+ - 使用核心类时,如果 `items` 变化,需要调用 `virtualList.updateItems(newItems)`。
323
+
324
+ 3. **自定义渲染**:
325
+ - Vue 组件支持使用 `renderItem` 属性自定义渲染,接收 `(index, itemData)` 参数并返回 DOM 元素。
326
+ - React 组件支持使用 `renderItem` 属性自定义渲染,接收 `(index, itemData)` 参数并返回 React 元素。
327
+ - 使用核心类时,通过 `onRenderItem` 回调自定义渲染。
328
+
329
+ 4. **浏览器兼容性**:
330
+ - 需要支持 IntersectionObserver API(现代浏览器都支持)。
331
+ - 对于不支持的环境,会自动降级使用滚动事件。
332
+
333
+ 5. **依赖**:
334
+ - 核心库依赖 `lenis` 用于平滑滚动。
335
+ - Vue 组件需要 Vue 3.x。
336
+ - React 组件需要 React 16.8+(支持 Hooks)。
337
+
338
+ ---
339
+
340
+ ## 更新日志
341
+
342
+ 详见 [CHANGELOG.md](./CHANGELOG.md)
343
+
344
+ ---
345
+
346
+ ## 许可证
347
+
348
+ ISC
@@ -0,0 +1,2 @@
1
+ import t from"lenis";const e=310,i=200,s=2,n=1,o=2,r=5,h=24,a=50,l=.09,c=800,d=2,m=500,u="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",g=t=>1-Math.pow(1-t,3),p=encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="200" height="300" viewBox="0 0 200 300"><rect width="200" height="300" fill="#f0f0f0"/><text x="100" y="150" font-size="16" text-anchor="middle" fill="#999">加载失败</text></svg>');class f{#t=!0;constructor(t,d,m={}){this.container=t,this.items=d,this.itemHeight=m.itemHeight||e,this.itemWidth=m.itemWidth||i,this.buffer=void 0!==m.buffer?m.buffer:this.isHighPerformanceDevice()?n:s,this.columns=m.columns||o,this.gap=m.gap||r,this.preloadCount=m.preloadCount||h,this.maxPoolSize=m.maxPoolSize||a,this.scrollDamping=void 0!==m.scrollDamping?m.scrollDamping:l,this.onRenderItem=m.onRenderItem,this.onScroll=m.onScroll,this.onItemClick=m.onItemClick,this.visibleCount=Math.ceil(t.clientHeight/this.itemHeight*this.columns)+2*this.buffer*this.columns,this._rowHeight=this.itemHeight,this._itemsPerRow=this.columns,this._itemWidthWithGap=this.itemWidth+this.gap,this.elementPool=[],this.activeElements=[],this.ticking=!1,this.preloadedSet=new Set,this.updateFrameId=null,this.itemPositionCache=new Map,this.preloadDistance=void 0!==m.preloadDistance?m.preloadDistance:c,this.resizeHandler=this.handleResize.bind(this),this.clickHandler=this.handleItemClick.bind(this),this.scrollFallbackHandler=null,this.init()}init(){const t=this.container.clientHeight||500;this.container.style.cssText=`position: relative; overflow-y: auto; overflow-x: hidden; height: ${t}px`,this.contentContainer=document.createElement("div"),this.contentContainer.style.cssText=`position: relative; height: ${this.getTotalHeight()}px`,this.container.appendChild(this.contentContainer),this.initObserver(),this.preloadInitialImages(),this.initLenis(),this.update(),this.bindEvents()}initLenis(){this.lenis=new t({wrapper:this.container,content:this.contentContainer,lerp:this.scrollDamping,orientation:"vertical",smoothWheel:!0,infinite:!1,autoResize:!0,autoRaf:!1,touchMultiplier:1,wheelMultiplier:1,normalizeWheel:!1,touchInertia:!1,prevent:()=>!1}),this.lenis.on("scroll",()=>{this.requestUpdate()}),this.raf()}raf(t){this.lenis.raf(t),this.__rafID=requestAnimationFrame(this.raf.bind(this))}getTotalHeight(){return Math.ceil(this.items.length/this.columns)*this.itemHeight}initObserver(){if(!("IntersectionObserver"in window))return this.#t=!1,this.scrollFallbackHandler=this.requestUpdate.bind(this),void this.container.addEventListener("scroll",this.scrollFallbackHandler,{passive:!0});this.#t=!0,this.observer=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){const e=t.target,i=parseInt(e.dataset.index);i<this.items.length&&this.loadImage(e,i),this.observer.unobserve(e)}})},{root:this.container,rootMargin:`${this.preloadDistance}px`,threshold:.01})}preloadInitialImages(){const t=Math.min(this.preloadCount,this.items.length);for(let e=0;e<t;e++)this.preloadImage(e)}cleanupPreloadedSet(){if(this.preloadedSet.size>m){const t=this.lenis?.scroll||0,e=Math.floor(t/this.itemHeight),i=Math.max(0,(e-this.buffer)*this.columns),s=i+this.visibleCount,n=d*this.buffer*this.columns,o=Math.max(0,i-n),r=s+n;this.preloadedSet.forEach(t=>{(t<o||t>r)&&this.preloadedSet.delete(t)})}}preloadImage(t){if(this.preloadedSet.has(t))return;const e=this.items[t];if(e){const i=new Image;i.onload=()=>this.preloadedSet.add(t),i.src=e}}loadImage(t,e){const i=this.items[e];if(!i)return;t.src=u;const s=t._loadVersion=(t._loadVersion||0)+1,n=new Image;n.onload=()=>{t._loadVersion===s&&(t.src=i,this.preloadedSet.add(e))},n.onerror=()=>{t._loadVersion===s&&(t.src=`data:image/svg+xml;utf8,${p}`)},n.src=i}loadSingleImage(t,e){const i=new Image;i.onload=()=>{t.src=e},i.onerror=()=>{t.src=`data:image/svg+xml;utf8,${p}`},i.src=e}createOrUpdateItem(t){const e=this.items[t];if(!e)return null;let i=this.activeElements[t];return i||(i=this.elementPool.pop()||this.createItemElement(t,e),this.updateItemPosition(i,t),this.contentContainer.appendChild(i),this.activeElements[t]=i,this.updateItemData(i,t,e)),i}createItemElement(t,e){let i;this.onRenderItem&&"function"==typeof this.onRenderItem?i=this.onRenderItem(t,e):(i=document.createElement("img"),i.style.objectFit="cover");const s=i.style;return s.position="absolute",s.width=`${this.itemWidth}px`,s.height=this.itemHeight-this.gap+"px",s.margin="0",s.willChange="transform",s.backfaceVisibility="hidden",this.onItemClick&&i.addEventListener("click",this.clickHandler),i}calculateItemPosition(t){if(this.itemPositionCache.has(t))return this.itemPositionCache.get(t);const e=Math.floor(t/this._itemsPerRow),i=t%this._itemsPerRow,s={top:e*this._rowHeight,left:i*this._itemWidthWithGap};return this.itemPositionCache.set(t,s),s}updateItemPosition(t,e){const{top:i,left:s}=this.calculateItemPosition(e),n=`translate3d(${s}px, ${i}px, 0)`;t.style.transform!==n&&(t.style.transform=n)}updateItemData(t,e,i){t.dataset.index=e,t.dataset.src=i,e<this.preloadCount||this.preloadedSet.has(e)?t.src=i:this.#t&&this.observer?(t.src=u,this.observer.observe(t)):t.src=i}recycleItem(t){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove(),this.activeElements[t]=null,this.elementPool.length<this.maxPoolSize&&("IMG"===e.tagName&&(e.src=""),this.elementPool.push(e)))}update(){const t=this.lenis?.scroll||0,e=this._rowHeight,i=this._itemsPerRow,s=Math.floor(t/e),n=Math.max(0,(s-this.buffer)*i),o=Math.min(n+this.visibleCount,this.items.length),r=this.buffer*d,h=Math.max(0,n-r*i),a=Math.min(o+r*i,this.items.length);for(let t=h;t<a;t++)this.preloadImage(t);this.cleanupPreloadedSet();const l=new Set;for(let t=n;t<o;t++)t<this.items.length&&(l.add(t),this.createOrUpdateItem(t));const c=[],m=this.activeElements.length;for(let t=0;t<m;t++){this.activeElements[t]&&!l.has(t)&&(t<n-this.buffer*i||t>o+this.buffer*i)&&c.push(t)}c.forEach(t=>this.recycleItem(t)),this.onScroll?.(t,n,o),this.updateFrameId=null}scrollToIndex(t,e={}){const i=Math.max(0,Math.min(t,this.items.length-1)),s=Math.floor(i/this.columns)*this.itemHeight,{immediate:n=!1,duration:o=1.2,easing:r=g}=e;this.lenis?.scrollTo(s,{offset:0,immediate:n,duration:o,easing:r})}scrollToBottom(t={}){const e=this.getTotalHeight()-this.container.clientHeight,{immediate:i=!1,duration:s=1.2,easing:n=g}=t;this.lenis?.scrollTo(e,{offset:0,immediate:i,duration:s,easing:n})}scrollTo(t,e={}){const{immediate:i=!1,duration:s=1.2,easing:n=g}=e;this.lenis?.scrollTo(t,{offset:0,immediate:i,duration:s,easing:n})}getFirstVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight);return Math.max(0,(e-this.buffer)*this._itemsPerRow)}getLastVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight),i=Math.max(0,(e-this.buffer)*this._itemsPerRow);return Math.min(i+this.visibleCount,this.items.length-1)}handleItemClick(t){let e=t.target;for(;e&&e!==this.contentContainer&&(!e.dataset||void 0===e.dataset.index);)e=e.parentElement;if(!e||e===this.contentContainer)return;const i=parseInt(e.dataset.index);isNaN(i)||this.onItemClick?.(i,this.items[i],e)}requestUpdate(){this.updateFrameId||(this.updateFrameId=requestAnimationFrame(()=>this.update()))}handleResize(){this.ticking||(requestAnimationFrame(()=>{this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.visibleCount=Math.ceil(this.container.clientHeight/this._rowHeight*this._itemsPerRow)+2*this.buffer*this._itemsPerRow,this.itemPositionCache.clear(),this.update(),this.ticking=!1}),this.ticking=!0)}bindEvents(){window.addEventListener("resize",this.resizeHandler)}scrollToTop(t={}){const{duration:e=1.2,easing:i=g,immediate:s=!1}=t;this.lenis?.scrollTo(0,{offset:0,immediate:s,duration:e,easing:i})}updateItems(t){this.items=t;const e=this.activeElements.length;for(let t=0;t<e;t++){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove())}this.activeElements=[],this.elementPool=[],this.preloadedSet.clear(),this.itemPositionCache.clear(),this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.preloadInitialImages(),this.update()}destroy(){this.__rafID&&cancelAnimationFrame(this.__rafID),this.updateFrameId&&cancelAnimationFrame(this.updateFrameId),this.lenis&&this.lenis.destroy(),window.removeEventListener("resize",this.resizeHandler),this.scrollFallbackHandler&&this.container&&(this.container.removeEventListener("scroll",this.scrollFallbackHandler),this.scrollFallbackHandler=null);const t=this.activeElements.length;for(let e=0;e<t;e++){const t=this.activeElements[e];t&&(t.removeEventListener("click",this.clickHandler),t._loadVersion=(t._loadVersion||0)+1)}this.#t&&this.observer&&(this.observer.disconnect(),this.observer=null),this.container.innerHTML="",this.elementPool=[],this.activeElements=[],this.preloadedSet.clear(),this.ticking=!1,this.itemPositionCache.clear(),this.container=null,this.contentContainer=null}isHighPerformanceDevice(){const t=navigator.hardwareConcurrency||4,e=window.devicePixelRatio||1;return t>4&&e<=1.5}}"undefined"!=typeof module&&module.exports?module.exports=f:"undefined"!=typeof window&&(window.VirtualList=f);export{f as VirtualList,f as default};
2
+ //# sourceMappingURL=virtual-list.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-list.esm.js","sources":["../index.js"],"names":["CONFIG","PLACEHOLDER_GIF","DEFAULT_EASING","t","Math","pow","ERROR_PLACEHOLDER_SVG","encodeURIComponent","VirtualList","useIntersectionObserver","constructor","container","items","options","this","itemHeight","itemWidth","buffer","undefined","isHighPerformanceDevice","columns","gap","preloadCount","maxPoolSize","scrollDamping","onRenderItem","onScroll","onItemClick","visibleCount","ceil","clientHeight","_rowHeight","_itemsPerRow","_itemWidthWithGap","elementPool","activeElements","ticking","preloadedSet","Set","updateFrameId","itemPositionCache","Map","preloadDistance","resizeHandler","handleResize","bind","clickHandler","handleItemClick","scrollFallbackHandler","init","containerHeight","style","cssText","contentContainer","document","createElement","getTotalHeight","appendChild","initObserver","preloadInitialImages","initLenis","update","bindEvents","lenis","Lenis","wrapper","content","lerp","orientation","smoothWheel","infinite","autoResize","autoRaf","touchMultiplier","wheelMultiplier","normalizeWheel","touchInertia","prevent","on","requestUpdate","raf","time","__rafID","requestAnimationFrame","length","window","addEventListener","passive","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","element","target","index","parseInt","dataset","loadImage","unobserve","root","rootMargin","threshold","preloadNum","min","i","preloadImage","cleanupPreloadedSet","size","scrollTop","scroll","firstVisibleRow","floor","minVisibleIndex","max","maxVisibleIndex","keepRange","minKeepIndex","maxKeepIndex","delete","has","itemData","tempImg","Image","onload","add","src","loadVersion","_loadVersion","img","onerror","loadSingleImage","url","createOrUpdateItem","itemElement","pop","createItemElement","updateItemPosition","updateItemData","objectFit","position","width","height","margin","willChange","backfaceVisibility","calculateItemPosition","get","row","col","top","left","set","transformValue","transform","observe","recycleItem","remove","tagName","push","rowHeight","itemsPerRow","firstVisibleIndex","lastVisibleIndex","preloadBuffer","preloadStartIndex","preloadEndIndex","itemsToShow","indicesToRecycle","activeLen","scrollToIndex","targetIndex","offsetTop","immediate","duration","easing","scrollTo","offset","scrollToBottom","maxScrollTop","getFirstVisibleIndex","getLastVisibleIndex","event","parentElement","isNaN","clear","scrollToTop","updateItems","newItems","destroy","cancelAnimationFrame","removeEventListener","disconnect","innerHTML","logicalCores","navigator","hardwareConcurrency","dpr","devicePixelRatio","module","exports"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import t,{forwardRef as e,useRef as i,useState as s,useCallback as n,useEffect as r,useImperativeHandle as o}from"react";import a from"react-dom/client";import l from"lenis";const h=310,c=200,d=2,m=1,u=2,p=5,g=24,f=50,v=.09,I=800,b=2,w=500,x="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",DEFAULT_EASING=t=>1-Math.pow(1-t,3),C=encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="200" height="300" viewBox="0 0 200 300"><rect width="200" height="300" fill="#f0f0f0"/><text x="100" y="150" font-size="16" text-anchor="middle" fill="#999">加载失败</text></svg>');class VirtualList{#t=!0;constructor(t,e,i={}){this.container=t,this.items=e,this.itemHeight=i.itemHeight||h,this.itemWidth=i.itemWidth||c,this.buffer=void 0!==i.buffer?i.buffer:this.isHighPerformanceDevice()?m:d,this.columns=i.columns||u,this.gap=i.gap||p,this.preloadCount=i.preloadCount||g,this.maxPoolSize=i.maxPoolSize||f,this.scrollDamping=void 0!==i.scrollDamping?i.scrollDamping:v,this.onRenderItem=i.onRenderItem,this.onScroll=i.onScroll,this.onItemClick=i.onItemClick,this.visibleCount=Math.ceil(t.clientHeight/this.itemHeight*this.columns)+2*this.buffer*this.columns,this._rowHeight=this.itemHeight,this._itemsPerRow=this.columns,this._itemWidthWithGap=this.itemWidth+this.gap,this.elementPool=[],this.activeElements=[],this.ticking=!1,this.preloadedSet=new Set,this.updateFrameId=null,this.itemPositionCache=new Map,this.preloadDistance=void 0!==i.preloadDistance?i.preloadDistance:I,this.resizeHandler=this.handleResize.bind(this),this.clickHandler=this.handleItemClick.bind(this),this.scrollFallbackHandler=null,this.init()}init(){const t=this.container.clientHeight||500;this.container.style.cssText=`position: relative; overflow-y: auto; overflow-x: hidden; height: ${t}px`,this.contentContainer=document.createElement("div"),this.contentContainer.style.cssText=`position: relative; height: ${this.getTotalHeight()}px`,this.container.appendChild(this.contentContainer),this.initObserver(),this.preloadInitialImages(),this.initLenis(),this.update(),this.bindEvents()}initLenis(){this.lenis=new l({wrapper:this.container,content:this.contentContainer,lerp:this.scrollDamping,orientation:"vertical",smoothWheel:!0,infinite:!1,autoResize:!0,autoRaf:!1,touchMultiplier:1,wheelMultiplier:1,normalizeWheel:!1,touchInertia:!1,prevent:()=>!1}),this.lenis.on("scroll",()=>{this.requestUpdate()}),this.raf()}raf(t){this.lenis.raf(t),this.__rafID=requestAnimationFrame(this.raf.bind(this))}getTotalHeight(){return Math.ceil(this.items.length/this.columns)*this.itemHeight}initObserver(){if(!("IntersectionObserver"in window))return this.#t=!1,this.scrollFallbackHandler=this.requestUpdate.bind(this),void this.container.addEventListener("scroll",this.scrollFallbackHandler,{passive:!0});this.#t=!0,this.observer=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){const e=t.target,i=parseInt(e.dataset.index);i<this.items.length&&this.loadImage(e,i),this.observer.unobserve(e)}})},{root:this.container,rootMargin:`${this.preloadDistance}px`,threshold:.01})}preloadInitialImages(){const t=Math.min(this.preloadCount,this.items.length);for(let e=0;e<t;e++)this.preloadImage(e)}cleanupPreloadedSet(){if(this.preloadedSet.size>w){const t=this.lenis?.scroll||0,e=Math.floor(t/this.itemHeight),i=Math.max(0,(e-this.buffer)*this.columns),s=i+this.visibleCount,n=b*this.buffer*this.columns,r=Math.max(0,i-n),o=s+n;this.preloadedSet.forEach(t=>{(t<r||t>o)&&this.preloadedSet.delete(t)})}}preloadImage(t){if(this.preloadedSet.has(t))return;const e=this.items[t];if(e){const i=new Image;i.onload=()=>this.preloadedSet.add(t),i.src=e}}loadImage(t,e){const i=this.items[e];if(!i)return;t.src=x;const s=t._loadVersion=(t._loadVersion||0)+1,n=new Image;n.onload=()=>{t._loadVersion===s&&(t.src=i,this.preloadedSet.add(e))},n.onerror=()=>{t._loadVersion===s&&(t.src=`data:image/svg+xml;utf8,${C}`)},n.src=i}loadSingleImage(t,e){const i=new Image;i.onload=()=>{t.src=e},i.onerror=()=>{t.src=`data:image/svg+xml;utf8,${C}`},i.src=e}createOrUpdateItem(t){const e=this.items[t];if(!e)return null;let i=this.activeElements[t];return i||(i=this.elementPool.pop()||this.createItemElement(t,e),this.updateItemPosition(i,t),this.contentContainer.appendChild(i),this.activeElements[t]=i,this.updateItemData(i,t,e)),i}createItemElement(t,e){let i;this.onRenderItem&&"function"==typeof this.onRenderItem?i=this.onRenderItem(t,e):(i=document.createElement("img"),i.style.objectFit="cover");const s=i.style;return s.position="absolute",s.width=`${this.itemWidth}px`,s.height=this.itemHeight-this.gap+"px",s.margin="0",s.willChange="transform",s.backfaceVisibility="hidden",this.onItemClick&&i.addEventListener("click",this.clickHandler),i}calculateItemPosition(t){if(this.itemPositionCache.has(t))return this.itemPositionCache.get(t);const e=Math.floor(t/this._itemsPerRow),i=t%this._itemsPerRow,s={top:e*this._rowHeight,left:i*this._itemWidthWithGap};return this.itemPositionCache.set(t,s),s}updateItemPosition(t,e){const{top:i,left:s}=this.calculateItemPosition(e),n=`translate3d(${s}px, ${i}px, 0)`;t.style.transform!==n&&(t.style.transform=n)}updateItemData(t,e,i){t.dataset.index=e,t.dataset.src=i,e<this.preloadCount||this.preloadedSet.has(e)?t.src=i:this.#t&&this.observer?(t.src=x,this.observer.observe(t)):t.src=i}recycleItem(t){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove(),this.activeElements[t]=null,this.elementPool.length<this.maxPoolSize&&("IMG"===e.tagName&&(e.src=""),this.elementPool.push(e)))}update(){const t=this.lenis?.scroll||0,e=this._rowHeight,i=this._itemsPerRow,s=Math.floor(t/e),n=Math.max(0,(s-this.buffer)*i),r=Math.min(n+this.visibleCount,this.items.length),o=this.buffer*b,a=Math.max(0,n-o*i),l=Math.min(r+o*i,this.items.length);for(let t=a;t<l;t++)this.preloadImage(t);this.cleanupPreloadedSet();const h=new Set;for(let t=n;t<r;t++)t<this.items.length&&(h.add(t),this.createOrUpdateItem(t));const c=[],d=this.activeElements.length;for(let t=0;t<d;t++){this.activeElements[t]&&!h.has(t)&&(t<n-this.buffer*i||t>r+this.buffer*i)&&c.push(t)}c.forEach(t=>this.recycleItem(t)),this.onScroll?.(t,n,r),this.updateFrameId=null}scrollToIndex(t,e={}){const i=Math.max(0,Math.min(t,this.items.length-1)),s=Math.floor(i/this.columns)*this.itemHeight,{immediate:n=!1,duration:r=1.2,easing:o=DEFAULT_EASING}=e;this.lenis?.scrollTo(s,{offset:0,immediate:n,duration:r,easing:o})}scrollToBottom(t={}){const e=this.getTotalHeight()-this.container.clientHeight,{immediate:i=!1,duration:s=1.2,easing:n=DEFAULT_EASING}=t;this.lenis?.scrollTo(e,{offset:0,immediate:i,duration:s,easing:n})}scrollTo(t,e={}){const{immediate:i=!1,duration:s=1.2,easing:n=DEFAULT_EASING}=e;this.lenis?.scrollTo(t,{offset:0,immediate:i,duration:s,easing:n})}getFirstVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight);return Math.max(0,(e-this.buffer)*this._itemsPerRow)}getLastVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight),i=Math.max(0,(e-this.buffer)*this._itemsPerRow);return Math.min(i+this.visibleCount,this.items.length-1)}handleItemClick(t){let e=t.target;for(;e&&e!==this.contentContainer&&(!e.dataset||void 0===e.dataset.index);)e=e.parentElement;if(!e||e===this.contentContainer)return;const i=parseInt(e.dataset.index);isNaN(i)||this.onItemClick?.(i,this.items[i],e)}requestUpdate(){this.updateFrameId||(this.updateFrameId=requestAnimationFrame(()=>this.update()))}handleResize(){this.ticking||(requestAnimationFrame(()=>{this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.visibleCount=Math.ceil(this.container.clientHeight/this._rowHeight*this._itemsPerRow)+2*this.buffer*this._itemsPerRow,this.itemPositionCache.clear(),this.update(),this.ticking=!1}),this.ticking=!0)}bindEvents(){window.addEventListener("resize",this.resizeHandler)}scrollToTop(t={}){const{duration:e=1.2,easing:i=DEFAULT_EASING,immediate:s=!1}=t;this.lenis?.scrollTo(0,{offset:0,immediate:s,duration:e,easing:i})}updateItems(t){this.items=t;const e=this.activeElements.length;for(let t=0;t<e;t++){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove())}this.activeElements=[],this.elementPool=[],this.preloadedSet.clear(),this.itemPositionCache.clear(),this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.preloadInitialImages(),this.update()}destroy(){this.__rafID&&cancelAnimationFrame(this.__rafID),this.updateFrameId&&cancelAnimationFrame(this.updateFrameId),this.lenis&&this.lenis.destroy(),window.removeEventListener("resize",this.resizeHandler),this.scrollFallbackHandler&&this.container&&(this.container.removeEventListener("scroll",this.scrollFallbackHandler),this.scrollFallbackHandler=null);const t=this.activeElements.length;for(let e=0;e<t;e++){const t=this.activeElements[e];t&&(t.removeEventListener("click",this.clickHandler),t._loadVersion=(t._loadVersion||0)+1)}this.#t&&this.observer&&(this.observer.disconnect(),this.observer=null),this.container.innerHTML="",this.elementPool=[],this.activeElements=[],this.preloadedSet.clear(),this.ticking=!1,this.itemPositionCache.clear(),this.container=null,this.contentContainer=null}isHighPerformanceDevice(){const t=navigator.hardwareConcurrency||4,e=window.devicePixelRatio||1;return t>4&&e<=1.5}}"undefined"!=typeof module&&module.exports?module.exports=VirtualList:"undefined"!=typeof window&&(window.VirtualList=VirtualList);const H=e(({items:e=[],itemHeight:l=310,itemWidth:h=200,columns:c=2,gap:d=5,buffer:m=2,renderItem:u,onItemClick:p,onScroll:g,height:f="100%",className:v="",style:I={},preloadCount:b=24,scrollDamping:w=.09},x)=>{const C=i(null),H=i(null),E=i(new Map),M=i(new Map),[P,_]=s(new Map),y=n(()=>{if(!C.current||0===e.length)return;H.current&&(H.current.destroy(),M.current.forEach(t=>{try{t.unmount()}catch(t){}}),M.current.clear(),E.current.clear());const t={itemHeight:l,itemWidth:h,columns:c,gap:d,buffer:m,preloadCount:b,scrollDamping:w,onScroll:(t,e,i)=>{g?.({scrollTop:t,firstVisibleIndex:e,lastVisibleIndex:i})},onItemClick:(t,e,i)=>{p?.(t,e,i)}};u&&(t.onRenderItem=(t,e)=>{const i=document.createElement("div");return i.style.width="100%",i.style.height="100%",i.dataset.index=t,E.current.set(t,i),_(s=>new Map(s).set(t,{index:t,itemData:e,wrapper:i})),i}),H.current=new VirtualList(C.current,e,t)},[e,l,h,c,d,m,b,w,u,g,p]);r(()=>{u&&P.forEach(({index:t,itemData:e,wrapper:i})=>{let s=M.current.get(t);if(s)s.render(u(t,e));else{const s=a.createRoot(i);M.current.set(t,s),s.render(u(t,e))}})},[P,u]),r(()=>{H.current?(H.current.updateItems(e),_(t=>{const i=new Map;return t.forEach((t,s)=>{s<e.length&&i.set(s,t)}),i})):y()},[e,y]),r(()=>{y()},[l,h,c,d,m]),r(()=>()=>{H.current&&H.current.destroy(),M.current.forEach(t=>{try{t.unmount()}catch(t){}}),M.current.clear()},[]),o(x,()=>({scrollToIndex:(t,e)=>H.current?.scrollToIndex(t,e),scrollToBottom:t=>H.current?.scrollToBottom(t),scrollToTop:t=>H.current?.scrollToTop(t),scrollTo:(t,e)=>H.current?.scrollTo(t,e),getFirstVisibleIndex:()=>H.current?.getFirstVisibleIndex(),getLastVisibleIndex:()=>H.current?.getLastVisibleIndex(),updateItems:t=>H.current?.updateItems(t),destroy:()=>H.current?.destroy()}));const A={height:"number"==typeof f?`${f}px`:f,width:"100%",overflow:"auto",...I};return t.createElement("div",{ref:C,className:`virtual-list-container ${v}`,style:A})});H.displayName="VirtualList";export{H as VirtualListReact,H as default};
2
+ //# sourceMappingURL=virtual-list.react.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-list.react.esm.js","sources":["../index.js","../src/react.js"],"names":["CONFIG","PLACEHOLDER_GIF","DEFAULT_EASING","t","Math","pow","ERROR_PLACEHOLDER_SVG","encodeURIComponent","VirtualList","useIntersectionObserver","constructor","container","items","options","this","itemHeight","itemWidth","buffer","undefined","isHighPerformanceDevice","columns","gap","preloadCount","maxPoolSize","scrollDamping","onRenderItem","onScroll","onItemClick","visibleCount","ceil","clientHeight","_rowHeight","_itemsPerRow","_itemWidthWithGap","elementPool","activeElements","ticking","preloadedSet","Set","updateFrameId","itemPositionCache","Map","preloadDistance","resizeHandler","handleResize","bind","clickHandler","handleItemClick","scrollFallbackHandler","init","containerHeight","style","cssText","contentContainer","document","createElement","getTotalHeight","appendChild","initObserver","preloadInitialImages","initLenis","update","bindEvents","lenis","Lenis","wrapper","content","lerp","orientation","smoothWheel","infinite","autoResize","autoRaf","touchMultiplier","wheelMultiplier","normalizeWheel","touchInertia","prevent","on","requestUpdate","raf","time","__rafID","requestAnimationFrame","length","window","addEventListener","passive","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","element","target","index","parseInt","dataset","loadImage","unobserve","root","rootMargin","threshold","preloadNum","min","i","preloadImage","cleanupPreloadedSet","size","scrollTop","scroll","firstVisibleRow","floor","minVisibleIndex","max","maxVisibleIndex","keepRange","minKeepIndex","maxKeepIndex","delete","has","itemData","tempImg","Image","onload","add","src","loadVersion","_loadVersion","img","onerror","loadSingleImage","url","createOrUpdateItem","itemElement","pop","createItemElement","updateItemPosition","updateItemData","objectFit","position","width","height","margin","willChange","backfaceVisibility","calculateItemPosition","get","row","col","top","left","set","transformValue","transform","observe","recycleItem","remove","tagName","push","rowHeight","itemsPerRow","firstVisibleIndex","lastVisibleIndex","preloadBuffer","preloadStartIndex","preloadEndIndex","itemsToShow","indicesToRecycle","activeLen","scrollToIndex","targetIndex","offsetTop","immediate","duration","easing","scrollTo","offset","scrollToBottom","maxScrollTop","getFirstVisibleIndex","getLastVisibleIndex","event","parentElement","isNaN","clear","scrollToTop","updateItems","newItems","destroy","cancelAnimationFrame","removeEventListener","disconnect","innerHTML","logicalCores","navigator","hardwareConcurrency","dpr","devicePixelRatio","module","exports","VirtualListReact","forwardRef","renderItem","className","ref","containerRef","useRef","virtualListRef","itemElementsRef","reactRootsRef","mountedItems","setMountedItems","useState","initVirtualList","useCallback","current","unmount","e","prev","VirtualListCore","useEffect","render","newRoot","ReactDOMClient","createRoot","newMap","value","key","useImperativeHandle","containerStyle","overflow","React","displayName"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("lenis")):"function"==typeof define&&define.amd?define(["exports","lenis"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).VirtualList={},t.Lenis)}(this,function(t,e){"use strict";const i=310,s=200,n=2,o=1,r=2,h=5,a=24,l=50,c=.09,d=800,m=2,u=500,f="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",g=t=>1-Math.pow(1-t,3),p=encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="200" height="300" viewBox="0 0 200 300"><rect width="200" height="300" fill="#f0f0f0"/><text x="100" y="150" font-size="16" text-anchor="middle" fill="#999">加载失败</text></svg>');class v{#t=!0;constructor(t,e,m={}){this.container=t,this.items=e,this.itemHeight=m.itemHeight||i,this.itemWidth=m.itemWidth||s,this.buffer=void 0!==m.buffer?m.buffer:this.isHighPerformanceDevice()?o:n,this.columns=m.columns||r,this.gap=m.gap||h,this.preloadCount=m.preloadCount||a,this.maxPoolSize=m.maxPoolSize||l,this.scrollDamping=void 0!==m.scrollDamping?m.scrollDamping:c,this.onRenderItem=m.onRenderItem,this.onScroll=m.onScroll,this.onItemClick=m.onItemClick,this.visibleCount=Math.ceil(t.clientHeight/this.itemHeight*this.columns)+2*this.buffer*this.columns,this._rowHeight=this.itemHeight,this._itemsPerRow=this.columns,this._itemWidthWithGap=this.itemWidth+this.gap,this.elementPool=[],this.activeElements=[],this.ticking=!1,this.preloadedSet=new Set,this.updateFrameId=null,this.itemPositionCache=new Map,this.preloadDistance=void 0!==m.preloadDistance?m.preloadDistance:d,this.resizeHandler=this.handleResize.bind(this),this.clickHandler=this.handleItemClick.bind(this),this.scrollFallbackHandler=null,this.init()}init(){const t=this.container.clientHeight||500;this.container.style.cssText=`position: relative; overflow-y: auto; overflow-x: hidden; height: ${t}px`,this.contentContainer=document.createElement("div"),this.contentContainer.style.cssText=`position: relative; height: ${this.getTotalHeight()}px`,this.container.appendChild(this.contentContainer),this.initObserver(),this.preloadInitialImages(),this.initLenis(),this.update(),this.bindEvents()}initLenis(){this.lenis=new e({wrapper:this.container,content:this.contentContainer,lerp:this.scrollDamping,orientation:"vertical",smoothWheel:!0,infinite:!1,autoResize:!0,autoRaf:!1,touchMultiplier:1,wheelMultiplier:1,normalizeWheel:!1,touchInertia:!1,prevent:()=>!1}),this.lenis.on("scroll",()=>{this.requestUpdate()}),this.raf()}raf(t){this.lenis.raf(t),this.__rafID=requestAnimationFrame(this.raf.bind(this))}getTotalHeight(){return Math.ceil(this.items.length/this.columns)*this.itemHeight}initObserver(){if(!("IntersectionObserver"in window))return this.#t=!1,this.scrollFallbackHandler=this.requestUpdate.bind(this),void this.container.addEventListener("scroll",this.scrollFallbackHandler,{passive:!0});this.#t=!0,this.observer=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){const e=t.target,i=parseInt(e.dataset.index);i<this.items.length&&this.loadImage(e,i),this.observer.unobserve(e)}})},{root:this.container,rootMargin:`${this.preloadDistance}px`,threshold:.01})}preloadInitialImages(){const t=Math.min(this.preloadCount,this.items.length);for(let e=0;e<t;e++)this.preloadImage(e)}cleanupPreloadedSet(){if(this.preloadedSet.size>u){const t=this.lenis?.scroll||0,e=Math.floor(t/this.itemHeight),i=Math.max(0,(e-this.buffer)*this.columns),s=i+this.visibleCount,n=m*this.buffer*this.columns,o=Math.max(0,i-n),r=s+n;this.preloadedSet.forEach(t=>{(t<o||t>r)&&this.preloadedSet.delete(t)})}}preloadImage(t){if(this.preloadedSet.has(t))return;const e=this.items[t];if(e){const i=new Image;i.onload=()=>this.preloadedSet.add(t),i.src=e}}loadImage(t,e){const i=this.items[e];if(!i)return;t.src=f;const s=t._loadVersion=(t._loadVersion||0)+1,n=new Image;n.onload=()=>{t._loadVersion===s&&(t.src=i,this.preloadedSet.add(e))},n.onerror=()=>{t._loadVersion===s&&(t.src=`data:image/svg+xml;utf8,${p}`)},n.src=i}loadSingleImage(t,e){const i=new Image;i.onload=()=>{t.src=e},i.onerror=()=>{t.src=`data:image/svg+xml;utf8,${p}`},i.src=e}createOrUpdateItem(t){const e=this.items[t];if(!e)return null;let i=this.activeElements[t];return i||(i=this.elementPool.pop()||this.createItemElement(t,e),this.updateItemPosition(i,t),this.contentContainer.appendChild(i),this.activeElements[t]=i,this.updateItemData(i,t,e)),i}createItemElement(t,e){let i;this.onRenderItem&&"function"==typeof this.onRenderItem?i=this.onRenderItem(t,e):(i=document.createElement("img"),i.style.objectFit="cover");const s=i.style;return s.position="absolute",s.width=`${this.itemWidth}px`,s.height=this.itemHeight-this.gap+"px",s.margin="0",s.willChange="transform",s.backfaceVisibility="hidden",this.onItemClick&&i.addEventListener("click",this.clickHandler),i}calculateItemPosition(t){if(this.itemPositionCache.has(t))return this.itemPositionCache.get(t);const e=Math.floor(t/this._itemsPerRow),i=t%this._itemsPerRow,s={top:e*this._rowHeight,left:i*this._itemWidthWithGap};return this.itemPositionCache.set(t,s),s}updateItemPosition(t,e){const{top:i,left:s}=this.calculateItemPosition(e),n=`translate3d(${s}px, ${i}px, 0)`;t.style.transform!==n&&(t.style.transform=n)}updateItemData(t,e,i){t.dataset.index=e,t.dataset.src=i,e<this.preloadCount||this.preloadedSet.has(e)?t.src=i:this.#t&&this.observer?(t.src=f,this.observer.observe(t)):t.src=i}recycleItem(t){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove(),this.activeElements[t]=null,this.elementPool.length<this.maxPoolSize&&("IMG"===e.tagName&&(e.src=""),this.elementPool.push(e)))}update(){const t=this.lenis?.scroll||0,e=this._rowHeight,i=this._itemsPerRow,s=Math.floor(t/e),n=Math.max(0,(s-this.buffer)*i),o=Math.min(n+this.visibleCount,this.items.length),r=this.buffer*m,h=Math.max(0,n-r*i),a=Math.min(o+r*i,this.items.length);for(let t=h;t<a;t++)this.preloadImage(t);this.cleanupPreloadedSet();const l=new Set;for(let t=n;t<o;t++)t<this.items.length&&(l.add(t),this.createOrUpdateItem(t));const c=[],d=this.activeElements.length;for(let t=0;t<d;t++){this.activeElements[t]&&!l.has(t)&&(t<n-this.buffer*i||t>o+this.buffer*i)&&c.push(t)}c.forEach(t=>this.recycleItem(t)),this.onScroll?.(t,n,o),this.updateFrameId=null}scrollToIndex(t,e={}){const i=Math.max(0,Math.min(t,this.items.length-1)),s=Math.floor(i/this.columns)*this.itemHeight,{immediate:n=!1,duration:o=1.2,easing:r=g}=e;this.lenis?.scrollTo(s,{offset:0,immediate:n,duration:o,easing:r})}scrollToBottom(t={}){const e=this.getTotalHeight()-this.container.clientHeight,{immediate:i=!1,duration:s=1.2,easing:n=g}=t;this.lenis?.scrollTo(e,{offset:0,immediate:i,duration:s,easing:n})}scrollTo(t,e={}){const{immediate:i=!1,duration:s=1.2,easing:n=g}=e;this.lenis?.scrollTo(t,{offset:0,immediate:i,duration:s,easing:n})}getFirstVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight);return Math.max(0,(e-this.buffer)*this._itemsPerRow)}getLastVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight),i=Math.max(0,(e-this.buffer)*this._itemsPerRow);return Math.min(i+this.visibleCount,this.items.length-1)}handleItemClick(t){let e=t.target;for(;e&&e!==this.contentContainer&&(!e.dataset||void 0===e.dataset.index);)e=e.parentElement;if(!e||e===this.contentContainer)return;const i=parseInt(e.dataset.index);isNaN(i)||this.onItemClick?.(i,this.items[i],e)}requestUpdate(){this.updateFrameId||(this.updateFrameId=requestAnimationFrame(()=>this.update()))}handleResize(){this.ticking||(requestAnimationFrame(()=>{this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.visibleCount=Math.ceil(this.container.clientHeight/this._rowHeight*this._itemsPerRow)+2*this.buffer*this._itemsPerRow,this.itemPositionCache.clear(),this.update(),this.ticking=!1}),this.ticking=!0)}bindEvents(){window.addEventListener("resize",this.resizeHandler)}scrollToTop(t={}){const{duration:e=1.2,easing:i=g,immediate:s=!1}=t;this.lenis?.scrollTo(0,{offset:0,immediate:s,duration:e,easing:i})}updateItems(t){this.items=t;const e=this.activeElements.length;for(let t=0;t<e;t++){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove())}this.activeElements=[],this.elementPool=[],this.preloadedSet.clear(),this.itemPositionCache.clear(),this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.preloadInitialImages(),this.update()}destroy(){this.__rafID&&cancelAnimationFrame(this.__rafID),this.updateFrameId&&cancelAnimationFrame(this.updateFrameId),this.lenis&&this.lenis.destroy(),window.removeEventListener("resize",this.resizeHandler),this.scrollFallbackHandler&&this.container&&(this.container.removeEventListener("scroll",this.scrollFallbackHandler),this.scrollFallbackHandler=null);const t=this.activeElements.length;for(let e=0;e<t;e++){const t=this.activeElements[e];t&&(t.removeEventListener("click",this.clickHandler),t._loadVersion=(t._loadVersion||0)+1)}this.#t&&this.observer&&(this.observer.disconnect(),this.observer=null),this.container.innerHTML="",this.elementPool=[],this.activeElements=[],this.preloadedSet.clear(),this.ticking=!1,this.itemPositionCache.clear(),this.container=null,this.contentContainer=null}isHighPerformanceDevice(){const t=navigator.hardwareConcurrency||4,e=window.devicePixelRatio||1;return t>4&&e<=1.5}}"undefined"!=typeof module&&module.exports?module.exports=v:"undefined"!=typeof window&&(window.VirtualList=v),t.VirtualList=v,t.default=v,Object.defineProperty(t,"__esModule",{value:!0})});
2
+ //# sourceMappingURL=virtual-list.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-list.umd.js","sources":["../index.js"],"names":["CONFIG","PLACEHOLDER_GIF","DEFAULT_EASING","t","Math","pow","ERROR_PLACEHOLDER_SVG","encodeURIComponent","VirtualList","useIntersectionObserver","constructor","container","items","options","this","itemHeight","itemWidth","buffer","undefined","isHighPerformanceDevice","columns","gap","preloadCount","maxPoolSize","scrollDamping","onRenderItem","onScroll","onItemClick","visibleCount","ceil","clientHeight","_rowHeight","_itemsPerRow","_itemWidthWithGap","elementPool","activeElements","ticking","preloadedSet","Set","updateFrameId","itemPositionCache","Map","preloadDistance","resizeHandler","handleResize","bind","clickHandler","handleItemClick","scrollFallbackHandler","init","containerHeight","style","cssText","contentContainer","document","createElement","getTotalHeight","appendChild","initObserver","preloadInitialImages","initLenis","update","bindEvents","lenis","Lenis","wrapper","content","lerp","orientation","smoothWheel","infinite","autoResize","autoRaf","touchMultiplier","wheelMultiplier","normalizeWheel","touchInertia","prevent","on","requestUpdate","raf","time","__rafID","requestAnimationFrame","length","window","addEventListener","passive","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","element","target","index","parseInt","dataset","loadImage","unobserve","root","rootMargin","threshold","preloadNum","min","i","preloadImage","cleanupPreloadedSet","size","scrollTop","scroll","firstVisibleRow","floor","minVisibleIndex","max","maxVisibleIndex","keepRange","minKeepIndex","maxKeepIndex","delete","has","itemData","tempImg","Image","onload","add","src","loadVersion","_loadVersion","img","onerror","loadSingleImage","url","createOrUpdateItem","itemElement","pop","createItemElement","updateItemPosition","updateItemData","objectFit","position","width","height","margin","willChange","backfaceVisibility","calculateItemPosition","get","row","col","top","left","set","transformValue","transform","observe","recycleItem","remove","tagName","push","rowHeight","itemsPerRow","firstVisibleIndex","lastVisibleIndex","preloadBuffer","preloadStartIndex","preloadEndIndex","itemsToShow","indicesToRecycle","activeLen","scrollToIndex","targetIndex","offsetTop","immediate","duration","easing","scrollTo","offset","scrollToBottom","maxScrollTop","getFirstVisibleIndex","getLastVisibleIndex","event","parentElement","isNaN","clear","scrollToTop","updateItems","newItems","destroy","cancelAnimationFrame","removeEventListener","disconnect","innerHTML","logicalCores","navigator","hardwareConcurrency","dpr","devicePixelRatio","module","exports"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{ref as e,watch as t,onMounted as l,onBeforeUnmount as u,h as i,nextTick as o}from"vue";import a from"../index.js";const r={name:"VirtualList",props:{items:{type:Array,required:!0},itemHeight:{type:Number,default:310},itemWidth:{type:Number,default:200},columns:{type:Number,default:2},gap:{type:Number,default:5},buffer:{type:Number,default:2},renderItem:{type:Function,default:null},onItemClick:{type:Function,default:null},onScroll:{type:Function,default:null},height:{type:[String,Number],default:"100%"},className:{type:String,default:""},style:{type:Object,default:()=>({})},preloadCount:{type:Number,default:24},scrollDamping:{type:Number,default:.09}},emits:["itemClick","scroll","update"],setup(r,{emit:s,expose:n,slots:m}){const d=e(null),p=e(null),c=e(new Map),initVirtualList=()=>{if(!d.value||0===r.items.length)return;p.value&&p.value.destroy();const e={itemHeight:r.itemHeight,itemWidth:r.itemWidth,columns:r.columns,gap:r.gap,buffer:r.buffer,preloadCount:r.preloadCount,scrollDamping:r.scrollDamping,onScroll:(e,t,l)=>{s("scroll",{scrollTop:e,firstVisibleIndex:t,lastVisibleIndex:l}),r.onScroll?.(e,t,l)},onItemClick:(e,t,l)=>{s("itemClick",{index:e,itemData:t,element:l}),r.onItemClick?.(e,t,l)}};r.renderItem&&(e.onRenderItem=(e,t)=>{const l=document.createElement("div");return l.style.width="100%",l.style.height="100%",c.value.set(e,l),o(()=>{const u=r.renderItem(e,t);u instanceof HTMLElement&&l.appendChild(u)}),l}),p.value=new a(d.value,r.items,e),s("update",p.value)};return t(()=>r.items,e=>{p.value?p.value.updateItems(e):initVirtualList()},{deep:!0}),t(()=>[r.itemHeight,r.itemWidth,r.columns,r.gap,r.buffer],()=>{initVirtualList()}),l(()=>{initVirtualList()}),u(()=>{p.value&&(p.value.destroy(),p.value=null),c.value.clear()}),n({scrollToIndex:(e,t)=>p.value?.scrollToIndex(e,t),scrollToBottom:e=>p.value?.scrollToBottom(e),scrollToTop:e=>p.value?.scrollToTop(e),scrollTo:(e,t)=>p.value?.scrollTo(e,t),getFirstVisibleIndex:()=>p.value?.getFirstVisibleIndex(),getLastVisibleIndex:()=>p.value?.getLastVisibleIndex(),updateItems:e=>p.value?.updateItems(e),destroy:()=>p.value?.destroy()}),()=>i("div",{ref:d,class:["virtual-list-container",r.className],style:{height:"number"==typeof r.height?`${r.height}px`:r.height,width:"100%",overflow:"auto",...r.style}})}};export{r as VirtualListVue,r as default};
2
+ //# sourceMappingURL=virtual-list.vue.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-list.vue.esm.js","sources":["../src/vue.js"],"names":["VirtualListVue","name","props","items","type","Array","required","itemHeight","Number","default","itemWidth","columns","gap","buffer","renderItem","Function","onItemClick","onScroll","height","String","className","style","Object","preloadCount","scrollDamping","emits","setup","emit","expose","slots","containerRef","ref","virtualListRef","itemElements","Map","initVirtualList","value","length","destroy","options","scrollTop","firstVisibleIndex","lastVisibleIndex","index","itemData","element","onRenderItem","wrapper","document","createElement","width","set","nextTick","result","HTMLElement","appendChild","VirtualListCore","watch","newItems","updateItems","deep","onMounted","onBeforeUnmount","clear","scrollToIndex","scrollToBottom","scrollToTop","scrollTo","getFirstVisibleIndex","getLastVisibleIndex","h","class","overflow"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "virtual-list-common",
3
+ "version": "0.0.6",
4
+ "description": "vue3,react 通用虚拟列表,用于高效渲染大量数据的列表,仅渲染可见区域的元素并复用 DOM。",
5
+ "main": "dist/virtual-list.umd.js",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "scripts": {
9
+ "build": "rollup -c",
10
+ "prepublishOnly": "pnpm run build",
11
+ "test": "echo \"Error: no test specified\" && exit 1"
12
+ },
13
+ "module": "dist/virtual-list.esm.js",
14
+ "unpkg": "dist/virtual-list.umd.js",
15
+ "jsdelivr": "dist/virtual-list.umd.js",
16
+ "exports": {
17
+ ".": {
18
+ "import": "./dist/virtual-list.esm.js",
19
+ "require": "./dist/virtual-list.umd.js"
20
+ },
21
+ "./vue": {
22
+ "import": "./dist/virtual-list.vue.esm.js",
23
+ "require": "./dist/virtual-list.vue.esm.js"
24
+ },
25
+ "./react": {
26
+ "import": "./dist/virtual-list.react.esm.js",
27
+ "require": "./dist/virtual-list.react.esm.js"
28
+ }
29
+ },
30
+ "keywords": ["virtual-list", "vue", "react", "efficient", "large-data", "rendering", "visible-area", "dom-reuse", "component"],
31
+ "author": "yuan",
32
+ "license": "ISC",
33
+ "packageManager": "pnpm@10.15.1",
34
+ "dependencies": {
35
+ "lenis": "^1.3.16"
36
+ },
37
+ "peerDependencies": {
38
+ "vue": ">=3.0.0",
39
+ "react": ">=16.8.0",
40
+ "react-dom": ">=16.8.0"
41
+ },
42
+ "peerDependenciesMeta": {
43
+ "vue": {
44
+ "optional": true
45
+ },
46
+ "react": {
47
+ "optional": true
48
+ },
49
+ "react-dom": {
50
+ "optional": true
51
+ }
52
+ },
53
+ "files": [
54
+ "dist",
55
+ "README.md",
56
+ "CHANGELOG.md"
57
+ ],
58
+ "devDependencies": {
59
+ "@rollup/plugin-node-resolve": "^16.0.3",
60
+ "@rollup/plugin-terser": "^1.0.0",
61
+ "rollup": "^4.59.0"
62
+ }
63
+ }