Node.js解压ZIP需避开adm-zip默认UTF-8编码坑:Windows打包多用GBK,须用iconv-lite显式decode(entry.rawEntryName,'gbk'),遍历entries逐个处理,禁用extractAllTo(),路径用path.resolve()确保绝对路径。

直接用 Node 脚本解压 ZIP,别碰 adm-zip 的默认编码坑
Node 本身不带 ZIP 解压能力,adm-zip 是最常用的选择,但它默认按 UTF-8 解码文件名——而 Windows 上打包的 ZIP 多用 GBK 编码,结果就是中文路径全变 。你得手动转码。
- 装依赖:
npm install adm-zip iconv-lite --save - 解压时显式指定编码:
iconv.decode(entry.rawentryname, 'gbk')(不是entry.entryname,那是已处理过的) - 路径必须用绝对路径,相对路径容易因
process.cwd()变化出错;可用path.resolve(__dirname, 'xxx.zip') - 别用
zip.extractAllTo()一次性解,它不支持编码干预;要遍历zip.getEntries(),逐个 decode + write
zlib 只能解 .gz,不是 ZIP,别混用
zlib.createGunzip() 只处理单个 .gz 文件(比如 data.json.gz),不能解 .zip 或 .tar.gz。后者是归档+压缩两层结构,zlib 碰不了。
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
- 正确用法:
fs.createReadStream('file.txt.gz').pipe(zlib.createGunzip()).pipe(fs.createWriteStream('file.txt')) - 如果拿到的是
.tar.gz,得先用tar-stream或archiver拆归档层,再用zlib解压内容 - Windows 用户注意:
.gz文件极少单独出现,多数是 Linux 服务端吐出来的响应体,本地调试时建议用真实gzip命令验证是否可解
远程开发(SSH/WSL)下 Node 解压,先确认远端有没有 unzip
你在 VSCode 里跑 Node 脚本,但脚本执行环境是远程机器。如果远端没装 unzip 或 gzip,adm-zip 这类纯 JS 库还能用;但如果你调了 child_process.exec('unzip ...'),就会卡死。
- 检查远端命令是否存在:
ssh user@host 'which unzip'或在 VSCode 终端里直接敲unzip -v - Alpine Linux 默认没有
unzip,得先apk add unzip;Debian/Ubuntu 是apt install unzip - Node 脚本里调系统命令,务必加错误监听:
child_process.exec(cmd, (err, stdout, stderr) => { if (err) console.error(stderr); }),否则失败静默
VSCode 插件解压和 Node 解压,根本不是一回事
插件(如 Zip Explorer)只是调系统命令或封装前端解压逻辑,它不走你的项目 Node 环境;而你在 .js 里写的解压逻辑,是运行在项目 runtime 里的,可以和 fs、path、构建流程打通。
- 想自动解压构建产物?写 Node 脚本,挂到
npm run extract里,别依赖右键菜单 - 插件右键“Extract Here”失败,大概率是远端没
unzip或 ZIP 含非标准编码,此时插件不会报错,只会没反应 - 需要解压后触发后续操作(比如启动 dev server),只有 Node 脚本能串起来,插件做不到

















