Automatic handling of content script injection, CSS processing, and web-accessible resource generation with support for different script formats and execution environments. Provides seamless integration between Vite's development features and Chrome's content script requirements.
Interface for managing content script metadata and processing options.
interface ContentScript {
/** Script format type - affects how the script is processed and injected */
type: 'module' | 'iife' | 'loader';
/** Unique identifier for the script */
id: string;
/** Reference ID linking to the original source */
refId: string;
/** Resolved file path after Vite processing */
resolvedId?: string;
/** Generated script identifier for runtime */
scriptId?: string;
/** Name of the loader file (for loader type scripts) */
loaderName?: string;
/** Output filename after build processing */
fileName?: string;
/** Whether this is a dynamically injected script */
isDynamicScript?: boolean;
/** Match patterns where this script should be injected */
matches: string[];
/** Associated CSS files for this content script */
css?: string[];
}Content Script Types:
The plugin automatically processes content scripts through several stages.
Development Processing:
Production Processing:
Support for runtime content script injection using Chrome's scripting API.
// Usage in background script
import scriptLoader from "./content-script.ts?script";
// Inject content script dynamically
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: [scriptLoader], // Uses the generated loader file
});Script Loading Formats:
// Different import formats for different use cases
// Default: ES module with loader and HMR
import contentScript from "./content.ts?script";
// Explicit loader format
import contentScriptLoader from "./content.ts?script&loader";
// IIFE format for isolated execution
import contentScriptIIFE from "./content.ts?script&iife";
// Pure ES module without loader
import contentScriptModule from "./content.ts?script&module";Automatic handling of CSS files associated with content scripts.
CSS Injection Options:
// In vite.config.ts
export default defineConfig({
plugins: [
crx({
manifest,
contentScripts: {
injectCss: true, // Default: automatically inject CSS
},
}),
],
});CSS Processing Features:
Automatic management of web-accessible resources for content scripts.
interface WebAccessibleResourceByMatch {
matches: string[];
resources: string[];
use_dynamic_url?: boolean;
}
interface WebAccessibleResourceById {
extension_ids: string[];
resources: string[];
use_dynamic_url?: boolean;
}Automatic Resource Registration:
Advanced HMR support specifically designed for Chrome extension content scripts.
HMR Features:
HMR Configuration:
export default defineConfig({
plugins: [
crx({
manifest,
contentScripts: {
hmrTimeout: 5000, // HMR connection timeout
preambleCode: `
console.log('Content script with HMR loaded');
// Custom initialization code
`,
},
}),
],
});Multi-World Content Scripts:
// Main world injection (interacts with page JavaScript)
import mainWorldScript from "./main-world.ts?script&module";
// Isolated world content script (default Chrome extension context)
import isolatedScript from "./isolated.ts?script";
// Background script coordination
chrome.scripting.executeScript({
target: { tabId },
files: [mainWorldScript],
world: "MAIN", // Inject into main world
});Conditional Content Script Loading:
import { defineManifest } from "@crxjs/vite-plugin";
const manifest = defineManifest(({ mode }) => ({
manifest_version: 3,
name: "Dynamic Extension",
version: "1.0.0",
content_scripts: [
{
matches: ["https://example.com/*"],
js: ["src/content.ts"],
},
// Development-only content script
...(mode === "development" ? [{
matches: ["<all_urls>"],
js: ["src/debug-content.ts"],
}] : []),
],
}));Content Script Communication:
// In content script (content.ts)
/// <reference types="@crxjs/vite-plugin/client" />
// Optional execution callback with performance metrics
export const onExecute: ContentScriptAPI.ExecuteFn = (options) => {
console.log(`Script injected in ${options.perf.injectTime}ms`);
console.log(`Script loaded in ${options.perf.loadTime}ms`);
// Initialize content script functionality
initializeContentScript();
};
function initializeContentScript() {
// Content script logic here
}Performance Optimization:
Security Considerations:
Development Workflow: