← Back to articles

WXT vs Plasmo vs CRXJS: Best Chrome Extension Framework (2026)

Building Chrome extensions without a framework means wrestling with manifest files, content script injection, hot reload hacks, and cross-browser compatibility. In 2026, three frameworks solve this: WXT, Plasmo, and CRXJS.

Quick Comparison

FeatureWXTPlasmoCRXJS
Framework supportReact, Vue, Svelte, Solid, vanillaReact, Vue, SvelteReact, Vue, Svelte
BundlerViteParcel (custom)Vite plugin
Cross-browserChrome, Firefox, Safari, EdgeChrome, Firefox, EdgeChrome, Edge
HMRYes (fast)YesYes
Manifest versionv2 + v3v3v2 + v3
Content scriptsFile-based routingConfig-basedConfig-based
Auto-importsYesYesNo
TestingBuilt-in supportVia @plasmohq/testingManual
LicenseMITMITMIT
GitHub stars~5K~10K~3K

WXT: The Nuxt-Inspired Framework

WXT brings the conventions of Nuxt.js to browser extension development. File-based routing, auto-imports, and a familiar project structure.

Strengths

  • Vite-powered. Fast builds, excellent HMR, and the Vite ecosystem of plugins.
  • File-based entrypoints. Drop files in the right directories and WXT handles manifest generation, content script registration, and routing.
  • Cross-browser. Build for Chrome, Firefox, Safari, and Edge from one codebase. Handles manifest v2/v3 differences automatically.
  • Framework-agnostic. React, Vue, Svelte, Solid, or vanilla JS — all first-class.
  • Storage API. Type-safe wrapper around browser.storage with reactive updates.
  • Excellent docs. Clear, comprehensive documentation with examples for every feature.

Weaknesses

  • Newer than Plasmo — smaller community
  • Fewer built-in integrations than Plasmo's ecosystem
  • Safari support is still maturing

Best For

Developers who prefer Vite, want cross-browser support, or use Vue/Svelte/Solid. The most "framework-like" DX.

Plasmo: The Full-Stack Extension Platform

Plasmo is the most popular extension framework, with a larger ecosystem including browser extension publishing tools.

Strengths

  • Largest community. Most GitHub stars, most tutorials, most Stack Overflow answers.
  • CSUI (Content Script UI). Mount React/Vue/Svelte components directly into web pages with Shadow DOM isolation. Handles CSS conflicts automatically.
  • Messaging API. Type-safe message passing between content scripts, background, and popup.
  • Storage API. React hooks for browser.storage with automatic re-rendering.
  • Publishing tools. CLI tools for publishing to Chrome Web Store and Firefox Add-ons.
  • Plasmo Itero. Paid service for extension analytics and A/B testing.

Weaknesses

  • Custom Parcel bundler — less familiar than Vite, fewer plugins
  • No Safari support
  • More opinionated — harder to customize build process
  • Some rough edges in complex configurations
  • Parcel can be slower than Vite for large extensions

Best For

React developers who want the largest ecosystem and built-in publishing tools. Best content script UI injection system.

CRXJS: The Vite Plugin Approach

CRXJS isn't a framework — it's a Vite plugin that adds Chrome extension support to your existing Vite project.

Strengths

  • Minimal abstraction. It's a Vite plugin, not a framework. You keep full control of your Vite config.
  • Zero boilerplate. Point it at your manifest.json and it handles the rest.
  • Excellent HMR. Hot module replacement works across popup, options, and content scripts.
  • Familiar. If you know Vite, you know CRXJS. No new concepts.

Weaknesses

  • Maintenance concerns. Development has slowed in 2025-2026. Fewer updates than WXT or Plasmo.
  • No cross-browser. Chrome and Edge only (Chromium-based).
  • No built-in APIs. No storage wrappers, no messaging helpers, no content script UI injection.
  • Less documentation. Fewer guides and examples than alternatives.

Best For

Developers who want minimal tooling on top of Vite. Good for simple extensions or when migrating an existing Vite project.

Feature Deep Dive

Content Script UI Injection

Injecting UI into existing web pages is the trickiest part of extension development. CSS conflicts, DOM mutations, and z-index battles are common.

Plasmo CSUI is the best solution: mount React/Vue/Svelte components into pages with automatic Shadow DOM isolation. Your styles won't conflict with the page.

WXT supports content scripts via file-based routing with manual UI mounting. Less magic but more control.

CRXJS provides basic content script support. UI mounting is manual.

Cross-Browser Compatibility

BrowserWXTPlasmoCRXJS
Chrome
Firefox
Safari✅ (beta)
Edge

WXT is the clear winner for cross-browser extensions.

Developer Experience

WXT: npx wxt init → choose your framework → start building. File-based conventions make project structure intuitive.

Plasmo: pnpm create plasmo → start building. More guided setup with templates.

CRXJS: Add the Vite plugin to an existing project. Least opinionated.

Project Structure Comparison

WXT

├── entrypoints/
│   ├── popup/          # Popup UI
│   ├── options/        # Options page
│   ├── background.ts   # Service worker
│   └── content.ts      # Content script
├── public/
└── wxt.config.ts

Plasmo

├── src/
│   ├── popup.tsx       # Popup UI
│   ├── options.tsx     # Options page
│   ├── background.ts   # Service worker
│   └── contents/       # Content scripts
├── package.json        # Config in package.json

CRXJS

├── src/
│   ├── popup/
│   ├── background.ts
│   └── content.ts
├── manifest.json       # Standard manifest
└── vite.config.ts      # CRXJS plugin config

Performance

Build times for a medium-sized extension (popup + 3 content scripts + background):

MetricWXTPlasmoCRXJS
Cold build~2s~4s~2s
HMR<100ms~200ms<100ms
Bundle sizeSmallestModerateSmallest

WXT and CRXJS (both Vite-based) are faster than Plasmo's Parcel builds.

FAQ

Which should I use for my first extension?

WXT if you want good conventions and cross-browser. Plasmo if you're using React and want the most resources to learn from.

Can I migrate between these frameworks?

Yes. The extension logic (popup, content scripts, background) is standard browser extension code. Migration mostly involves changing project configuration, not rewriting features.

Do I need a framework at all?

For simple extensions (popup only, no content scripts), a framework adds unnecessary complexity. For anything with content scripts, multiple entrypoints, or cross-browser needs — use a framework.

Which is best for a Chrome extension SaaS?

Plasmo, for its publishing tools and CSUI system. WXT if you also need Firefox/Safari.

The Verdict

  • WXT for the best overall DX, cross-browser support, and Vite-based tooling. The recommended default in 2026.
  • Plasmo for React-heavy extensions, content script UI injection, and the largest community.
  • CRXJS for minimal tooling on top of an existing Vite project. Choose if you want a plugin, not a framework.

For new projects in 2026, WXT is the recommended choice. It's the most actively developed, has the best cross-browser support, and its Vite foundation means fast builds and a familiar ecosystem.

Get AI tool guides in your inbox

Weekly deep-dives on the best AI coding tools, automation platforms, and productivity software.