@bsg-export/react 1.0.7 → 1.0.9
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 +24 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/use-exporter.d.ts.map +1 -1
- package/dist/use-worker-exporter.d.ts +46 -0
- package/dist/use-worker-exporter.d.ts.map +1 -0
- package/dist/use-worker-exporter.js +225 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## 简介
|
|
8
8
|
|
|
9
|
-
提供 `useExporter` Hook 和 `ExportButton` 组件,自动管理 WASM
|
|
9
|
+
提供 `useExporter` Hook、`useWorkerExporter` Hook 和 `ExportButton` 组件,自动管理 WASM 初始化、导出状态和进度追踪。`useWorkerExporter` 支持将导出计算移至 Worker 线程。
|
|
10
10
|
|
|
11
11
|
## 安装
|
|
12
12
|
|
|
@@ -78,6 +78,29 @@ import { ExportButton, ExportFormat } from '@bsg-export/react';
|
|
|
78
78
|
| `exportXlsxBatch` | `(options) => Promise` | XLSX 分批导出 |
|
|
79
79
|
| `exportTablesBatch` | `(options) => Promise` | 多 Sheet 分批导出 |
|
|
80
80
|
|
|
81
|
+
### `useWorkerExporter(createWorker)` 返回值
|
|
82
|
+
|
|
83
|
+
将导出计算移至 Worker 线程,主线程不阻塞。需要传入 Worker 工厂函数。
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
import { useWorkerExporter } from '@bsg-export/react';
|
|
87
|
+
import ExportWorkerScript from '@bsg-export/worker/worker?worker';
|
|
88
|
+
|
|
89
|
+
const { initialized, loading, progress, exportData } = useWorkerExporter(
|
|
90
|
+
() => new ExportWorkerScript()
|
|
91
|
+
);
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
| 属性/方法 | 类型 | 说明 |
|
|
95
|
+
|-----------|------|------|
|
|
96
|
+
| `initialized` | `boolean` | Worker 中 WASM 是否初始化完成 |
|
|
97
|
+
| `loading` | `boolean` | 是否正在导出 |
|
|
98
|
+
| `progress` | `number` | 导出进度 (0-100) |
|
|
99
|
+
| `error` | `Error \| null` | 错误信息 |
|
|
100
|
+
| `exportData` | `(data, opts?) => Promise<boolean>` | Worker 生成并下载 |
|
|
101
|
+
| `generateBytes` | `(data, opts?) => Promise<Uint8Array>` | 仅生成字节 |
|
|
102
|
+
| `terminate` | `() => void` | 销毁 Worker |
|
|
103
|
+
|
|
81
104
|
### `<ExportButton>` Props
|
|
82
105
|
|
|
83
106
|
继承所有 `<button>` HTML 属性,额外支持:
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export { useExporter } from './use-exporter';
|
|
9
9
|
export type { UseExporterReturn, } from './use-exporter';
|
|
10
|
+
export { useWorkerExporter } from './use-worker-exporter';
|
|
11
|
+
export type { UseWorkerExporterReturn, } from './use-worker-exporter';
|
|
10
12
|
export { ExportButton } from './ExportButton';
|
|
11
13
|
export type { ExportButtonProps } from './ExportButton';
|
|
12
14
|
export type { Column, MergeCellValue, CellValue, MergeableCellValue, DataRow, ExportDataOptions, SheetConfig, BatchSheetConfig, ProgressCallback, ExportTableOptions, ExportTablesXlsxOptions, ExportCsvBatchOptions, ExportXlsxBatchOptions, ExportTablesBatchOptions, } from '@bsg-export/types';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EACV,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EACV,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EACV,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,YAAY,EACV,MAAM,EACN,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,OAAO,EACP,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-exporter.d.ts","sourceRoot":"","sources":["../src/use-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"use-exporter.d.ts","sourceRoot":"","sources":["../src/use-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EAExB,OAAO,EACR,MAAM,mBAAmB,CAAC;AAI3B,4BAA4B;AAC5B,MAAM,WAAW,iBAAiB;IAChC,oBAAoB;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,iBAAiB;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC;IACtD,kBAAkB;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC;IACtE,eAAe;IACf,gBAAgB,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC;IAChE,iBAAiB;IACjB,cAAc,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,kBAAkB;IAClB,eAAe,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,iBAAiB;IACjB,iBAAiB,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5E;AA6BD;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,iBAAiB,CAgL/C"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useWorkerExporter - Worker 线程导出管理 Hook
|
|
3
|
+
*
|
|
4
|
+
* 将 CSV/XLSX 生成移至 Worker 线程,主线程不阻塞。
|
|
5
|
+
* 用户需要传入一个已创建的 Worker 实例。
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* // Vite
|
|
10
|
+
* import ExportWorkerScript from '@bsg-export/worker/worker?worker';
|
|
11
|
+
* const { initialized, loading, progress, exportData } = useWorkerExporter(() => new ExportWorkerScript());
|
|
12
|
+
*
|
|
13
|
+
* // Webpack 5
|
|
14
|
+
* const { exportData } = useWorkerExporter(
|
|
15
|
+
* () => new Worker(new URL('@bsg-export/worker/worker', import.meta.url), { type: 'module' })
|
|
16
|
+
* );
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import type { ExportDataOptions, DataRow } from '@bsg-export/types';
|
|
20
|
+
/** useWorkerExporter Hook 的返回值 */
|
|
21
|
+
export interface UseWorkerExporterReturn {
|
|
22
|
+
/** Worker 中的 WASM 是否已初始化完成 */
|
|
23
|
+
initialized: boolean;
|
|
24
|
+
/** 是否正在导出 */
|
|
25
|
+
loading: boolean;
|
|
26
|
+
/** 导出进度 (0-100) */
|
|
27
|
+
progress: number;
|
|
28
|
+
/** 错误信息 */
|
|
29
|
+
error: Error | null;
|
|
30
|
+
/** 在 Worker 中生成文件并触发下载 */
|
|
31
|
+
exportData: (data: DataRow[], options?: Omit<ExportDataOptions, 'progressCallback'>) => Promise<boolean>;
|
|
32
|
+
/** 在 Worker 中生成文件字节(不触发下载) */
|
|
33
|
+
generateBytes: (data: DataRow[], options?: Omit<ExportDataOptions, 'progressCallback'>) => Promise<Uint8Array | null>;
|
|
34
|
+
/** 销毁 Worker */
|
|
35
|
+
terminate: () => void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Worker 线程导出管理 Hook
|
|
39
|
+
*
|
|
40
|
+
* 接收一个 Worker 工厂函数,自动管理 Worker 生命周期和 WASM 初始化。
|
|
41
|
+
* 导出计算在 Worker 线程执行,主线程保持响应。
|
|
42
|
+
*
|
|
43
|
+
* @param createWorker - 创建 Worker 实例的工厂函数
|
|
44
|
+
*/
|
|
45
|
+
export declare function useWorkerExporter(createWorker: () => Worker): UseWorkerExporterReturn;
|
|
46
|
+
//# sourceMappingURL=use-worker-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-worker-exporter.d.ts","sourceRoot":"","sources":["../src/use-worker-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EACV,iBAAiB,EAEjB,OAAO,EACR,MAAM,mBAAmB,CAAC;AAE3B,kCAAkC;AAClC,MAAM,WAAW,uBAAuB;IACtC,8BAA8B;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,0BAA0B;IAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzG,8BAA8B;IAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACtH,gBAAgB;IAChB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAiCD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,MAAM,GAAG,uBAAuB,CA6MrF"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useWorkerExporter - Worker 线程导出管理 Hook
|
|
3
|
+
*
|
|
4
|
+
* 将 CSV/XLSX 生成移至 Worker 线程,主线程不阻塞。
|
|
5
|
+
* 用户需要传入一个已创建的 Worker 实例。
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* // Vite
|
|
10
|
+
* import ExportWorkerScript from '@bsg-export/worker/worker?worker';
|
|
11
|
+
* const { initialized, loading, progress, exportData } = useWorkerExporter(() => new ExportWorkerScript());
|
|
12
|
+
*
|
|
13
|
+
* // Webpack 5
|
|
14
|
+
* const { exportData } = useWorkerExporter(
|
|
15
|
+
* () => new Worker(new URL('@bsg-export/worker/worker', import.meta.url), { type: 'module' })
|
|
16
|
+
* );
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
20
|
+
let requestCounter = 0;
|
|
21
|
+
function generateId() {
|
|
22
|
+
return `req_${++requestCounter}_${Date.now()}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Worker 线程导出管理 Hook
|
|
26
|
+
*
|
|
27
|
+
* 接收一个 Worker 工厂函数,自动管理 Worker 生命周期和 WASM 初始化。
|
|
28
|
+
* 导出计算在 Worker 线程执行,主线程保持响应。
|
|
29
|
+
*
|
|
30
|
+
* @param createWorker - 创建 Worker 实例的工厂函数
|
|
31
|
+
*/
|
|
32
|
+
export function useWorkerExporter(createWorker) {
|
|
33
|
+
const [initialized, setInitialized] = useState(false);
|
|
34
|
+
const [loading, setLoading] = useState(false);
|
|
35
|
+
const [progress, setProgress] = useState(0);
|
|
36
|
+
const [error, setError] = useState(null);
|
|
37
|
+
const workerRef = useRef(null);
|
|
38
|
+
const pendingRef = useRef(new Map());
|
|
39
|
+
const mountedRef = useRef(true);
|
|
40
|
+
// 处理 Worker 消息
|
|
41
|
+
const handleMessage = useCallback((event) => {
|
|
42
|
+
if (!mountedRef.current)
|
|
43
|
+
return;
|
|
44
|
+
const { type, id, bytes, message, progress: prog } = event.data;
|
|
45
|
+
const pending = pendingRef.current.get(id);
|
|
46
|
+
if (!pending)
|
|
47
|
+
return;
|
|
48
|
+
switch (type) {
|
|
49
|
+
case 'ready':
|
|
50
|
+
pendingRef.current.delete(id);
|
|
51
|
+
pending.resolve(new ArrayBuffer(0));
|
|
52
|
+
break;
|
|
53
|
+
case 'result':
|
|
54
|
+
pendingRef.current.delete(id);
|
|
55
|
+
pending.resolve(bytes);
|
|
56
|
+
break;
|
|
57
|
+
case 'error':
|
|
58
|
+
pendingRef.current.delete(id);
|
|
59
|
+
pending.reject(new Error(message ?? '未知错误'));
|
|
60
|
+
break;
|
|
61
|
+
case 'progress':
|
|
62
|
+
if (pending.onProgress && prog !== undefined) {
|
|
63
|
+
pending.onProgress(prog);
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}, []);
|
|
68
|
+
// 处理 Worker 错误
|
|
69
|
+
const handleError = useCallback((event) => {
|
|
70
|
+
if (!mountedRef.current)
|
|
71
|
+
return;
|
|
72
|
+
const err = new Error(`Worker 错误: ${event.message}`);
|
|
73
|
+
for (const [id, pending] of pendingRef.current) {
|
|
74
|
+
pending.reject(err);
|
|
75
|
+
pendingRef.current.delete(id);
|
|
76
|
+
}
|
|
77
|
+
setError(err);
|
|
78
|
+
}, []);
|
|
79
|
+
// 初始化 Worker 和 WASM
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
mountedRef.current = true;
|
|
82
|
+
const worker = createWorker();
|
|
83
|
+
workerRef.current = worker;
|
|
84
|
+
worker.addEventListener('message', handleMessage);
|
|
85
|
+
worker.addEventListener('error', handleError);
|
|
86
|
+
// 发送 init 消息
|
|
87
|
+
const id = generateId();
|
|
88
|
+
const initPromise = new Promise((resolve, reject) => {
|
|
89
|
+
pendingRef.current.set(id, { resolve, reject });
|
|
90
|
+
});
|
|
91
|
+
const request = { type: 'init', id };
|
|
92
|
+
worker.postMessage(request);
|
|
93
|
+
initPromise
|
|
94
|
+
.then(() => {
|
|
95
|
+
if (mountedRef.current)
|
|
96
|
+
setInitialized(true);
|
|
97
|
+
})
|
|
98
|
+
.catch((err) => {
|
|
99
|
+
if (mountedRef.current)
|
|
100
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
101
|
+
});
|
|
102
|
+
return () => {
|
|
103
|
+
mountedRef.current = false;
|
|
104
|
+
// 拒绝所有待处理请求
|
|
105
|
+
for (const [, pending] of pendingRef.current) {
|
|
106
|
+
pending.reject(new Error('组件已卸载'));
|
|
107
|
+
}
|
|
108
|
+
pendingRef.current.clear();
|
|
109
|
+
worker.terminate();
|
|
110
|
+
workerRef.current = null;
|
|
111
|
+
};
|
|
112
|
+
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
113
|
+
/** 向 Worker 发送生成请求 */
|
|
114
|
+
const sendGenerate = useCallback((data, options) => {
|
|
115
|
+
const worker = workerRef.current;
|
|
116
|
+
if (!worker)
|
|
117
|
+
return Promise.reject(new Error('Worker 未创建'));
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
const id = generateId();
|
|
120
|
+
pendingRef.current.set(id, {
|
|
121
|
+
resolve,
|
|
122
|
+
reject,
|
|
123
|
+
onProgress: (p) => {
|
|
124
|
+
if (mountedRef.current)
|
|
125
|
+
setProgress(p);
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
const request = {
|
|
129
|
+
type: 'generate',
|
|
130
|
+
id,
|
|
131
|
+
data,
|
|
132
|
+
options: (options ?? {}),
|
|
133
|
+
};
|
|
134
|
+
worker.postMessage(request);
|
|
135
|
+
});
|
|
136
|
+
}, []);
|
|
137
|
+
/** 在主线程触发文件下载 */
|
|
138
|
+
const downloadFile = useCallback((bytes, filename, format) => {
|
|
139
|
+
const isXlsx = format === 1;
|
|
140
|
+
const mimeType = isXlsx
|
|
141
|
+
? 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
142
|
+
: 'text/csv;charset=utf-8';
|
|
143
|
+
const defaultExt = isXlsx ? 'xlsx' : 'csv';
|
|
144
|
+
let finalFilename = filename ?? `export.${defaultExt}`;
|
|
145
|
+
if (!finalFilename.endsWith(`.${defaultExt}`)) {
|
|
146
|
+
finalFilename = `${finalFilename}.${defaultExt}`;
|
|
147
|
+
}
|
|
148
|
+
const blob = new Blob([bytes.buffer], { type: mimeType });
|
|
149
|
+
const url = URL.createObjectURL(blob);
|
|
150
|
+
const anchor = document.createElement('a');
|
|
151
|
+
anchor.href = url;
|
|
152
|
+
anchor.download = finalFilename;
|
|
153
|
+
anchor.click();
|
|
154
|
+
setTimeout(() => URL.revokeObjectURL(url), 10_000);
|
|
155
|
+
}, []);
|
|
156
|
+
/** 在 Worker 中生成文件并触发下载 */
|
|
157
|
+
const exportData = useCallback(async (data, options) => {
|
|
158
|
+
if (!initialized)
|
|
159
|
+
return false;
|
|
160
|
+
setLoading(true);
|
|
161
|
+
setProgress(0);
|
|
162
|
+
setError(null);
|
|
163
|
+
try {
|
|
164
|
+
const buffer = await sendGenerate(data, options);
|
|
165
|
+
const bytes = new Uint8Array(buffer);
|
|
166
|
+
downloadFile(bytes, options?.filename, options?.format);
|
|
167
|
+
if (mountedRef.current)
|
|
168
|
+
setProgress(100);
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
if (mountedRef.current)
|
|
173
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
if (mountedRef.current)
|
|
178
|
+
setLoading(false);
|
|
179
|
+
}
|
|
180
|
+
}, [initialized, sendGenerate, downloadFile]);
|
|
181
|
+
/** 在 Worker 中生成文件字节(不触发下载) */
|
|
182
|
+
const generateBytes = useCallback(async (data, options) => {
|
|
183
|
+
if (!initialized)
|
|
184
|
+
return null;
|
|
185
|
+
setLoading(true);
|
|
186
|
+
setProgress(0);
|
|
187
|
+
setError(null);
|
|
188
|
+
try {
|
|
189
|
+
const buffer = await sendGenerate(data, options);
|
|
190
|
+
if (mountedRef.current)
|
|
191
|
+
setProgress(100);
|
|
192
|
+
return new Uint8Array(buffer);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
if (mountedRef.current)
|
|
196
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
if (mountedRef.current)
|
|
201
|
+
setLoading(false);
|
|
202
|
+
}
|
|
203
|
+
}, [initialized, sendGenerate]);
|
|
204
|
+
/** 手动销毁 Worker */
|
|
205
|
+
const terminate = useCallback(() => {
|
|
206
|
+
for (const [, pending] of pendingRef.current) {
|
|
207
|
+
pending.reject(new Error('Worker 已被手动销毁'));
|
|
208
|
+
}
|
|
209
|
+
pendingRef.current.clear();
|
|
210
|
+
workerRef.current?.terminate();
|
|
211
|
+
workerRef.current = null;
|
|
212
|
+
if (mountedRef.current) {
|
|
213
|
+
setInitialized(false);
|
|
214
|
+
}
|
|
215
|
+
}, []);
|
|
216
|
+
return {
|
|
217
|
+
initialized,
|
|
218
|
+
loading,
|
|
219
|
+
progress,
|
|
220
|
+
error,
|
|
221
|
+
exportData,
|
|
222
|
+
generateBytes,
|
|
223
|
+
terminate,
|
|
224
|
+
};
|
|
225
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsg-export/react",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "belobog-stellar-grid 的 React 官方封装组件",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"@bsg-export/types": "file:../types"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@types/react": "^19.
|
|
44
|
-
"react": "^19.
|
|
45
|
-
"typescript": "^5.
|
|
43
|
+
"@types/react": "^19.2.14",
|
|
44
|
+
"react": "^19.2.4",
|
|
45
|
+
"typescript": "^5.9.3"
|
|
46
46
|
}
|
|
47
47
|
}
|