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

tyaff

v0.0.7

Published

Tyaff — VDOM library for JavaScript

Readme

Note: This is the original Russian version. The English translation is available in README.md.

Tyaff — VDOM библиотека для JavaScript

Проект экспериментальный — проверяется новый подход к memo(), возможность переноса элементов между родителями, мутабельная работа с данными, а также возможности современных ИИ при решении сложных задач.

Ключевые отличия от React

  • memo() блокирует только текущий компонент — дети продолжают свою цепочку обновлений независимо, что делает оптимизацию предсказуемой
  • Мутабельные данные из любых источников — компонент может читать глобальный store, singleton или window напрямую, без props drilling
  • Pull-based контекст без Provider/Consumer — любой компонент объявляет себя провайдером через context: { key() { ... } }, дети запрашивают значения через this.context(key)
  • Props первым аргументом — сигнатуры init(props), memo(props), render({ title, items }) позволяют деструктурировать props прямо в определении
  • Ключи уникальны в пределах всего render — это позволяет перемещать компоненты между разными родителями с сохранением instance и state

Основные возможности

  • Компактный и производительный — минимальный размер API, собственный diff/patch алгоритм, batching обновлений через microtask
  • Оптимизирован для массовых операций — reverse, swap, перемещение между родителями быстрее React
  • Динамическое дерево контекстов — иерархическая система провайдеров с автоматической передачей через HTML-теги
  • Компоненты на основе фабрик — единый способ создания, автоматический биндинг методов, гибкий lifecycle
  • Порталы с отложенным монтированием — монтирование в произвольный DOM-контейнер с якорными узлами
  • Система ключей — пользовательские ключи уникальны в пределах всего render, автоматические ключи на основе пути
  • Fragment с key — группировка детей без обёртки с возможностью перемещения групп

Установка

npm install tyaff

Быстрый старт

import { h, Component, mount } from 'tyaff';

const Counter = Component({
    count: 0,

    increment() {
        this.update({ count: this.count + 1 });
    },

    render() {
        return h('div', null,
            h('p', null, 'Счётчик: ' + this.count),
            h('button', { onClick: this.increment }, '+')
        );
    }
});

mount(Counter, document.getElementById('app'));

Пример: компоненты с context

const ThemeProvider = Component({
    theme: 'light',

    context: {
        theme() { return this.theme; },
        toggleTheme() {
            this.theme = this.theme === 'light' ? 'dark' : 'light';
            this.update();
        }
    },

    render() {
        return h('div', null, this.props.children);
    }
});

const ThemedButton = Component({
    render() {
        const theme = this.context('theme');
        return h('button', { className: 'btn-' + theme }, 'Кнопка');
    }
});

mount(
    h(ThemeProvider, null,
        h(ThemedButton)
    ),
    document.body
);

Пример: глобальный store

// store.js
export const store = { count: 0 };

// app.js
import { store } from './store.js';
import { h, Component, mount, refresh } from 'tyaff';

const Counter = Component({
    render() {
        return h('div', null, 'Count: ', store.count);
    }
});

mount(Counter, document.getElementById('app'));

// Обновление
store.count = 55;
await refresh();  // все компоненты перечитают store

Ресурсы

Благодарности

Этот проект — пример коллаборации человека и ИИ:

  • Человек: архитектура, дизайнерские решения, code review, видение
  • Qwen: разработка, оптимизация, документация, визуальный дизайн
  • GLM: разработка, оптимизация
  • Gemini: исследования и анализ (через Search)

Browser Support

  • Chrome 86+
  • Firefox 78+
  • Safari 14+
  • Все современные браузеры с поддержкой ES6 modules

Лицензия

MIT