Static Extraction
style-static extracts all CSS at build time, eliminating runtime stylesheet generation. This page explains the CSS extraction process in detail.What Is Static Extraction?
Static extraction means:- CSS is generated at build time - No runtime parsing or processing
- Virtual CSS modules - Each styled component gets its own CSS module
- Vite’s CSS pipeline - Leverages Vite’s built-in CSS optimization
- Zero dependencies - Uses native CSS features (nesting, variables, etc.)
CSS Extraction Flow
Template Content Extraction
The plugin extracts raw CSS from template literals:CSS from Variants
For variants, the plugin extracts CSS from different node types:Class Name Generation
Development Mode: Readable Names
In dev mode, class names include the variable name and file name:- Easy to identify in DevTools
- Helps debug which component owns which styles
- No collision risk (includes file name)
Production Mode: Hash-Based Names
In production, class names are hash-based for minimal size:- Minimal class name size (11-13 chars)
- Deterministic (same CSS = same hash)
- Low collision probability (8-char hash = ~2.8 trillion possibilities)
Hash Algorithm: Murmurhash2
The plugin uses Murmurhash2 for fast, deterministic hashing:/home/daytona/workspace/source/src/hash.ts:1-51 for full implementation.
Why Murmurhash2?
- Fast (non-cryptographic)
- Deterministic (same input = same output)
- Good distribution (low collision rate)
- Small output (base36 encoding)
CSS Wrapping Strategies
The plugin wraps CSS differently based on template type:1. Scoped Styles (styled/css)
2. Keyframes
animation properties.
3. Global Styles
4. Variant Styles
Variants generate multiple CSS rules:Virtual CSS Modules
Module ID Structure
Each styled component gets a unique virtual module ID:Virtual Module Storage
The plugin stores CSS content in an in-memory map:Virtual Module Resolution
The plugin implements Vite’sresolveId hook:
\0 prefix marks the module as virtual (not on disk).
Virtual Module Loading
The plugin implements Vite’sload hook:
/home/daytona/workspace/source/src/vite.ts:181-226 for full implementation.
CSS Output Modes
The plugin supports two CSS output modes:1. Virtual Mode (Default for Apps)
CSS is bundled as virtual modules into Vite’s single CSS file:- Simple output structure
- Vite handles deduplication
- Single HTTP request for all CSS
2. File Mode (Default for Libraries)
CSS is emitted as separate files co-located with JS:/home/daytona/workspace/source/src/vite.ts:549-596 for full implementation.
Output structure:
- CSS tree-shaking (only import what you use)
- Better for component libraries
- Consuming apps bundle only needed CSS
Native CSS Features
Zero Dependencies
The plugin uses zero dependencies for CSS processing:/home/daytona/workspace/source/src/vite.ts:7-12 for documentation.
Native CSS Nesting
All modern browsers support CSS nesting:Optional: Lightning CSS
For faster CSS processing and older browser support:- Faster CSS parsing and minification
- Automatic vendor prefixes
- CSS nesting polyfill for older browsers
- CSS module composition
/home/daytona/workspace/source/src/vite.ts:14-23 for documentation.
HMR Support
Hot Module Replacement
The plugin implements Vite’shandleHotUpdate hook:
/home/daytona/workspace/source/src/vite.ts:230-248 for full implementation.
What happens on file change:
- Plugin re-runs
transform()hook - New CSS content is extracted
- Virtual modules are invalidated
- Vite triggers HMR update
- New CSS is injected into DOM (dev) or re-bundled (build)
Dev Mode: DOM Injection
In dev mode, CSS changes are instantly reflected:Memory Management
The plugin cleans up stale CSS modules:/home/daytona/workspace/source/src/vite.ts:347-355 for implementation.
Why needed? Each HMR update creates new virtual modules. Without cleanup, memory usage would grow indefinitely.
Next Steps
- Learn about How It Works - complete transformation pipeline
- Learn about Zero Runtime - minimal runtime details