npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

frontend-framework-turbo

v3.2.0

Published

[TESTS] Run all tests ```npm run test:run```, or run specific test file ```npm run test:run sample```

Readme

USEFUL

[TESTS] Run all tests npm run test:run, or run specific test file npm run test:run sample

[CDN] Content Delivery Network To import fwk import { createApp, h } from 'https://unpkg.com/<fwk-name>' for a specific version https://unpkg.com/<fwk-name>@1.0.0' or last major version https://unpkg.com/<fwk-name>@1'

INSIGHTS

  1. VanillaJS (Default HTML + JS + CSS) implementation: mix of application logic and DOM manipulation, using the document API to modify the browsers document. "Double Burden" of imperative UI, meaning logic and its UI representation are 2 separate states/environments. // Mixing two distinct layers of abstraction: the actual logic of the application and DOM manipulation (adding/updating/removing).
  2. Imperative VS Declarative: Imperative means a step-by-step description of how to do something. Declarative describes what to do, but without specifying how to do it.
  3. THREE MAIN types of DOM nodes that need to be represented as virtual nodes:
    • text nodes - simplest type of node, no tag name, no attributes, no children, no props - just text content
    • element nodes - most common type, HTML elements ("div", "p" or "ul" etc.)
    • fragment nodes - collection of nodes, temporary container, lightweight version of "Document", if 100 items need to be added to a list, they will be added to Fragment first, instead of recalculating the layout of the actual DOM 100 times for each item.
    • example of building nodes using framework: Example
  4. Model-View-Controller (MVC) and Model-View-ViewModel (MVVM) software architecture designs that separate logic/concerns.
    • MVC (Model -> View -> Controller):
      • Model: The data and the "source of truth." It handles database logic.
      • View: The UI (what the user sees). It’s usually "dumb", only displays.
      • Controller: The brain. It takes user input from the View, processes it (using the Model), and tells the View what to update.
    • MVVM (Model-View-ViewModel):
      • Model: same as MVM, data and business logic.
      • View: The UI, but this time active
      • ViewModel: It acts as a converter. It takes data from the Model and turns it into a format the View can easily display. Also called Data Binding, kinda works similar to a virtual DOM, by creating a separating layer, that maps all fields/states to specific data and uses them as a shortcut.

// The application creates the virtual DOM that the framework renders into the DOM Example 5. Virtual DOM saves reference of all real DOM nodes under el property (el for element). This is how reconciliation algorithm knows what DOM nodes to update.

  • el for regular node properties and listeners property for event listeners (buttons etc.), text for text nodes Example
  1. Real DOM uses Document API (set of tools, methods) to manipulate & interact the content of a web page.

Example

  1. SETUP: Define Handler -> Dispatcher subscribes -> Dispatcher saves the handler ACTION: Button click -> EventListener -> Handler -> Dispatcher dispatches, finds correct functions -> Command executed (Handler triggered)

Example

2.0.0 Version Functionality:

  • First version is made of a renderer and a state manager wired together.
  • The renderer first destroys the DOM (if it exists) and then creates it from scratch. This process isn’t very efficient and creates problems with the focus of input fields, among other things.
  • The state manager is in charge of keeping the state and view of the application in sync.
  • The developer of an application maps the user interactions to commands, framed in the business language, that are dispatched to the state manager.
  • The commands are processed by the state manager, updating the state and notifying the renderer that the DOM needs to be updated.
  • The state manager uses a reducer function to derive the new state from the old state and the command’s payload.

3.0.0 Version Functionality:

  • The reconciliation algorithm has two main steps: diffing (finding the differences between two virtual trees) and patching (applying the differences to the real DOM)
  • Diffing two virtual trees to find their differences boils down to solving three problems: finding the differences between two objects, finding the differences between two arrays, and finding a sequence of operations that can be applied to an array to transform it into another array.

Example

  1. Arrow functions are lexically scoped, meaning they inherit "this" keyword binding from parent, while regular functions takes binding based on who calls it