Modern web development has developed a dependency problem. To build a snappy, fluid interface with smooth transitions and zero full-page reloads, the industry default is to reach for 200KB+ client runtimes—React, Vue, complex routers, virtual DOMs, and layers of client-side cache managers.
Most websites do not need an entire client-side ecosystem just to swap out a page container without a white flash.
That frustration led me to build and publish @gellish/micro-framework on npm: a lightweight, standalone Single Page Application (SPA) engine designed to deliver instant page transitions, native event telemetry, and clean document sync without bloated client dependencies.
The Core Problem: The JavaScript Overhead Trap
When you pair traditional backend architectures (like Laravel, AdonisJS, or raw semantic HTML) with full client-side SPA frameworks, you introduce unnecessary friction:
Hydration Lag: The browser parses massive JavaScript bundles before a page becomes truly interactive.
State Duplication: Routing, data validation, and navigation state must be maintained twice—once on the server and once on the client.
Build Step Complexity: Managing bundlers, node modules, and transpilation layers just to deliver text and layout updates.
I wanted the fluid navigation of an SPA while keeping the simplicity and speed of plain HTML. Instead of bringing in a massive third-party dependency, I built a modular engine around a core architectural pattern: Fetch-Parse-Swap.
How It Works: The Fetch-Parse-Swap Lifecycle
At its foundation, @gellish/micro-framework intercepts standard document navigation and handles page updates gracefully under the hood.
[User Clicks Link]
│
▼
[Intercept Event] ──► [Fetch Target URL (Background)]
│
▼
[Parse DOM Fragment]
│
┌──────────────────────┴──────────────────────┐
▼ ▼
[Swap Target Container] [Sync Document State]
(Zero White Flash) - document.title
│ - body.className
▼ - URL & History
[Dispatch 'spa:navigated'] ──► UI Components React
Instead of letting the browser tear down the whole window, the engine:
Intercepts Navigation: Captures link clicks and prevents default page reloads.
Fetches & Parses: Grabs the destination HTML via standard
fetchand parses the response into a lightweight DOM tree in memory.Swaps Content: Replaces only the specified container element seamlessly.
Synchronizes State: Updates
document.title, adjustsbody.classNamefor page-specific styling, pushes the new path into the native History API, and updates connection state indicators.
Developer Experience: Simplicity First
A primary goal of the package was keeping setup minimal. Getting the full lifecycle running in any project takes only two lines of code:
JavaScript
import SPA from '@gellish/micro-framework';
SPA.init();
Full UI Synchronization via Custom Events
Decoupled components need to know when a route changes. @gellish/micro-framework dispatches a native spa:navigated event on the window object every time a transition completes:
JavaScript
window.addEventListener('spa:navigated', (e) => {
const { url, time } = e.detail;
console.log(System Online: Navigated to ${url} at ${time});
// Re-initialize dynamic components, run analytics, or reset scroll state
});
Because it emits standard DOM events, it integrates cleanly with any vanilla script, UI component, or third-party library without needing a dedicated framework adapter.
Built-In Observability: Status and Monitoring
Beyond swapping HTML, @gellish/micro-framework includes built-in state telemetry to provide immediate visual feedback during network operations:
FeatureWhat It DoesMulti-Stage Status EngineAutomatically manages application network states (SYNCED, FETCHING, ONLINE) for real-time visual badges.Performance LoggingTracks navigation latency and request duration, surfacing bottlenecks directly.Clean SEO SyncPreserves search-engine-friendly standard markup while ensuring client viewports stay fully aligned with the active route.
Architectural Philosophy: Own Your Foundation
Publishing @gellish/micro-framework was driven by a clear realization: understanding the lower-level mechanics of the web makes you a significantly better developer.
Building an engine from scratch forces you to handle edge cases directly: managing history stacks, parsing string responses into DOM fragments, handling browser back/forward buttons, and orchestrating component lifecycles cleanly.
Whether paired with an AdonisJS backend, an internal dashboard, or a static site, @gellish/micro-framework proves that you don't always need massive vendor abstractions to deliver smooth, modern web experiences. Sometimes, a focused, well-architected micro-engine is all you need.
Discussion
Sign in with GitHub to comment. Comments are moderated.