更新记录

1.0.0(2026-09-30) 下载此版本

1.0.0 初始化


平台兼容性

uni-app x(5.26)

Chrome Safari Android iOS 鸿蒙 微信小程序
√ √ √ √ √ √

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × × √

uni-zstd

基于 uasm 的 zstd 压缩/解压插件。底层为 C 语言实现的 zstd, 通过 uni-gyp 编译为 App、web、微信和支付宝小程序平台产物,可在 uni-app x 平台用统一 API 调用。

平台支持

平台 支持 说明
App(Android / iOS / HarmonyOS) ✓ 同步、异步 API 均可用
Web(Chrome / Safari) ✓ 仅异步 API
微信小程序 ✓ 仅异步 API,不支持多线程

安装

将 uni-zstd 导入项目的 uni_modules/ 目录,无需打包自定义基座。

用法一:UASM API

UASM 插件通过 uni.loadUasm() / uni.loadUasmSync() 加载后,得到导出的方法集,再进行压缩/解压。

  • uni.loadUasm():异步加载,返回 Promise<UniZstd>,全平台适用。
  • uni.loadUasmSync():同步加载,仅 App 平台支持。

导出类型 UniZstd 见 uasm/index.d.ts,仅用于 IDE 语法提示。

一次性压缩 / 解压

let libzstd : UniZstd | null = null

async function loadZstd() {
  libzstd = await uni.loadUasm('uni_modules/uni-zstd')
}

// 压缩:input 支持 string 或 ArrayBuffer
async function compressText(text : string) : Promise<ArrayBuffer> {
  return await libzstd!.compress(text, 3)
}

// 解压:入参为 ArrayBuffer
async function decompressData(data : ArrayBuffer) : Promise<string> {
  const result = await libzstd!.decompress(data)
  return new TextDecoder().decode(result)
}

流式压缩 / 解压

数据量较大、需要分块处理时,可使用 Compressor / Decompressor 类。

// 流式压缩
async function streamCompress(chunks : string[]) : Promise<ArrayBuffer> {
  const compressor = new libzstd!.Compressor(3)
  const parts = [] as ArrayBuffer[]

  for (let i = 0; i < chunks.length; i++) {
    parts.push(await compressor.update(chunks[i]))
  }
  parts.push(await compressor.finish())

  await compressor.close()
  compressor.delete()
  return concatBuffers(parts)
}

// 流式解压
async function streamDecompress(chunks : ArrayBuffer[]) : Promise<ArrayBuffer> {
  const decompressor = new libzstd!.Decompressor()
  const parts = [] as ArrayBuffer[]

  for (let i = 0; i < chunks.length; i++) {
    // 最后一块传入 finish 前需先 update 完所有数据
    parts.push(await decompressor.update(chunks[i]))
  }
  parts.push(await decompressor.finish())

  await decompressor.close()
  decompressor.delete()
  return concatBuffers(parts)
}

用法二:UTS 插件 API

在 App 平台也可直接 import 插件封装的同步方法。方法签名与 uasm 一致,但为同步返回。

import { compress, decompress } from '@/uni_modules/uni-zstd'

// 压缩
const compressed = compress('hello uni-app x', 3) as ArrayBuffer | null

// 解压
const restored = decompress(compressed!) as ArrayBuffer | null
const text = new TextDecoder().decode(restored!)

API 参考

compress

一次性压缩。

compress(input : string | ArrayBuffer, level ?: number, workers ?: number) : Promise<ArrayBuffer>
参数 类型 说明
input string \| ArrayBuffer 待压缩数据
level number 压缩级别,范围 1~22,默认 3,越大压缩率越高但越慢
workers number 并行线程数(仅部分平台生效)

decompress

一次性解压。

decompress(input : ArrayBuffer, maxOutputSize ?: number) : Promise<ArrayBuffer>
参数 类型 说明
input ArrayBuffer 已压缩数据
maxOutputSize number 解压结果最大字节数,默认 512 1024 1024

