UNPKG

rynex

Version:

A minimalist TypeScript framework for building reactive web applications with no virtual DOM

325 lines (250 loc) 7.56 kB
# Rynex Framework A minimalist TypeScript framework for building reactive web applications with no Virtual DOM. ## Features - **No Virtual DOM**: Direct DOM manipulation for maximum performance - **Reactive State**: Proxy-based reactivity with automatic UI updates - **File-Based Routing**: Next.js style routing with dynamic routes - **TypeScript First**: Full type safety out of the box - **Zero Configuration**: Sensible defaults, works immediately - **Production Ready**: Express server with native HTTP fallback - **Hot Module Replacement**: Instant feedback during development - **Automatic Cache-Busting**: Always serve fresh content to users on deployment - **Tiny Bundle**: Approximately 15KB gzipped ## Quick Start ```bash # Create new project npx rynex init my-app cd my-app # Install dependencies pnpm install # Start development server pnpm dev ``` Your application will be running at `http://localhost:3000` ## Example ### Simple Counter Component ```typescript import { state } from 'rynex'; import * as UI from 'rynex'; export default function Counter() { const counterState = state({ count: 0 }); return UI.vbox({ style: { padding: '2rem', gap: '1rem' } }, [ UI.text({}, () => `Count: ${counterState.count}`), UI.hbox({ style: { gap: '0.5rem' } }, [ UI.button({ onClick: () => counterState.count-- }, 'Decrement'), UI.button({ onClick: () => counterState.count++ }, 'Increment') ]) ]); } ``` ## Core Concepts ### Reactive State Management ```typescript import { state, computed, effect } from 'rynex'; // Create reactive state const appState = state({ count: 0, name: 'John' }); // Computed values const doubled = computed(() => appState.count * 2); // Side effects effect(() => { console.log('Count changed:', appState.count); }); // Updates trigger automatic re-renders appState.count++; ``` ### File-Based Routing Organize pages by file structure: ``` src/pages/ ├── index.ts # Route: / ├── about.ts # Route: /about ├── blog/ │ ├── page.ts # Route: /blog │ └── [slug]/ │ └── page.ts # Route: /blog/:slug (dynamic) └── user/ └── [id]/ └── page.ts # Route: /user/:id (dynamic) ``` ### Dynamic Routes ```typescript import * as UI from 'rynex'; import { RouteContext } from 'rynex'; export default function UserPage(ctx: RouteContext) { const userId = ctx.params.id; return UI.vbox({ style: { padding: '2rem' } }, [ UI.h1({}, `User Profile: ${userId}`), UI.text({}, `Viewing profile for user ${userId}`), UI.link({ href: '/' }, 'Go Home') ]); } ``` ## CLI Commands ```bash # Create new project rynex init [project-name] # Start development server with HMR rynex dev # Build for production rynex build # Start production server rynex start # Add integrations (e.g., Tailwind CSS) rynex add tailwind # Clean build artifacts rynex clean ``` ## Styling with Tailwind CSS Rynex supports Tailwind CSS out of the box with a simple opt-in setup: ```bash # Add Tailwind CSS to your project rynex add tailwind # Choose your package manager (npm/pnpm/yarn/bun) # The command will: # - Install tailwindcss, postcss, and autoprefixer # - Create tailwind.config.js # - Configure your CSS files # - Add necessary imports # Start development pnpm dev ``` ### Using Tailwind Classes ```typescript import * as UI from 'rynex'; export default function App() { return UI.container({ class: 'flex items-center justify-center min-h-screen bg-gray-100' }, [ UI.vbox({ class: 'bg-white p-8 rounded-lg shadow-lg max-w-md' }, [ UI.text({ class: 'text-3xl font-bold text-gray-800 mb-4' }, 'Hello Tailwind!'), UI.button({ class: 'bg-blue-500 hover:bg-blue-600 text-white px-6 py-3 rounded-lg transition-colors', onClick: () => console.log('Clicked!') }, 'Get Started') ]) ]); } ``` **Features:** - ✅ Automatic class detection in `class: 'flex'` syntax - ✅ JIT mode for fast compilation - ✅ Hot reload in development - ✅ Auto-purging in production - ✅ Latest Tailwind CSS v4.x ## Configuration Create `rynex.config.js` in your project root: ```javascript export default { entry: 'src/index.ts', output: 'dist/bundle.js', port: 3000, minify: true, sourceMaps: true, hotReload: true, // Routing configuration routing: { mode: 'history', fileBasedRouting: true, pagesDir: 'src/pages', scrollBehavior: 'smooth' }, // Build configuration build: { splitting: true, chunkSize: 500, publicPath: '/' } }; ``` ## Project Structure ``` my-app/ ├── src/ │ ├── index.ts # Entry point │ ├── App.ts # Main component │ ├── components/ # Reusable components │ └── pages/ # Route pages ├── public/ │ ├── index.html # HTML template │ └── styles.css # Global styles ├── dist/ # Build output ├── rynex.config.js # Configuration ├── package.json └── tsconfig.json ``` ## Documentation Complete documentation is available in the `docs/` directory: - [Getting Started](./docs/GETTING_STARTED.md) - Installation and first steps - [Routing Guide](./docs/ROUTING_GUIDE.md) - File-based routing and navigation - [Configuration](./docs/CONFIGURATION.md) - Project configuration options - [Cache-Busting](./docs/CACHE-BUSTING.md) - Automatic cache invalidation for deployments - [Examples](./docs/EXAMPLES.md) - Real-world code examples ## Key Features ### UI Helper Functions - **Layout**: `vbox`, `hbox`, `grid`, `container`, `center`, `stack` - **Elements**: `text`, `button`, `input`, `link`, `image`, `div`, `span` - **Typography**: `h1-h6`, `p`, `strong`, `em`, `code`, `pre` - **Forms**: `form`, `textarea`, `select`, `checkbox`, `radio` - **Components**: `card`, `badge`, `avatar`, `modal`, `dropdown`, `tooltip` - **Utilities**: `show`, `each`, `when`, `fragment`, `portal` ### Router Features - File-based routing (Next.js style) - Dynamic routes with parameters - Catch-all routes - Route middleware and guards - Lazy loading with code splitting - Navigation hooks - Router components (Link, NavLink, Breadcrumb) ### State Management - Proxy-based reactivity - Computed values - Side effects - Batch updates - Automatic dependency tracking ## Design Philosophy 1. **Simplicity First**: No complex build configurations 2. **Direct DOM**: No Virtual DOM overhead 3. **Reactive by Default**: State changes automatically update UI 4. **TypeScript Native**: Built with TypeScript for TypeScript 5. **Performance**: Minimal runtime with efficient updates 6. **Developer Experience**: Hot reload, source maps, clear errors ## Performance - No Virtual DOM diffing overhead - Direct DOM updates - Lazy loading support - Code splitting - Tree shaking - Minification - Compression (with Express) ## Browser Support - Chrome (latest) - Firefox (latest) - Safari (latest) - Edge (latest) ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## License Apache License 2.0 - see [LICENSE](./LICENSE) file for details ## Links - [GitHub Repository](https://github.com/razen-core/rynex) - [Documentation](./docs/) - [Examples](./examples/) - [Issue Tracker](https://github.com/razen-core/rynex/issues) --- Built with care by the Razen Core - Developer: Prathmesh Barot