DEV Community

Alex Aslam
Alex Aslam

Posted on

Modern Browser Extension Development: Supercharge Your Workflow with React, Vue, or Svelte

Hey fellow devs! 👋 Let’s talk about browser extensions. You know, those little tools that make the web better—blocking ads, enhancing productivity, or even replacing Twitter’s bird logo with a dancing taco 🌮. But if you’ve ever built one with vanilla JavaScript, you’ve probably faced:

  • Spaghetti UI code that’s impossible to maintain.
  • State management nightmares across popups, options pages, and content scripts.
  • Rebuilding wheels for every minor feature.

What if I told you modern frameworks like React, Vue, or Svelte can turn extension development from a chore into a joyride? Let’s dive in.


Why Use React/Vue/Svelte for Extensions?

  1. Component Magic: Break your UI into reusable pieces (popups, modals, settings).
  2. State Management: Share data between tabs, background scripts, and UIs effortlessly.
  3. Ecosystem Power: Tap into libraries like Redux, Vuex, or Svelte stores.
  4. Hot Reloading: See changes instantly without reinstalling the extension.

1. Building with React: The OG Powerhouse

React’s component model is perfect for extensions. Let’s build a todo-list popup:

Step 1: Set Up with Create React App

npx create-react-app my-extension --template typescript  
cd my-extension  
Enter fullscreen mode Exit fullscreen mode

Step 2: Add the Manifest

Create public/manifest.json:

{  
  "manifest_version": 3,  
  "name": "Todo Wizard",  
  "version": "1.0",  
  "action": {  
    "default_popup": "index.html"  
  },  
  "permissions": ["storage"]  
}  
Enter fullscreen mode Exit fullscreen mode

Step 3: Build the Popup

// App.tsx  
import { useState } from 'react';  

function App() {  
  const [todos, setTodos] = useState<string[]>([]);  

  return (  
    <div>  
      <h1>My Todos</h1>  
      <button onClick={() => setTodos([...todos, "New Task"])}>  
        Add Task  
      </button>  
      {todos.map((todo) => (  
        <p>{todo}</p>  
      ))}  
    </div>  
  );  
}  
Enter fullscreen mode Exit fullscreen mode

Pro Tip: Use chrome.storage.local instead of useState to persist data!


2. Vue.js: The Progressive Framework

Vue’s simplicity shines for options pages or settings UIs.

Step 1: Scaffold with Vite

npm create vue@latest  
# Select TypeScript, Vue Router (optional)  
Enter fullscreen mode Exit fullscreen mode

Step 2: Configure the Manifest

Add public/manifest.json (same as React example).

Step 3: Build a Settings Page

<!-- Options.vue -->  
<script setup>  
import { ref } from 'vue';  
const darkMode = ref(false);  
</script>  

<template>  
  <div>  
    <h2>Settings</h2>  
    <label>  
      <input type="checkbox" v-model="darkMode" />  
      Dark Mode  
    </label>  
  </div>  
</template>  
Enter fullscreen mode Exit fullscreen mode

Bonus: Use vue-router to navigate between popup tabs!


3. Svelte: The Lightweight Speed Demon

Svelte’s compiler is perfect for content scripts that need to inject UI fast.

Step 1: Initialize SvelteKit

npm create svelte@latest my-extension  
Enter fullscreen mode Exit fullscreen mode

Step 2: Build a Content Script

Create src/content.js:

<script>  
  let count = 0;  
  function increment() {  
    count += 1;  
  }  
</script>  

<button on:click={increment}>  
  Clicks: {count}  
</button>  

<style>  
  button {  
    position: fixed;  
    bottom: 20px;  
    right: 20px;  
  }  
</style>  
Enter fullscreen mode Exit fullscreen mode

Step 3: Bundle with CRXJS

Install CRXJS to auto-reload and bundle:

npm install @crxjs/vite-plugin -D  
Enter fullscreen mode Exit fullscreen mode

Update vite.config.js:

import { defineConfig } from 'vite';  
import { crx } from '@crxjs/vite-plugin';  
import manifest from './manifest.json';  

export default defineConfig({  
  plugins: [crx({ manifest })],  
});  
Enter fullscreen mode Exit fullscreen mode

Pitfalls to Avoid

  • Build Outputs: Frameworks generate index.html, but extensions need popup.html. Adjust your build config.
  • Content Script Styling: Use shadow DOM or unique class names to avoid CSS conflicts.
  • State Sharing: Use chrome.storage or messaging APIs to sync data between parts of your extension.

Which Framework Should You Choose?

Framework Best For When to Avoid
React Complex UIs with state management Super lightweight extensions
Vue Rapid prototyping, simple apps Projects needing build flexibility
Svelte Performance-critical content scripts Teams unfamiliar with Svelte

Tools to Save Your Sanity

  • Plasmo: Framework-agnostic extension toolkit with React/Vue/Svelte support.
  • CRXJS: Vite plugin for seamless extension development.
  • webextension-polyfill: Write cross-browser code easily.

Go Build Something Awesome!

Modern frameworks turn extension development from a grind into a playground. Whether you’re:

  • Adding a GPT-4 sidebar to every website with React.
  • Building a theme engine with Vue.
  • Creating a performance monitor with Svelte.

…the possibilities are endless.

Your Homework: Pick a framework, clone a starter template, and tweak it. Then share your creation with the world! 🚀

Stuck? Drop a comment below. Let’s debug together! 💻✨

Top comments (0)