> ## Documentation Index
> Fetch the complete documentation index at: https://extension.js.org/llms.txt
> Use this file to discover all available pages before exploring further.

# 跨瀏覽器擴充功能框架

> 用同一份專案為 Chrome、Edge 與 Firefox 打造瀏覽器擴充功能，提供 manifest 編譯、儲存時的快速重新載入，以及可上架的封裝。

<script
  type="application/ld+json"
  dangerouslySetInnerHTML={{
__html: JSON.stringify({
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  name: "Extension.js",
  applicationCategory: "DeveloperApplication",
  operatingSystem: "Windows, macOS, Linux",
  description:
    "Cross-browser extension framework for Chrome, Edge, and Firefox. One project, one manifest.json, browser-specific output, and reload behavior tuned for service workers and content scripts.",
  url: "https://extension.js.org",
  downloadUrl: "https://www.npmjs.com/package/extension",
  softwareVersion: "latest",
  offers: {
    "@type": "Offer",
    price: "0",
    priceCurrency: "USD",
  },
  author: {
    "@type": "Organization",
    name: "Extension.js authors",
    url: "https://github.com/extension-js",
  },
  license: "https://github.com/extension-js/extension.js/blob/main/LICENSE",
}),
}}
/>

<script
  type="application/ld+json"
  dangerouslySetInnerHTML={{
__html: JSON.stringify({
  "@context": "https://schema.org",
  "@type": "FAQPage",
  mainEntity: [
    {
      "@type": "Question",
      name: "What is a browser extension?",
      acceptedAnswer: {
        "@type": "Answer",
        text: "A browser extension is software that adds features to Chrome, Firefox, Edge, or another browser. Extensions inject UI, react to browser events, and call privileged APIs the page itself cannot.",
      },
    },
    {
      "@type": "Question",
      name: "Is Extension.js a Chrome extension framework?",
      acceptedAnswer: {
        "@type": "Answer",
        text: "Yes. Extension.js works as a Chrome extension framework, and also as a Firefox and Edge extension framework, from the same project. Choose a target with --browser=chrome, --browser=firefox, or --browser=edge.",
      },
    },
    {
      "@type": "Question",
      name: "How does Extension.js handle hot module replacement during development?",
      acceptedAnswer: {
        "@type": "Answer",
        text: "Run npx extension dev and the CLI watches your project for changes. Edits to popups, content scripts, service workers, and options pages trigger the fastest safe update path: HMR when supported, targeted reloads otherwise.",
      },
    },
    {
      "@type": "Question",
      name: "How do I build one extension for Chrome, Edge, and Firefox?",
      acceptedAnswer: {
        "@type": "Answer",
        text: "Extension.js compiles a single codebase into browser-specific output. One set of commands produces correctly packaged builds for Chrome, Edge, Firefox, and other Chromium-based browsers. Each build gets the right manifest format, paths, and platform adjustments.",
      },
    },
    {
      "@type": "Question",
      name: "Can I use React, Preact, Vue, Svelte, or TypeScript?",
      acceptedAnswer: {
        "@type": "Answer",
        text: "Yes. Extension.js ships production-ready templates for React, Preact, Vue, Svelte, TypeScript, and plain JavaScript. Framework choice does not affect the core workflow.",
      },
    },
    {
      "@type": "Question",
      name: "Does Extension.js support Manifest V3?",
      acceptedAnswer: {
        "@type": "Answer",
        text: "Yes. The toolchain is built around Manifest V3 and the constraints browser stores enforce today: service workers, declarative APIs, updated permissions, and stricter packaging.",
      },
    },
    {
      "@type": "Question",
      name: "Is Extension.js free to use?",
      acceptedAnswer: {
        "@type": "Answer",
        text: "Yes. Extension.js is open source under the MIT license. There is no paid tier or usage cap.",
      },
    },
  ],
}),
}}
/>

