功能偵測跟瀏覽器填充工具
一、功能偵測(Feature Detection)
概念
功能偵測是先檢查瀏覽器是否支援某個特定功能,再決定是否使用它,而不是直接依賴瀏覽器的名稱或版本。
為什麼需要
瀏覽器版本繁多,僅依賴「User-Agent 判斷瀏覽器」的方法不可靠。功能偵測能確保程式碼只在支援的環境下執行,減少錯誤。
常見做法
- 原生 JS 檢查
if ('fetch' in window) {
// 瀏覽器支援 fetch API
fetch('/api/data')
.then(response => response.json())
.then(data => console.log(data));
} else {
// 不支援 fetch,使用傳統 XMLHttpRequest 或其他替代方案
console.log('瀏覽器不支援 fetch');
}
- 使用功能偵測函式庫
- Modernizr:最知名的 JS 功能偵測庫,能幫你檢查 HTML5、CSS3 等各種功能。
if (Modernizr.flexbox) {
console.log('支援 flexbox');
} else {
console.log('不支援 flexbox');
}
二、瀏覽器填充工具(Polyfill)
概念
Polyfill 是一段程式碼或函式庫,提供瀏覽器原生不支援的功能,讓開發者可以使用新 API 或標準功能,即使瀏覽器舊版本也能正常運作。
舉例
- ES6 Promise
- 舊瀏覽器不支援
Promise,我們可以引入 polyfill:
<script src="https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.auto.min.js"></script>
這樣即便瀏覽器不支援原生 Promise,也能正常使用:
new Promise((resolve) => resolve('Hello Polyfill'))
.then(msg => console.log(msg));
- Fetch API
- 用 whatwg-fetch polyfill:
import 'whatwg-fetch';
fetch('/api/data')
.then(response => response.json())
.then(data => console.log(data));
與功能偵測的關係
-
功能偵測通常先檢查瀏覽器是否支援某個功能。
-
若不支援,再使用 polyfill 來「填補缺失」,確保程式碼能運作。
三、實務建議
-
盡量使用功能偵測
不要依賴瀏覽器名稱或版本判斷,因為可能會錯過某些支援的功能。 -
必要時加入 Polyfill
對於核心功能且必須支援舊瀏覽器時,才使用 polyfill,避免增加不必要的檔案大小。 -
配合打包工具
在 React、Vite 或 Webpack 專案中,可以使用core-js或@babel/preset-env自動加入 polyfill,根據目標瀏覽器自動選擇。