node-modules / compressing

Everything you need for compressing and uncompressing
MIT License
436 stars 34 forks source link

zip.Stream 的 addEntry 不能在多个事件循环中使用 #60

Open weijiafu14 opened 3 years ago

weijiafu14 commented 3 years ago

const { zip } = require('compressing'); const fs = require('fs') const zipStream = new zip.Stream(); zipStream.addEntry('test.html') setTimeout(() => { zipStream.addEntry('yarn.lock') setTimeout(() => { zipStream.addEntry('package.json') setTimeout(() => { zipStream.pipe(fs.createWriteStream('test.zip')); }, 3000) }, 3000) }, 3000)

这段代码最终压缩包里只会有test.html ,原因是每次addEntry后都会调用 finalize ,会使依赖的yazl.zipFile 调用end,调用了end后,会使zipFile处理完最后一个文件后如果没有其他Entry就关闭流,导致压缩结束,所以处理完已添加的文件前如果 addEntry 没调用到,流就会关闭,再调用就不起作用, 所以安全起见,addEntry 要一次性同步调完,或者需要异步用yazl

IQZoe commented 2 years ago

我使用for循环依次addEntry,每次add的是个流,发现压缩后的文件偶发性的会减少