HyperAI超神经
Back to Headlines

超轻量级 S3 客户端 s3mini 登陆 GitHub:专为边缘计算优化,性能提升 15%

8 days ago

s3mini:轻量级且高效的S3客户端 s3mini 是一个超轻量级的 TypeScript 客户端,专为 S3 兼容对象存储设计。它的体积仅为约 14 KB(未压缩),性能比其他 S3 客户端平均提高约 15%,适用于 Node.js、Bun 和 Cloudflare Workers 等边缘计算平台。该库已在多个存储服务上进行了测试,包括 Cloudflare R2、Backblaze B2、DigitalOcean Spaces 和 MinIO,未来还将支持 Ceph 和 AWS。 主要功能 轻量且快速:仅 14 KB 大小(未压缩),性能提高了约 15%。 零依赖:自包含所有必要的代码,支持 AWS SigV4 签名机制,无需预签名请求。 理想边缘计算环境:在 Node.js、Bun 和 Cloudflare Workers 上运行,不支持浏览器环境。 核心 S3 API 支持:实现基本的对象存储操作,如创建、上传、下载、删除对象和列出对象。 自定义 S3 兼容桶:用户可以使用自己的 S3 兼容桶(已测试的服务有 Cloudflare R2、Backblaze B2、DigitalOcean Spaces 和 MinIO)。 支持的操作 桶操作 bucketExists:检查桶是否存在。 createBucket:创建新的桶。 对象操作 objectExists:检查对象是否存在。 putObject:上传对象到桶中。 getObject:从桶中下载对象。 getObjectRaw:支持分块下载对象。 deleteObject:删除桶中的对象。 listObjects:列出桶中的所有对象。 listObjectsV2:使用 V2 API 列出对象,支持分页。 getEtag:获取对象的 ETag(校验码)。 sanitizeETag:处理 ETag 字符串,移除双引号。 分段上传 getMultipartUploadId:获取新的多部分上传 ID。 uploadPart:上传多部分对象的一个片段。 completeMultipartUpload:完成多部分上传。 abortMultipartUpload:中止多部分上传。 listMultipartUploads:列出正在进行的多部分上传。 使用示例 ```typescript import { s3mini, sanitizeETag } from 's3mini'; const s3client = new s3mini({ accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey, endpoint: config.endpoint, region: config.region, }); // 检查桶是否存在 let exists = false; try { exists = await s3client.bucketExists(); } catch (err) { throw new Error(检查桶存在时出错:${err.message}); } if (!exists) { // 创建桶 await s3client.createBucket(); } // 对象操作示例 const objectKey = 'small-object.txt'; const objectContent = 'Hello, world!'; if (!(await s3client.objectExists(objectKey))) { const resp = await s3client.putObject(objectKey, objectContent); const etag = sanitizeETag(resp.headers.get('etag')); console.log('对象已上传,ETag:', etag); } const objectData = await s3client.getObject(objectKey); console.log('对象数据:', objectData); // 删除对象 const wasDeleted = await s3client.deleteObject(objectKey); console.log('对象已删除:', wasDeleted); // 分段上传示例 const largeBuffer = new Uint8Array(1024 * 1024 * 15); // 15 MB 缓冲区 const partSize = 8 * 1024 * 1024; // 8 MB 每个分段 const totalParts = Math.ceil(largeBuffer.length / partSize); const uploadId = await s3client.getMultipartUploadId('multipart-object.txt'); const uploadPromises = []; for (let i = 0; i < totalParts; i++) { const partBuffer = largeBuffer.subarray(i * partSize, (i + 1) * partSize); uploadPromises.push(s3client.uploadPart('multipart-object.txt', uploadId, partBuffer, i + 1)); } const uploadResponses = await Promise.all(uploadPromises); const parts = uploadResponses.map((response, index) => ({ partNumber: index + 1, etag: response.etag, })); const completeResponse = await s3client.completeMultipartUpload('multipart-object.txt', uploadId, parts); console.log('多部分上传完成,ETag:', completeResponse.etag); // 分段下载示例 const rangeStart = 2048 * 1024; // 2 MB const rangeEnd = 8 * 1024 * 1024 * 2; // 16 MB const rangeResponse = await s3client.getObjectRaw('multipart-object.txt', false, rangeStart, rangeEnd); const rangeData = await rangeResponse.arrayBuffer(); console.log('分段下载数据:', rangeData); ``` 安装 npm install s3mini 该库使用 Node.js APIs 和 polyfills,因此不支持浏览器环境。在 Cloudflare Workers 中使用时,需要添加 nodejs_compat 兼容标志。 安全和贡献 s3mini 欢迎社区贡献。报告问题和提交 PR 时,请详细描述环境、错误消息和复现步骤。在贡献代码时,应保持库的轻量级特性,避免添加复杂的依赖。项目采用 MIT 许可证进行开源,并接受赞助支持其持续开发和维护。 此外,s3mini 的开发者特别强调了社区行为准则,鼓励尊重和支持性的交流,确保项目环境的友好与开放。 业内人士评价 s3mini 被视为一个非常重要的工具,特别是在边缘计算和低资源环境中。它的小巧和高性能使其成为许多开发者的首选 S3 客户端。开发者表示,s3mini 的设计理念是保持轻量化,同时提供关键的功能支持,这使得它在多种应用场景下表现出色。该库的开发者还致力于不断改进和优化,确保其在未来的技术发展中继续占据优势。

Related Links