Compressor

流式压缩器。

new Compressor(level ?: number, workers ?: number)
方法 说明
update(input : string \| ArrayBuffer) : Promise<ArrayBuffer> 追加一段待压缩数据,返回本次产生的压缩数据
finish() : Promise<ArrayBuffer> 结束压缩,返回剩余压缩数据
close() : Promise<void> 释放压缩上下文
delete() : Promise<void> 释放对象,需在 close() 之后调用

Decompressor

流式解压器。

new Decompressor(maxOutputSize ?: number)
方法 说明
update(input : ArrayBuffer) : Promise<ArrayBuffer> 追加一段待解压数据,返回本次解压出的数据
finish() : Promise<ArrayBuffer> 结束解压,返回剩余解压数据
close() : Promise<void> 释放解压上下文
delete() : Promise<void> 释放对象,需在 close() 之后调用

UTS 同步 API

App 平台专用,其余参数与 uasm 一致,返回 ArrayBuffer | null(加载失败时返回 null)。

import { compress, decompress } from '@/uni_modules/uni-zstd'

compress(input : string | ArrayBuffer, level ?: number) : ArrayBuffer | null
decompress(input : ArrayBuffer, maximumOutputSize ?: number) : ArrayBuffer | null

注意事项

  1. 压缩级别范围为 1~22,默认 3。
  2. 解压结果默认上限为 512MB,超过时需通过 maxOutputSize 指定更大的值。
  3. uni.loadUasm() 异步、全平台可用;uni.loadUasmSync() 与 UTS 插件 API 仅 App 平台可用。
  4. uasm 返回值为 ArrayBuffer,文本数据需用 TextDecoder 解码。
  5. 微信小程序不支持多线程,workers 参数在小程序平台不生效。
  6. 流式处理后需依次调用 close() 和 delete() 释放资源。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

uni-zstd(以下简称软件)源码使用许可协议

2022年10月

本许可协议,是数字天堂(北京)网络技术有限公司(以下简称DCloud)对其所拥有著作权的“软件”,提供的使用许可协议。

您对“软件”的复制、使用、修改及分发受本许可协议的条款的约束,如您不接受本协议,则不能使用、复制、修改本软件。

授权许可范围

a) 授予您永久性的、全球性的、免费的、非独占的、不可撤销的本软件的源码使用许可,您可以使用这些源码制作自己的应用。

b) 您只能在DCloud产品体系内使用本软件及其源码。您不能将源码修改后运行在DCloud产品体系之外的环境,比如客户端脱离uni-app。

c) DCloud未向您授权商标使用许可。您在根据本软件源码制作自己的应用时,需以自己的名义发布软件,而不是以DCloud名义发布。

d) 本协议不构成代理关系。

DCloud的责任限制 “软件”在提供时不带任何明示或默示的担保。在任何情况下,DCloud不对任何人因使用“软件”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。

您的责任限制

a) 您需要在授权许可范围内使用软件。

b) 您在分发自己的应用时,不得侵犯DCloud商标和名誉权利。

c) 您不得进行破解、反编译、套壳等侵害DCloud知识产权的行为。您不得利用DCloud系统漏洞谋利或侵害DCloud利益,如您发现DCloud系统漏洞应第一时间通知DCloud。您不得进行攻击DCloud的服务器、网络等妨碍DCloud运营的行为。未经书面许可,您不得利用DCloud的产品进行与DCloud争夺开发者的行为。

d) 如您违反本许可协议,需承担因此给DCloud造成的损失。

本协议签订地点为中华人民共和国北京市海淀区。

根据发展,DCloud可能会对本协议进行修改。修改时,DCloud会在产品或者网页中显著的位置发布相关信息以便及时通知到用户。如果您选择继续使用本框架,即表示您同意接受这些修改。

条款结束

暂无用户评论。