<div className="mx-auto flex w-full max-w-6xl flex-col gap-24 px-6 py-16 sm:py-24">
  <section className="flex flex-col items-center text-center gap-8">
    {/* Browser dock logo grid (two rows) */}

    <div className="ext-dock mx-auto w-full">
      <div className="ext-dock-row ext-dock-row-top">
        <div className="ext-dock-tile">
          <img src="https://media.extension.land/logos/browsers/brave.svg" alt="Brave" style={{ padding: "5%" }} />
        </div>

        <div className="ext-dock-tile">
          <img src="https://media.extension.land/logos/browsers/chrome.svg" alt="Chrome" />
        </div>

        <div className="ext-dock-tile plain">
          <img src="https://media.extension.land/track/extension-js.png" alt="Extension.js" />
        </div>

        <div className="ext-dock-tile">
          <img src="https://media.extension.land/logos/browsers/edge.svg" alt="Edge" />
        </div>

        <div className="ext-dock-tile" style={{ border: "none" }}>
          <img src="https://media.extension.land/logos/browsers/safari.svg" alt="Safari" style={{ padding: 0 }} />
        </div>
      </div>

      <div className="ext-dock-row ext-dock-row-bottom">
        <div className="ext-dock-tile">
          <img src="https://media.extension.land/logos/browsers/opera.svg" alt="Opera" style={{ padding: "5%" }} />
        </div>

        <div className="ext-dock-tile">
          <img src="https://media.extension.land/logos/browsers/firefox.svg" alt="Firefox" />
        </div>

        <div className="ext-dock-tile">
          <img src="https://media.extension.land/logos/browsers/chromium.svg" alt="Chromium" />
        </div>

        <div className="ext-dock-tile">
          <img src="https://mintcdn.com/extensionjs/rnXP2INmBiIBB-KO/images/waterfox.png?fit=max&auto=format&n=rnXP2INmBiIBB-KO&q=85&s=ed1003490d829e4001d03e371c0ca8e6" alt="Waterfox" style={{ borderRadius: "50%" }} width="1280" height="1024" data-path="images/waterfox.png" />
        </div>
      </div>
    </div>

    <h1 className="text-5xl sm:text-6xl lg:text-[4rem] font-semibold tracking-tight leading-tight max-w-3xl text-neutral-900 dark:text-white">
      跨瀏覽器擴充功能框架
    </h1>

    <p className="text-lg sm:text-xl text-gray-600 dark:text-gray-300 max-w-xl leading-relaxed">
      用一套現代工作流程，為所有主流瀏覽器打造擴充功能。Extension.js 會處理
      manifest 編譯、瀏覽器專屬的輸出與封裝。
    </p>

    <div className="ext-hero-badges">
      <a href="https://github.com/extension-js/extension.js" target="_blank" rel="noreferrer" aria-label="GitHub stars">
        <img src="https://img.shields.io/github/stars/extension-js/extension.js?style=flat&logo=github&logoColor=white&color=0e62f7&labelColor=0b1220" alt="GitHub stars" loading="lazy" />
      </a>

      <a href="https://www.npmjs.com/package/extension" target="_blank" rel="noreferrer" aria-label="npm weekly downloads">
        <img src="https://img.shields.io/npm/dw/extension?style=flat&logo=npm&logoColor=white&color=0e62f7&labelColor=0b1220" alt="npm weekly downloads" loading="lazy" />
      </a>

      <a href="https://www.npmjs.com/package/extension" target="_blank" rel="noreferrer" aria-label="npm version">
        <img src="https://img.shields.io/npm/v/extension?style=flat&logo=npm&logoColor=white&color=0e62f7&labelColor=0b1220" alt="latest version on npm" loading="lazy" />
      </a>

      <a href="https://github.com/extension-js/extension.js/blob/main/LICENSE" target="_blank" rel="noreferrer" aria-label="MIT license">
        <img src="https://img.shields.io/github/license/extension-js/extension.js?style=flat&color=0e62f7&labelColor=0b1220" alt="MIT license" loading="lazy" />
      </a>
    </div>

    <div className="ext-hero-cmd">
      <span className="ext-hero-cmd-prompt" aria-hidden="true">
        \$
      </span>

      <code className="ext-hero-cmd-code">
        npx extension\@latest create my-extension
      </code>

      <button
        type="button"
        className="ext-hero-cmd-copy"
        aria-label="Copy command"
        onClick={(e) => {
      navigator.clipboard.writeText(
        "npx extension@latest create my-extension",
      );
      const el = e.currentTarget;
      const original = el.innerText;
      el.innerText = "Copied";
      setTimeout(() => {
        el.innerText = original;
      }, 1500);
    }}
      >
        Copy
      </button>
    </div>

    <div className="flex flex-wrap items-center justify-center gap-3">
      <a href="/docs" className="inline-flex items-center gap-3 rounded-lg bg-[#0e62f7] px-12 py-4 text-white text-lg font-semibold hover:opacity-90 transition no-underline">
        開始使用 ⏵⏵⏵
      </a>

      <a href="/docs/compare/extension-js-vs-wxt" className="inline-flex items-center gap-3 rounded-lg border border-gray-300 dark:border-neutral-700 px-12 py-4 text-neutral-900 dark:text-white text-lg font-semibold hover:opacity-90 transition no-underline">
        比較框架 ⏵
      </a>
    </div>
  </section>

  <section className="w-full">
    <div className="ext-codepreview">
      <div className="ext-codepreview-text">
        <h2 className="text-3xl sm:text-4xl font-semibold tracking-tight">
          一份 manifest.json。<br />支援所有瀏覽器。
        </h2>

        <p className="text-gray-600 dark:text-gray-400 mt-3 text-lg leading-relaxed max-w-md">
          帶有瀏覽器前綴的鍵（<code>chrome:</code>、<code>firefox:</code>、{" "}
          <code>edge:</code>）會在編譯時過濾，未加前綴的鍵則對所有瀏覽器都生效。
        </p>

        <div className="mt-6 flex flex-wrap gap-3">
          <a href="/docs/features/browser-specific-fields" className="text-[#0e62f7] hover:opacity-80 font-medium no-underline">
            閱讀完整模式 ⏵
          </a>
        </div>
      </div>

      <pre className="ext-codepreview-code">
        <code>
          <span className="ext-cp-punc">
            {"{"}
          </span>

          {"\n"}

          {"  "}

          <span className="ext-cp-key">"manifest\_version"</span>
          <span className="ext-cp-punc">:</span>{" "}
          <span className="ext-cp-num">3</span>
          <span className="ext-cp-punc">,</span>

          {"\n"}

          {"  "}

          <span className="ext-cp-key">"name"</span>
          <span className="ext-cp-punc">:</span>{" "}
          <span className="ext-cp-str">"My Extension"</span>
          <span className="ext-cp-punc">,</span>

          {"\n"}

          {"  "}

          <span className="ext-cp-key">"version"</span>
          <span className="ext-cp-punc">:</span>{" "}
          <span className="ext-cp-str">"1.0.0"</span>
          <span className="ext-cp-punc">,</span>

          {"\n"}

          {"  "}

          <span className="ext-cp-key">"action"</span>
          <span className="ext-cp-punc">:</span>{" "}

          <span className="ext-cp-punc">
            {"{"}
          </span>

          <span className="ext-cp-key"> "default\_popup"</span>
          <span className="ext-cp-punc">:</span>{" "}
          <span className="ext-cp-str">"popup.html"</span>{" "}

          <span className="ext-cp-punc">
            {"}"}
          </span>

          <span className="ext-cp-punc">,</span>

          {"\n"}

          {"  "}

          <span className="ext-cp-prefix">"chrome:background"</span>
          <span className="ext-cp-punc">:</span>{" "}

          <span className="ext-cp-punc">
            {"{"}
          </span>

          <span className="ext-cp-key"> "service\_worker"</span>
          <span className="ext-cp-punc">:</span>{" "}
          <span className="ext-cp-str">"sw\.ts"</span>{" "}

          <span className="ext-cp-punc">
            {"}"}
          </span>

          <span className="ext-cp-punc">,</span>

          {"\n"}

          {"  "}

          <span className="ext-cp-prefix">"firefox:background"</span>
          <span className="ext-cp-punc">:</span>{" "}

          <span className="ext-cp-punc">
            {"{"}
          </span>

          <span className="ext-cp-key"> "scripts"</span>
          <span className="ext-cp-punc">:</span>{" "}
          <span className="ext-cp-punc">\[</span>
          <span className="ext-cp-str">"sw\.ts"</span>
          <span className="ext-cp-punc">]</span>{" "}

          <span className="ext-cp-punc">
            {"}"}
          </span>

          {"\n"}

          <span className="ext-cp-punc">
            {"}"}
          </span>
        </code>
      </pre>
    </div>
  </section>

  <section className="w-full">
    <div className="rounded-3xl bg-neutral-100 dark:bg-neutral-950 ring-1 ring-black/5 dark:ring-white/5 px-8 py-12 sm:px-14 sm:py-16 flex flex-col sm:flex-row items-start gap-10 text-left">
      <div className="shrink-0 aspect-square w-24 sm:w-28">
        <img src="https://media.extension.land/track/extension-js.png" alt="Extension.js" width="112" height="112" className="block w-full h-full object-contain" />
      </div>

      <div className="flex flex-col gap-6">
        <h2 className="text-3xl sm:text-4xl font-semibold tracking-tight text-neutral-900 dark:text-white">
          為什麼要使用瀏覽器擴充功能框架？
        </h2>

        <p className="text-neutral-600 dark:text-neutral-400 text-lg leading-relaxed max-w-3xl">
          瀏覽器擴充功能會用到與一般 web app 不同的檔案、瀏覽器 API、manifest 格式、權限與建置輸出。
          一個{" "}

          <a href="/docs/compare" className="text-[#0e62f7] hover:opacity-80 no-underline">
            瀏覽器擴充功能框架
          </a>

          {" "}

          能去除那些黏合用的程式碼：以單一工作流程處理 Chrome、Edge 與 Firefox 的擴充功能開發、依目標過濾 manifest、針對 service worker 與 content script 調校的重新載入行為，以及為 Chrome Web Store、addons.mozilla.org 與 Edge Add-ons store 準備好的封裝。
        </p>

        <p className="text-neutral-600 dark:text-neutral-400 text-lg leading-relaxed max-w-3xl">
          Extension.js 就是這樣的工作流程：一個 JavaScript 或 TypeScript 專案、一份{" "}

          <code className="text-neutral-800 dark:text-neutral-200">
            manifest.json
          </code>

          、分開的{" "}

          <code className="text-neutral-800 dark:text-neutral-200">
            dist/\<browser>
          </code>

          {" "}

          輸出，以及一個不擋路的 CLI，讓你能毫不費力地以同一份程式碼推出跨瀏覽器擴充功能。
        </p>
      </div>
    </div>
  </section>

  <section className="flex flex-col items-center text-center gap-8">
    <div>
      <h2 className="text-3xl sm:text-4xl font-semibold tracking-tight">
        看看完整的開發者工作流程
      </h2>

      <p className="text-gray-600 dark:text-gray-300 mt-3 text-lg">
        從建立專案骨架到擴充功能執行，全程使用一套現代工具鏈。
      </p>
    </div>

    <div className="w-full max-w-5xl">
      <iframe className="w-full aspect-video rounded-2xl shadow-2xl ring-1 ring-black/5" src="https://www.loom.com/embed/58e21900d693417db1e0e59c0a96c4b3?sid=80cf1003-7ed1-4f9d-a3fb-01c7876983ad" title="Extension.js developer workflow" loading="lazy" referrerPolicy="no-referrer-when-downgrade" allow="clipboard-write; encrypted-media; fullscreen" allowFullScreen />
    </div>
  </section>

  <section className="flex flex-col gap-10">
    <div className="text-center max-w-3xl mx-auto">
      <h2 className="text-3xl sm:text-4xl font-semibold tracking-tight">
        涵蓋{" "}
        <span className="text-[#0e62f7]">擴充功能完整生命週期</span>{" "}
        的核心功能
      </h2>

      <p className="text-gray-600 dark:text-gray-300 mt-3 text-lg">
        用一套現代擴充功能工作流程，為每個瀏覽器建置、測試與發佈。
      </p>
    </div>

    <div className="ext-feature-grid">
      {/* A — wide, media: engines */}

      <a href="/docs/features/cross-browser-compatibility" className="ext-feature-card ext-fa">
        <div className="flex items-center -space-x-2">
          <img src="https://media.extension.land/logos/browsers/chromium.svg" alt="Chromium" className="h-10 w-10" />

          <img src="https://media.extension.land/logos/browsers/firefox.svg" alt="Firefox" className="h-10 w-10" />
        </div>

        <div>
          <h3 className="text-lg font-semibold mb-2">
            把一個擴充功能編譯為各瀏覽器專屬輸出
          </h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            為 Chrome、Edge、Firefox，以及自訂的 Chromium 或 Gecko 目標一次建置。
            在開發、測試與發佈建置之間，瀏覽器專屬的輸出都維持可預期。{" "}
          </p>
        </div>
      </a>

      {/* B — narrow, media: browsers */}

      <a href="/docs/implementation-guide/manifest-json" className="ext-feature-card ext-fb">
        <div className="flex items-center -space-x-2">
          <img src="https://mintcdn.com/extensionjs/gjDFG63IAocqD1dD/images/vendor/chrome.svg?fit=max&auto=format&n=gjDFG63IAocqD1dD&q=85&s=ceae7783b27e093414f91a02abc817fa" alt="Chrome" className="h-10 w-10" width="276" height="276" data-path="images/vendor/chrome.svg" />

          <img src="https://mintcdn.com/extensionjs/3TIjz08f15ShJ-XI/images/vendor/firefox.svg?fit=max&auto=format&n=3TIjz08f15ShJ-XI&q=85&s=1625a24d1d44ff8568f45c43139e6d29" alt="Firefox" className="h-10 w-10" width="51500" height="51500" data-path="images/vendor/firefox.svg" />

          <img src="https://mintcdn.com/extensionjs/gjDFG63IAocqD1dD/images/vendor/edge.svg?fit=max&auto=format&n=gjDFG63IAocqD1dD&q=85&s=f03d86784148c780abe9be075c41057a" alt="Edge" className="h-10 w-10" width="27600" height="27600" data-path="images/vendor/edge.svg" />
        </div>

        <div>
          <h3 className="text-lg font-semibold mb-2">
            讓擴充功能結構維持明確
          </h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            擴充功能成長時，manifest、路徑與輸出資源都會維持同步。
          </p>
        </div>
      </a>

      {/* C — narrow */}

      <a href="/docs/features/extension-configuration" className="ext-feature-card ext-fc">
        <img src="https://media.extension.land/track/extension-js.png" alt="Extension.js" className="h-10 w-10 object-contain" />

        <div>
          <h3 className="text-lg font-semibold mb-2">
            用設定檔微調行為
          </h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            透過 <code>extension.config.js</code> 覆寫預設值，打造客製化建置。{" "}
          </p>
        </div>
      </a>

      {/* D — wide, media: frameworks */}

      <a href="/docs/getting-started/templates" className="ext-feature-card ext-fd">
        <div className="flex items-center -space-x-2">
          <img src="https://mintcdn.com/extensionjs/3TIjz08f15ShJ-XI/images/vendor/react-original.svg?fit=max&auto=format&n=3TIjz08f15ShJ-XI&q=85&s=3b33c8ecd37f96dc4f6406a8da6d4d11" alt="React" className="h-10 w-10" width="128" height="128" data-path="images/vendor/react-original.svg" />

          <img src="https://mintcdn.com/extensionjs/3TIjz08f15ShJ-XI/images/vendor/vuejs-original.svg?fit=max&auto=format&n=3TIjz08f15ShJ-XI&q=85&s=807cafde7096ed00459532cb29922270" alt="Vue" className="h-10 w-10" width="128" height="128" data-path="images/vendor/vuejs-original.svg" />

          <img src="https://mintcdn.com/extensionjs/3TIjz08f15ShJ-XI/images/vendor/svelte-original.svg?fit=max&auto=format&n=3TIjz08f15ShJ-XI&q=85&s=7db36cf60038822ebac1809d89f5fb51" alt="Svelte" className="h-10 w-10" width="128" height="128" data-path="images/vendor/svelte-original.svg" />
        </div>

        <div>
          <h3 className="text-lg font-semibold mb-2">
            帶上你偏好的技術棧
          </h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            從 React、Vue、Svelte、TypeScript 或 JavaScript 開始。維持同一套工作流程，讓團隊可以選擇合適的 UI 模型，而不必更換擴充功能工具鏈。{" "}
          </p>
        </div>
      </a>

      {/* E — wide, media: env */}

      <a href="/docs/features/environment-variables" className="ext-feature-card ext-fe">
        <img src="https://mintcdn.com/extensionjs/gjDFG63IAocqD1dD/images/vendor/env-vars.png?fit=max&auto=format&n=gjDFG63IAocqD1dD&q=85&s=7fd070f9e7475d4c1cc8250a8faa541a" alt="Environment variables" className="h-10 w-10 object-contain" width="225" height="225" data-path="images/vendor/env-vars.png" />

        <div>
          <h3 className="text-lg font-semibold mb-2">
            乾淨地注入環境變數
          </h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            依瀏覽器與模式載入環境值，並在 JavaScript、JSON 與 HTML 中替換它們。開發期密鑰絕對不會洩漏到正式 bundle 中。{" "}
          </p>
        </div>
      </a>

      {/* F — narrow, media: stores */}

      <a href="/docs/features/multi-platform-builds" className="ext-feature-card ext-ff">
        <div className="flex items-center -space-x-2">
          <img src="https://media.extension.land/logos/stores/chrome-web-store.png" alt="Chrome Web Store" className="h-10 w-10" />

          <img src="https://media.extension.land/logos/stores/firefox-addons.png" alt="Firefox Add-ons" className="h-10 w-10" />

          <img src="https://media.extension.land/logos/stores/microsoft-edge-addons.png" alt="Microsoft Edge Add-ons" className="h-10 w-10" />
        </div>

        <div>
          <h3 className="text-lg font-semibold mb-2">
            建置、預覽、封裝
          </h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            從本機檢查到各瀏覽器可上架產物，採用同一條流程。{" "}
          </p>
        </div>
      </a>
    </div>

    <div className="flex justify-center">
      <a href="/docs/features" className="inline-flex items-center gap-3 rounded-lg bg-[#0e62f7] px-12 py-4 text-white text-lg font-semibold hover:opacity-90 transition no-underline">
        探索所有功能 ⏵⏵⏵
      </a>
    </div>
  </section>

  <section className="flex flex-col gap-10">
    <div className="text-center max-w-3xl mx-auto">
      <h2 className="text-3xl sm:text-4xl font-semibold tracking-tight">
        選擇你的 <span className="text-[#0e62f7]">框架</span>，沿用相同工作流程。
      </h2>

      <p className="text-gray-600 dark:text-gray-300 mt-3 text-lg">
        從可上線的範本開始：React、Preact、Vue、Svelte、TypeScript 或 JavaScript。
      </p>
    </div>

    <div className="ext-template-grid">
      <a href="/docs/languages-and-frameworks/react" className="ext-feature-card">
        <img src="https://mintcdn.com/extensionjs/3TIjz08f15ShJ-XI/images/vendor/react-original.svg?fit=max&auto=format&n=3TIjz08f15ShJ-XI&q=85&s=3b33c8ecd37f96dc4f6406a8da6d4d11" alt="React" className="h-10 w-10" width="128" height="128" data-path="images/vendor/react-original.svg" />

        <div>
          <h3 className="text-lg font-semibold mb-2">React</h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            以元件為基礎、完整相容 Manifest V3（MV3）的 UI。包含可立即發佈的 popup、options 與 content script。{" "}
          </p>
        </div>
      </a>

      <a href="/docs/languages-and-frameworks/preact" className="ext-feature-card">
        <img src="https://preactjs.com/branding/symbol.svg" alt="Preact" className="h-10 w-10" />

        <div>
          <h3 className="text-lg font-semibold mb-2">Preact</h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            相同的 React API，僅 3kB 的執行期，特別適合 bundle 大小敏感的 content script。{" "}
          </p>
        </div>
      </a>

      <a href="/docs/languages-and-frameworks/vue" className="ext-feature-card">
        <img src="https://mintcdn.com/extensionjs/3TIjz08f15ShJ-XI/images/vendor/vuejs-original.svg?fit=max&auto=format&n=3TIjz08f15ShJ-XI&q=85&s=807cafde7096ed00459532cb29922270" alt="Vue" className="h-10 w-10" width="128" height="128" data-path="images/vendor/vuejs-original.svg" />

        <div>
          <h3 className="text-lg font-semibold mb-2">Vue</h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            漸進式框架搭配單一檔案元件，且已串接好擴充功能情境的設定。{" "}
          </p>
        </div>
      </a>

      <a href="/docs/languages-and-frameworks/svelte" className="ext-feature-card">
        <img src="https://mintcdn.com/extensionjs/3TIjz08f15ShJ-XI/images/vendor/svelte-original.svg?fit=max&auto=format&n=3TIjz08f15ShJ-XI&q=85&s=7db36cf60038822ebac1809d89f5fb51" alt="Svelte" className="h-10 w-10" width="128" height="128" data-path="images/vendor/svelte-original.svg" />

        <div>
          <h3 className="text-lg font-semibold mb-2">Svelte</h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            編譯時期的 UI，執行期更小。當 content script 每一 KB 都重要時，是理想選擇。{" "}
          </p>
        </div>
      </a>

      <a href="/docs/languages-and-frameworks/typescript" className="ext-feature-card">
        <img src="https://mintcdn.com/extensionjs/3TIjz08f15ShJ-XI/images/vendor/typescript-original.svg?fit=max&auto=format&n=3TIjz08f15ShJ-XI&q=85&s=b7720020aa3a4079b38ccbf8c2f56f5c" alt="TypeScript" className="h-10 w-10" width="128" height="128" data-path="images/vendor/typescript-original.svg" />

        <div>
          <h3 className="text-lg font-semibold mb-2">TypeScript</h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            為 popup、content 與 background script 加上靜態型別，在編譯期就攔截 manifest 與訊息傳遞的錯誤。{" "}
          </p>
        </div>
      </a>

      <a href="/docs/languages-and-frameworks/ecmascript-modules" className="ext-feature-card">
        <img src="https://mintcdn.com/extensionjs/3TIjz08f15ShJ-XI/images/vendor/javascript-original.svg?fit=max&auto=format&n=3TIjz08f15ShJ-XI&q=85&s=c523de36b8f066538f936fc6b3329dc8" alt="JavaScript" className="h-10 w-10" width="128" height="128" data-path="images/vendor/javascript-original.svg" />

        <div>
          <h3 className="text-lg font-semibold mb-2">JavaScript</h3>

          <p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed">
            純 ES module，不需編譯步驟。快速起步，等需要時再加入工具。{" "}
          </p>
        </div>
      </a>
    </div>

    <div className="flex justify-center">
      <a href="/docs/getting-started/templates" className="inline-flex items-center gap-3 rounded-lg bg-[#0e62f7] px-12 py-4 text-white text-lg font-semibold hover:opacity-90 transition no-underline">
        瀏覽範本 ⏵⏵⏵
      </a>
    </div>
  </section>

  <section className="w-full">
    <div className="ext-migrate-callout">
      <div>
        <h2 className="text-2xl sm:text-3xl font-semibold tracking-tight">
          從其他框架轉過來？
        </h2>

        <p className="text-gray-600 dark:text-gray-400 mt-3 text-base sm:text-lg max-w-2xl">
          大多數 React、Vue 與 Svelte 的原始檔可以直接搬過來，不必重寫。實際工作集中在替換打包工具設定，並把產生的 manifest 還原為真正的 manifest.json。
        </p>
      </div>

      <div className="ext-migrate-actions">
        <a href="/docs/compare/extension-js-vs-wxt" className="ext-migrate-btn">
          比較框架 ⏵
        </a>

        <a href="/docs/migrate/from-crxjs" className="ext-migrate-btn">
          遷移你的擴充功能 ⏵
        </a>
      </div>
    </div>
  </section>

  <section className="flex flex-col items-center text-center gap-6">
    <div>
      <h2 className="text-3xl sm:text-4xl font-semibold tracking-tight">
        支援開源核心
      </h2>

      <p className="text-gray-600 dark:text-gray-300 mt-3 text-lg max-w-2xl">
        贊助者協助專案推出更快的版本、更好的開發者體驗（DX），並為擴充功能團隊提供長期穩定性。
      </p>
    </div>

    <div className="ext-sponsors">
      <a href="https://extension.dev/?utm_medium=sponsor&utm_source=extensionjs" rel="noreferrer" target="_blank" className="ext-sponsor-tile" aria-label="extension.dev">
        <img alt="extension.dev" src="https://mintcdn.com/extensionjs/rnXP2INmBiIBB-KO/images/sponsors/extensiondev.svg?fit=max&auto=format&n=rnXP2INmBiIBB-KO&q=85&s=6cc08ea65bd172be4266eba5274763ae" loading="lazy" className="ext-sponsor-logo block dark:hidden" width="1001" height="155" data-path="images/sponsors/extensiondev.svg" />

        <img alt="extension.dev" src="https://mintcdn.com/extensionjs/rnXP2INmBiIBB-KO/images/sponsors/extensiondev_dark.svg?fit=max&auto=format&n=rnXP2INmBiIBB-KO&q=85&s=f283f9391426d7c18be3d05622edebce" loading="lazy" className="ext-sponsor-logo hidden dark:block" width="1001" height="155" data-path="images/sponsors/extensiondev_dark.svg" />
      </a>

      <a href="https://mintlify.com/?utm_medium=sponsor&utm_source=extensionjs" rel="noreferrer" target="_blank" className="ext-sponsor-tile" aria-label="Mintlify">
        <img alt="Mintlify" src="https://mintcdn.com/extensionjs/rnXP2INmBiIBB-KO/images/sponsors/mintlify.svg?fit=max&auto=format&n=rnXP2INmBiIBB-KO&q=85&s=40a4945c26268666007edf9a2b888e9f" loading="lazy" className="ext-sponsor-logo block dark:hidden" width="1682" height="368" data-path="images/sponsors/mintlify.svg" />

        <img alt="Mintlify" src="https://mintcdn.com/extensionjs/rnXP2INmBiIBB-KO/images/sponsors/mintlify_dark.svg?fit=max&auto=format&n=rnXP2INmBiIBB-KO&q=85&s=c6d2c0cb1723d06e312a64180da9b62d" loading="lazy" className="ext-sponsor-logo hidden dark:block" width="1682" height="368" data-path="images/sponsors/mintlify_dark.svg" />
      </a>
    </div>

    <a href="https://github.com/sponsors/extension-js" target="_blank" rel="noreferrer" className="text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200">
      成為贊助者 ⏵
    </a>
  </section>

  <section className="flex flex-col gap-8 max-w-3xl mx-auto w-full">
    <div className="text-center">
      <h2 className="text-3xl sm:text-4xl font-semibold tracking-tight">
        常見問題
      </h2>
    </div>

    <AccordionGroup>
      <Accordion title="什麼是瀏覽器擴充功能？">
        瀏覽器擴充功能是一種為 Chrome、Firefox、Edge 或其他瀏覽器加入功能的軟體。它可以注入 UI、回應瀏覽器事件，並呼叫頁面本身無法使用的特權 API。完整介紹請見 [什麼是瀏覽器擴充功能？](/docs/concepts/what-is-a-browser-extension)。
      </Accordion>

      <Accordion title="Extension.js 是 Chrome 擴充功能框架嗎？">
        是的。Extension.js 可作為 Chrome 擴充功能框架，同時也能在同一份專案中作為 Firefox 與 Edge 的擴充功能框架。透過 `--browser=chrome`、`--browser=firefox` 或 `--browser=edge` 選擇目標。請見 [可用的瀏覽器](/docs/browsers/browsers-available)。
      </Accordion>

      <Accordion title="Extension.js 在開發階段如何處理 hot module replacement？">
        執行 `npx extension dev` 後，CLI 會監看你的專案變動。對 popup、content script、service worker 與 options 頁面的編輯會觸發最快且安全的更新路徑。CLI 在支援時使用 hot module replacement（HMR），否則就採用針對性的重新載入。它會自動解決常見痛點，例如過期的 service worker 與遺漏的 content script 更新。
      </Accordion>

      <Accordion title="如何為 Chrome、Edge 與 Firefox 建置同一個擴充功能？">
        Extension.js 會把單一程式碼庫編譯成各瀏覽器專屬輸出。同一組指令會為 Chrome、Edge、Firefox，以及其他 Chromium 系瀏覽器產生正確封裝的建置。每個建置都會取得正確的 manifest 格式、路徑與平台調整。你的持續整合（CI）pipeline 可以用相同的建置步驟搭配不同的瀏覽器旗標。這能減少不同上架平台之間的差異。
      </Accordion>

      <Accordion title="我能使用 React、Preact、Vue、Svelte 或 TypeScript 嗎？">
        可以。Extension.js 提供 React、Preact、Vue、Svelte、TypeScript 與純 JavaScript 的正式上線範本。元件的寫法與你在任何前端專案中一樣。框架選擇不會影響核心工作流程。
      </Accordion>

      <Accordion title="Extension.js 支援 Manifest V3 嗎？">
        是的。整套工具鏈是圍繞 Manifest V3 與目前瀏覽器商店強制的限制設計的：service worker、宣告式 API、新版權限與更嚴格的封裝。Manifest V3（MV3）是預設，不是事後追加的。常見陷阱請見 [Manifest V3 疑難排解](/docs/concepts/manifest-v3)。
      </Accordion>

      <Accordion title="如何排查 Manifest V3 的 service worker 與權限問題？">
        大多數 Manifest V3 的問題可分為幾類：service worker 註冊與 `type: "module"`、新的 `web_accessible_resources` 結構、`permissions` 與 `host_permissions` 的拆分，以及 Firefox 在 `declarative_net_request` 上的差異。修正方式請見 [Manifest V3 疑難排解](/docs/concepts/manifest-v3)。
      </Accordion>

      <Accordion title="如何從自訂的 webpack 或 Vite 設定遷移？">
        Extension.js 會替換掉手刻 bundler 設定中那些擴充功能專屬的黏合程式碼。它會處理 manifest 版本、多瀏覽器輸出、content script 注入與重新載入協調。將你的原始檔與 manifest 放進 Extension.js 專案，CLI 會處理其餘部分。你的 React/Vue/Svelte/TS 程式碼不需重寫即可運作。
      </Accordion>

      <Accordion title="Extension.js 支援 monorepo 與環境變數嗎？">
        Extension.js 支援 pnpm、npm 與 Yarn workspace。路徑解析與共用相依套件能跨 workspace 邊界運作。Extension.js 會依瀏覽器與建置模式注入環境變數，並在 JS、JSON 與 HTML 中替換值。開發期密鑰絕對不會洩漏到正式 bundle 中。
      </Accordion>

      <Accordion title="Extension.js 可以免費使用嗎？">
        可以。Extension.js 採用 [MIT 授權](https://github.com/extension-js/extension.js/blob/main/LICENSE) 的開放原始碼。沒有付費方案、使用上限或必須開啟 telemetry 的模式。本框架由贊助者與貢獻者支持。資料形狀的明確規範請見 [telemetry 與隱私契約](/docs/features/telemetry-and-privacy)。
      </Accordion>

      <Accordion title="Extension.js 支援 Safari 嗎？">
        目前還沒有。`--browser=safari` 還不是 CLI 的目標。你仍可以用共用的 web 程式碼撰寫 Safari 擴充功能，並在這個工作流程之外加入 Safari 專屬的建置步驟。目前範圍請見 [可用的瀏覽器](/docs/browsers/browsers-available#safari-and-other-webkit-targets)。
      </Accordion>

      <Accordion title="Extension.js 會為我的 bundle 加上什麼？">
        正式建置（`extension build`）只會輸出你的擴充功能參照到的程式碼，加上一小段在正式版本中會移除的 reload runtime。Dev 建置會包含額外的 HMR 與 reload 連結邏輯。輸出位於 `dist/<browser>` 之下，方便你比較各瀏覽器的大小。Content script 的 bundle 大小，會接近你的原始碼加上所選 UI 框架的水準。
      </Accordion>

      <Accordion title="如何從其他框架遷移？">
        大多數 React、Vue 與 Svelte 的原始檔可以直接搬過來，不必重寫。工作集中在三個地方：替換打包工具設定、把產生的 manifest 還原為手寫且支援 [瀏覽器前綴鍵](/docs/features/browser-specific-fields) 的 `manifest.json`，以及更新 `package.json` 的 scripts。逐步指南請見 [從 CRXJS 遷移](/docs/migrate/from-crxjs)。
      </Accordion>
    </AccordionGroup>
  </section>

  <div className="ext-footer">
    <div className="ext-footer-inner">
      <div className="ext-footer-cmd">
        <code>npx extension\@latest create my-extension</code>
      </div>

      <div className="ext-footer-right">
        <ul className="ext-footer-links">
          <li>
            <a href="https://github.com/extension-js/extension.js/blob/main/CODE_OF_CONDUCT.md" target="_blank" rel="noreferrer">
              行為準則{" "}

              <Icon icon="arrow-up-right-from-square" size={10} />
            </a>
          </li>

          <li>
            <a href="https://github.com/extension-js/extension.js/releases" target="_blank" rel="noreferrer">
              變更紀錄 <Icon icon="arrow-up-right-from-square" size={10} />
            </a>
          </li>

          <li>
            <a href="https://github.com/extension-js/extension.js/security" target="_blank" rel="noreferrer">
              安全 <Icon icon="arrow-up-right-from-square" size={10} />
            </a>
          </li>
        </ul>

        <p className="ext-footer-copy">
          MIT (c) Cezar Augusto 與{" "}
          <a href="/docs/hall-of-fame">Extension.js authors</a>。
        </p>
      </div>
    </div>
  </div>
</div>
