Modern MVC for building user interfaces


Keywords
mvc, model, view, component, emitter, ui, user interface, backbone, javascipt, javascript-libary, user-interface
License
MIT
Install
npm install rasti@3.0.1

Documentation

Rasti.js

Modern MVC for building user interfaces

Rasti is a lightweight MVC library for building fast, reactive user interfaces. Inspired by Backbone.js, it retains a familiar API while removing non-essential features and introducing modern, declarative, and composable components to simplify complex UI development.

Travis (.com) npm version npm package minimized gzipped size npm downloads jsDelivr hits (npm)

Key Features

  • Declarative Components 🌟
    Build dynamic UI components using intuitive template literals.
  • Event Delegation 🎯
    Simplify event handling with built-in delegation.
  • Model-View Binding πŸ”—
    Keep your UI and data in sync with ease.
  • Server-Side Rendering 🌐
    Render as plain text for server-side use or static builds.
  • Lightweight and Fast ⚑
    Minimal overhead with efficient rendering.
  • Legacy Compatibility πŸ•°οΈ
    Seamlessly integrates into existing Backbone.js projects.
  • Standards-Based πŸ“
    Built on modern web standards, no tooling required.

Getting Started

Installing via npm

$ npm install rasti
import { Model, Component } from 'rasti';

Using ES modules

import { Model, Component } from 'https://esm.run/rasti';

Using a <script> tag

<script src="https://cdn.jsdelivr.net/npm/rasti/dist/rasti.min.js"></script>
const { Model, Component } = Rasti;

Create a Component

// Define a Timer component that displays the number of seconds from the model.
const Timer = Component.create`
    <div>
        Seconds: <span>${({ model }) => model.seconds}</span>
    </div>
`;

// Create a model to store the seconds.
const model = new Model({ seconds: 0 });

// Mount the Timer component to the body and pass the model as an option.
Timer.mount({ model }, document.body);

// Increment the `seconds` property of the model every second.
setInterval(() => model.seconds++, 1000);

Try it on CodePen

Adding sub components

// Define the routes for the navigation menu.
const routes = [
    { label: 'Home', href: '#' },
    { label: 'Faq', href: '#faq' },
    { label: 'Contact', href: '#contact' },
];

// Create a Link component for navigation items.
const Link = Component.create`
    <a href="${({ options }) => options.href}">
        ${({ options }) => options.renderChildren()}
    </a>
`;

// Create a Navigation component that renders Link components for each route.
const Navigation = Component.create`
    <nav>
        ${({ options, partial }) => options.routes.map(
            ({ label, href }) => partial`<${Link} href="${href}">${label}</${Link}>`
        )}
    </nav>
`;

// Create a Main component that includes the Navigation and displays the current route's label as the title.
const Main = Component.create`
    <main>
        <${Navigation} routes=${({ options }) => options.routes} />
        <section>
            <h1>
                ${({ model, options }) => options.routes.find(
                    ({ href }) => href === (model.location || '#')
                ).label}
            </h1>
        </section>
    </main>
`;

// Initialize a model to store the current location.
const model = new Model({ location: document.location.hash });

// Update the model's location state when the browser's history changes.
window.addEventListener('popstate', () => model.location = document.location.hash);

// Mount the Main component to the body, passing the routes and model as options.
Main.mount({ routes, model }, document.body);

Try it on CodePen

Why Choose Rasti?

Rasti is built for developers who want a simple yet powerful way to create UI components without the complexity of heavy frameworks. Whether you're prototyping, building a high-performance dashboard, or modernizing a Backbone.js app, Rasti lets you:

  • Skip the Setup
    No installations, no build toolsβ€”just load it and start coding.
  • Lightweight and Efficient
    Minimal footprint with optimized performance, ensuring smooth updates.
  • Upgrade Legacy Code Without a Rewrite
    Incrementally enhance Backbone.js views while keeping existing functionality.

Example

You can find a sample TODO application in the example folder of the Rasti GitHub repository. This example serves as a great starting point for your own projects. Try it live here.

API Documentation

For detailed information on how to use Rasti, refer to the API documentation.

Powered by Rasti

A market analytics platform efficiently rendering over 300 dynamic rows, updated in real-time with thousands of messages per second via multiple WebSocket connections.

A DOM-based remake of the classic Ms. Pac-Man game. Rasti powers its custom game engine.

License

Rasti is open-source and available under the MIT License.

Contributing

Contributions are welcome! Share feature ideas or report bugs on our GitHub Issues page.