[Svelte] ブラウザで ZIP ファイルを作成しダウンロードする

2024-11-27
jszip を使えばめちゃくちゃ簡単だった 
jszip
ブラウザでも Node.js でも動くらしい
</>
$ pnpm add jszip
コード
</>
<script lang="ts">
	import JSZip from 'jszip'

	async function handleClick() {
		// zip を作成
		const zip = new JSZip()
		zip.file('README.md', '# hello')
		zip.file('aa/README.md', '# aa')
		zip.file('bb/README.md', '# bb')

		// blob へ
		const blob = await zip.generateAsync({ type: 'blob' })
		const url = URL.createObjectURL(blob)

		// リンク作成
		const link = document.createElement('a')
		link.download = 'archive.zip' // ファイル名
		link.href = url
		link.click()

		// メモリ解放らしい
		URL.revokeObjectURL(url)
	}
</script>

<button on:click|preventDefault={handleClick}>
	download
</button>