확장 API
각 브라우저는 확장 API에 접근하기 위해 서로 다른 전역 변수를 제공합니다 (Chrome은 chrome
, Firefox는 browser
등을 제공).
WXT는 이를 단순화합니다. 항상 browser
를 사용하세요:
browser.action.onClicked.addListener(() => {
// ...
});
이 외에는 특정 API를 사용하는 방법에 대해 Chrome과 Mozilla의 문서를 참조하세요. 일반 확장 프로그램이 할 수 있는 모든 것은 WXT에서도 가능하며, 단지 chrome
대신 browser
를 사용합니다.
웹 익스텐션 폴리필
v0.1.0
부터 지원
기본적으로 WXT는 Mozilla의 webextension-polyfill
을 사용하여 브라우저 간에 익스텐션 API를 일관되게 만듭니다.
타입에 접근하려면 wxt/browser
에서 관련 네임스페이스를 임포트해야 합니다:
import { Runtime } from 'wxt/browser';
function handleMessage(message: any, sender: Runtime.Sender) {
// ...
}
폴리필 비활성화
v0.19.0
이후
2024년 6월 MV3 출시와 함께 Chrome이 MV2를 공식적으로 지원 중단하면서, 폴리필은 더 이상 유용한 역할을 하지 않습니다.
다음과 같이 한 줄로 폴리필을 비활성화할 수 있습니다:
// wxt.config.ts
export default defineConfig({
extensionApi: 'chrome',
});
이 설정은 wxt/browser
가 런타임에 브라우저에 따라 browser
또는 chrome
전역 변수를 그대로 내보내도록 변경합니다:
export const browser: WxtBrowser =
// @ts-expect-error
globalThis.browser?.runtime?.id == null
? globalThis.chrome
: // @ts-expect-error
globalThis.browser;
폴리필이 비활성화된 상태에서는 타입에 접근하는 방식이 조금 다릅니다. 타입을 임포트할 필요 없이 browser
객체 자체에서 사용할 수 있습니다:
function handleMessage(message: any, sender: browser.runtime.Sender) {
// ...
}
기능 탐지
매니페스트 버전과 브라우저에 따라 일부 API는 런타임에 사용할 수 없습니다. API가 사용 불가능한 경우 undefined
가 됩니다.
WARNING
타입은 여기서 도움이 되지 않습니다. WXT가 제공하는 browser
타입은 모든 API가 존재한다고 가정합니다. API의 사용 가능 여부를 확인하는 것은 여러분의 책임입니다.
API가 사용 가능한지 확인하려면 기능 탐지를 사용하세요:
if (browser.runtime.onSuspend != null) {
browser.runtime.onSuspend.addListener(() => {
// ...
});
}
여기서 옵셔널 체이닝이 가장 유용합니다:
browser.runtime.onSuspend?.addListener(() => {
// ...
});
또는 MV2와 MV3를 모두 지원하기 위해 다른 이름의 유사한 API를 사용하려는 경우 다음과 같이 할 수 있습니다:
(browser.action ?? browser.browser_action).onClicked.addListener(() => {
//
});