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
| Feature | WXT | Plasmo | CRXJS |
|---|---|---|---|
| Framework support | React, Vue, Svelte, Solid, vanilla | React, Vue, Svelte | React, Vue, Svelte |
| Bundler | Vite | Parcel (custom) | Vite plugin |
| Cross-browser | Chrome, Firefox, Safari, Edge | Chrome, Firefox, Edge | Chrome, Edge |
| HMR | Yes (fast) | Yes | Yes |
| Manifest version | v2 + v3 | v3 | v2 + v3 |
| Content scripts | File-based routing | Config-based | Config-based |
| Auto-imports | Yes | Yes | No |
| Testing | Built-in support | Via @plasmohq/testing | Manual |
| License | MIT | MIT | MIT |
| 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
| Browser | WXT | Plasmo | CRXJS |
|---|---|---|---|
| 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):
| Metric | WXT | Plasmo | CRXJS |
|---|---|---|---|
| Cold build | ~2s | ~4s | ~2s |
| HMR | <100ms | ~200ms | <100ms |
| Bundle size | Smallest | Moderate | Smallest |
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.