HTML本身不支持ZIP压缩,必须依赖JSZip等前端库或后端服务;JSZip默认按Latin-1处理中文文件名,需保持原始Unicode传入、用{binary:true}、配合FileSaver.js的saveAs()确保正确下载。

不能直接用浏览器“另存为”生成 ZIP——HTML 本身不支持压缩,必须靠 JS 前端库或后端服务动态打包。
前端用 JSZip 打包 HTML 文件时中文名乱码
JSZip 默认把文件名当 Latin-1 处理,传 "文章.html" 进去,解压后可能变成 æ–‡ç« . html。这不是文件内容乱码,是 ZIP 元数据编码没设对。
- 必须显式加
{ binary: true }参数调用zip.file(),哪怕内容是字符串 - 文件名本身别做任何 URL 编码或 encodeURIComponent,保持原始 Unicode 字符传入
- 最终下载必须用
saveAs(blob, "导出.zip")(来自 FileSaver.js),它会自动处理filename*HTTP 头格式;若自己用a.download+URL.createObjectURL(),中文名在 Safari 和部分 Edge 版本里会失效 - IE11 完全不支持 UTF-8 文件名,得降级提示用户换浏览器,别白费劲打补丁
打包前不检查相对路径,ZIP 发给别人就打不开
很多人把 index.html、css/style.css、assets/logo.png 全塞进 ZIP,结果对方双击打开白屏——不是 ZIP 问题,是 HTML 里写的 <link href="/css/style.css"> 或 <img src="https://cdn.com/logo.png">。
- 所有
src、href、CSS 里的url()必须是相对路径,且以./、css/、../assets/开头,不能含http://或/开头的绝对路径 - 打包前先关掉本地服务器,用 Chrome 直接双击打开
index.html,看 Console 有没有net::ERR_FILE_NOT_FOUND - Network 面板过滤
file://协议请求,状态码为 0 或空白响应的,就是路径错了 - 如果用了
<base href="/>,务必删掉——file://下 base 标签基本不可靠
大文件或大量资源用前端 JSZip 会卡死或崩溃
Chrome 对单次 JS 内存分配有限制,加载 20 个以上、每个 >3MB 的图片再塞进 JSZip,大概率触发 RangeError: Array buffer allocation failed 或页面无响应。
立即学习“前端免费学习笔记(深入)”;
- 单文件超过 5MB 就该考虑后端方案;几十个小文件(如图标、字体)可批量 fetch,但要加
Promise.allSettled()捕获个别失败,别让一个 404 拖垮整个打包 - 不要在
zip.file()里传 DOM 元素或 jQuery 对象,只传字符串或ArrayBuffer - 生成阶段必须用
zip.generateAsync({ type: "blob" }),generate()已废弃,新版 JSZip 会报错 - 移动端 Safari 对 Blob URL 支持差,
saveAs()可能静默失败,需 fallback 到提示“请用桌面浏览器下载”
真正难的不是怎么压 ZIP,而是确保 ZIP 里的 HTML 能离线跑通——路径、协议、编码、资源完整性,漏一个,别人点开就是白屏或报错。动手前先双击测试,比写十行 JS 更管用。



















