如何移植Buffer.from()到Deno2,实现Node与Deno2跨环境兼容
跨Node/Deno2的Base64 Gzip解码实现
以下是无需额外NPM依赖、同时兼容Node和Deno2的实现代码:
// Node环境需提前导入zlib模块:import zlib from 'node:zlib'; // Deno环境无需额外导入 function from_base64_gzip(str) { // 跨环境Base64解码为二进制数据 let binaryData; if (typeof Buffer !== 'undefined') { // Node环境:用Buffer直接解码Base64 binaryData = Buffer.from(str, 'base64'); } else { // Deno环境:先解码Base64为字符串,再转为Uint8Array const decodedStr = atob(str); binaryData = new Uint8Array(decodedStr.length); for (let i = 0; i < decodedStr.length; i++) { binaryData[i] = decodedStr.charCodeAt(i); } } // 跨环境解压缩Gzip数据 let decompressedData; if (typeof zlib !== 'undefined') { // Node环境:用zlib同步解压缩并转UTF-8字符串 decompressedData = zlib.unzipSync(binaryData).toString('utf-8'); } else { // Deno环境:用内置decompressSync解压缩,再转UTF-8字符串 decompressedData = new TextDecoder('utf-8').decode(Deno.decompressSync(binaryData, "gzip")); } return JSON.parse(decompressedData); }
关键实现说明
- Base64解码适配:
- Node端直接利用
Buffer.from(str, 'base64')完成Base64到二进制的转换,这是Node的原生能力。 - Deno端通过
atob()解码Base64为ASCII字符串,再遍历字符串将每个字符的Unicode编码转为字节值,生成Uint8Array类型的二进制数据。
- Node端直接利用
- Gzip解压缩适配:
- Node端使用内置的
zlib.unzipSync同步解压缩,直接将结果转为UTF-8字符串。 - Deno端使用内置的
Deno.decompressSync(需指定"gzip"格式),再通过TextDecoder将二进制数据转为UTF-8字符串。
- Node端使用内置的
- 环境判断逻辑:通过检查全局对象中
Buffer和zlib的存在性区分Node/Deno环境,无需额外依赖。
内容的提问来源于stack exchange,提问作者Jeroen Ooms
相关产品推荐
相关产品推荐

