2025-03-02-Vue 中如何 **統一管理並釋放 Blob URL 資源

2025-03-02-Vue 中如何 **統一管理並釋放 Blob URL 資源

一步步了解在 Vue 中如何 統一管理並釋放 Blob URL 資源,這樣你的應用程式會更穩定、不會記憶體泄漏 💪


🎯 目標

當我們在 Vue 中用 URL.createObjectURL() 建立了下載連結,要記得:

  • ⚠️ 每次都 記錄建立的 URL
  • 🧹 在不需要時 釋放記憶體

✅ 作法一:使用 onUnmounted() 清理資源

Vue 提供的 onUnmounted() lifecycle hook,可以在元件被移除時清理資源!


✅ 範例:下載 JSON 並確保釋放記憶體

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<script setup>
import { ref, onUnmounted } from 'vue'

const apiKey = '你的API'
const url = `https://opendata.cwa.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=${apiKey}`

// 記錄 blob URL
const blobUrl = ref(null)

const downloadWeatherJSON = async () => {
try {
const response = await fetch(url)
const data = await response.json()
const json = JSON.stringify(data)

// 建立 Blob 並產生 URL
const blob = new Blob([json], { type: 'application/json' })
blobUrl.value = URL.createObjectURL(blob)

const a = document.createElement('a')
a.href = blobUrl.value
a.download = 'weather_data.json'
a.click()
} catch (error) {
console.error('❌ 發生錯誤:', error)
}
}

// 🔁 清理資源
onUnmounted(() => {
if (blobUrl.value) {
URL.revokeObjectURL(blobUrl.value)
console.log('🧹 已釋放 Blob URL 記憶體')
}
})
</script>

<template>
<button @click="downloadWeatherJSON">下載天氣 JSON</button>
</template>

📌 為什麼這樣設計?

概念 原因
ref(blobUrl) 要追蹤目前建立的 Blob URL,才能記得釋放
onUnmounted() 當元件被卸載時(例如換頁),就能清除記憶體
URL.revokeObjectURL(...) 主動釋放資源,避免佔用記憶體

💡 延伸技巧:若有多個 blob,要清多個?

你可以用陣列來管理:

1
2
3
4
5
const blobUrls = ref([])

onUnmounted(() => {
blobUrls.value.forEach(url => URL.revokeObjectURL(url))
})

✅ 結語

這種做法可以幫助你:

  • 寫出更健壯的 Vue 元件
  • 管理「瀏覽器資源」(如 Blob、音訊、影片等)
  • 避免記憶體長期佔用,提升效能