后台jsx和css文件是程序自动生成的,我们需要下载下来在其他项目中使用,单独下载很麻烦,所以我们将这些文件打包成一个zip包,只需将其解压缩并将其放入现有项目中即可。以前这种下载都是后端同学支持,或者提供数据,在前端拼接数据生成zip包。此类需求开发尚属首次。经过一系列的尝试,终于用jszip实现了。节点服务器实现代码constfs=require('fs');constpath=require('路径');constJSZip=require('jszip');constjsxPath=path.join(__dirname,'../output/taro.jsx');constcssPath=path.join(__dirname,'../output/index.less');router.get('/download',(req,res)=>{res.setHeader('Content-Type','application/zip');constzip=newJSZip();//声明一个压缩文件夹constfolder=zip.folder("code");//将文件添加到文件夹中//如果需要,将文件夹压缩到目录下,然后循环当前文件夹,//将文件名和文件内容逐一添加到文件夹中folder.file('taro.jsx',fs.readFileSync(jsxPath));folder.file('index.less',fs.readFileSync(cssPath));//通过base64类型生成zip内容zip.generateAsync({type:'base64'}).then(content=>{res.status(200).send(content);});});客户端实现handleDownload=async()=>{//使用封装的axios与服务器交互const{data}=awaithttp('/download');constzip=newJSZip();//获取的数据使用base64加载awaitzip.loadAsync(data,{base64:true});//生成blob形式的文件constblob=awaitzip.generateAsync({type:'blob'});consturl=window.URL.createObjectURL(blob);//正常下载操作constlink=document.createElement('a');link.setAttribute('href',url);link.setAttribute('下载','code.zip');document.body.appendChild(链接);链接.点击();link.remove();}总结一个小函数,折腾了半下午。按照我最初的想法,我直接用node生成了一个zip文件,然后用res。解决这个问题,看到提示使用nativexmlhttprequest,但是并没有解决由此带来的问题。今天瞎折腾了,成功了。让我们记录一下。
