Лёгкий (без внешних зависимостей) vanilla-JS фреймворк для одностраничных приложений: маршрутизация, AJAX/REST, шаблонизатор, работа с формами и валидацией, офлайн-хранилища (IndexedDB / Web SQL), таблицы-спредшиты, жизненный цикл приложения, а сверх этого — биометрическая аутентификация и векторная/растровая графика для дашбордов.
Часть этого README и
docs/*.mdв разное время расходилась с реальным кодом (упоминала объекты/сигнатуры, которых в библиотеке никогда не было, или которые с тех пор изменились). Ниже — версия, сверенная непосредственно с исходниками вsrc/и подтверждённая рабочими примерами вexamples/.
build/ готовые *.min.js + *.sha384 (SRI-хэши для <script integrity="...">)
docs/ документация по отдельным частям API (см. таблицу ниже)
examples/ рабочие HTML-примеры на каждую тему — открывайте examples/index.html
src/ исходники + build.jsroll.sh/build.extra.sh (сборочные скрипты)
composer.json метаданные пакета (composer используется как менеджер веб-пакета, не для PHP-зависимостей)
AI_CONTEXT.md компактный технический контекст для AI-агентов/код-ассистентов
Ядро (jsroll.js + jsroll.ui.js) собрано в один файл:
<script src="build/jsroll.min.js" charset="UTF-8"></script>Остальное — необязательные надстройки, каждая в своём <script> (и
требует, чтобы jsroll.min.js был подключён раньше, поскольку опираются
на window.ui):
<script src="build/jsroll.min.js" charset="UTF-8"></script>
<script src="build/jsroll.dao.min.js" charset="UTF-8"></script> <!-- IndexedDB / Web SQL -->
<script src="build/jsroll.ui.grid.min.js" charset="UTF-8"></script> <!-- редактируемые таблицы -->
<script src="build/jsroll.svg.min.js" charset="UTF-8"></script> <!-- SVG-графика -->
<script src="build/jsroll.image.min.js" charset="UTF-8"></script> <!-- canvas-графика -->
<script src="build/jsroll.auth.min.js" charset="UTF-8"></script> <!-- WebAuthn -->
<script src="build/jsroll.tools.min.js" charset="UTF-8"></script> <!-- независим от остального -->| Объект / функция | Что делает | Документация |
|---|---|---|
window.urn |
Маршрутизатор (History API): urn.add(pattern, handler).chk().lsn(), urn.set(path). Не window.router — так называлась несуществующая версия в старой документации. |
docs/router.md |
el.ui.on(...) / el.ui.dg(...) |
Подписка на события (прямая/делегированная). Не window.event — такого объекта в библиотеке нет. |
docs/event.md |
xhr(opt) |
AJAX/REST-запросы поверх XMLHttpRequest, с полноценной поддержкой любых HTTP-методов (не только GET/POST — см. пример форм). |
docs/xhr.md |
tpl(id, data, cb?) |
Шаблонизатор ({% %}/{%= %}), источник — DOM-элемент, URL или строка. |
docs/tmpl.md |
ui.el(sel) / ui.els(sel) |
Поиск + «оборачивание» DOM-элементов — только так у элемента появляются .ui/.css. document.querySelector(...).ui не работает (см. docs/event.md). |
— |
Application |
Жизненный цикл SPA: onready, куки, кастомные события (addEventListener/dispatchEvent), confirmReload, changeVersion. Не создаётся автоматически — window.app = new Application(...). |
пример: examples/application/ |
group / crud |
Форма как единый объект данных: form.data (геттер/сеттер), валидация, отправка. Работает и на части полей, не только на весь <form>. |
пример: examples/forms/ |
typeahead(el, opt) / maskedigits(el, pattern, cleared) |
Автокомплит и маскированный ввод (только цифры, маска любая). | пример: examples/forms/ |
storage() |
localStorage с in-memory fallback при QUOTA_EXCEEDED_ERR. Вызывается как функция: storage().setItem(...), не storage.setItem(...). |
— |
location.params()/decoder()/encoder()/update() |
Разбор и сборка query-строки. | — |
uuid(), datetimer(), QueryParam(), экспорт в CSV/Word/Excel и др. |
Набор утилит общего назначения. | — |
| Модуль | Что добавляет | Документация | Пример |
|---|---|---|---|
jsroll.dao.js |
IDBmodel (IndexedDB) и webSQLmodel (Web SQL, устарел и удалён из всех современных браузеров — оставлен для legacy-кода) — офлайн-модели данных. |
— | examples/idb/, examples/websql/ |
jsroll.ui.grid.js |
grid()/journal() — редактируемые HTML-таблицы с формулами, клавиатурной навигацией, добавлением/удалением строк и столбцов. |
— | examples/grid/ |
jsroll.svg.js |
Создание/удаление/анимация SVG-примитивов (линии, круги, дуги, многоугольники — для графиков и диаграмм). | docs/svg.md |
examples/svg/ |
jsroll.image.js |
То же самое на <canvas>, с выводом в настоящий <img> (canvas.toImage()). |
docs/image.md |
examples/image/ |
jsroll.auth.js |
Биометрическая аутентификация (Touch ID/Face ID/Windows Hello) через WebAuthn — без паролей. | docs/auth.md |
examples/webauthn/ |
jsroll.tools.js |
tool.ping(host) — быстрая проверка доступности хоста. Единственный модуль без зависимости от jsroll.ui.js. |
— | — |
Полный список рабочих примеров — examples/index.html. Каждый пример —
самостоятельная HTML-страница, которую можно открыть прямо в браузере.
{
"repositories": [
{
"url": "git@github.com:bermud-ru/jsroll.git",
"type": "git"
}
],
"require": {
"bermud-ru/jsroll":"*@dev"
},
"scripts": {
"post-install-cmd": [
"./vendor/bermud-ru/jsroll/post-install"
],
"post-update-cmd": [
"./vendor/bermud-ru/jsroll/post-update"
]
}
}Composer здесь используется только как удобный способ подтянуть файлы библиотеки в веб-проект (в т.ч. не на PHP) — самой библиотеке PHP не нужен.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>jsroll quickstart</title>
<script type="text/javascript" src="build/jsroll.min.js" charset="UTF-8"></script>
<script type="text/x-template" id="welcome">
<h3>{%= caption %}</h3>
<p>{%= text %}</p>
</script>
</head>
<body>
<div class="container">Container demo!</div>
<script>
ui.el('.container').innerHTML = tpl('welcome', {
caption: 'welcome!',
text: 'RIA (Rich Internet Application) / SPA (Single-page Application) javascript framework'
});
</script>
</body>
</html>src/build.jsroll.sh склеивает jsroll.js + jsroll.ui.js -> build/jsroll.min.js
src/build.extra.sh минифицирует остальные модули по отдельности (dao/ui.grid/svg/image/auth/tools),
добавляет заголовок с версией и пишет build/*.min.js + src/*.min.sha384
Оригинальный yuicompressor-2.4.8.jar — устаревший, давно снятый с
поддержки инструмент, обычно недоступный в современном окружении; при его
отсутствии build.extra.sh минифицирует через terser
(npx terser <file> --compress --mangle -o <file>.min.js), результат
эквивалентен.
document.querySelector(sel).ui— всегдаundefined. Свойства.ui/.cssпоявляются только черезui.el(sel)/ui.els(sel)(или.ui.el(...)на уже обёрнутом элементе). Подробности и последствия —docs/event.md.- Внутри
xhr()-колбэковdone/fail/after—thisне объектXMLHttpRequest(вызываются как обычные функции, без.call(x, ...)). Сам запрос — через аргумент:ui.src(e)/e.target. Подробности —docs/xhr.md. group/xhr()-формы умеют полноценный REST:<form method="put">(илиpatch/delete) реально отправляет этот HTTP-метод черезXMLHttpRequest, хотя нативный HTML5<form>официально понимает толькоget/post. Подробности —examples/forms/.form.data(геттер) собираетname="a[b]"во вложенный объект{a:{b:...}};form.data = {...}(сеттер) так не делает — ключи должны буквально совпадать со строкойname. Подробности —examples/forms/.- Чекбоксы одной группы: без атрибута
pack— обычный массив выбранных значений; сpack="1"(именно с непустым значением, не голыйpack) — битовая маска в одно число. Подробности —examples/forms/. - Web SQL (
webSQL/webSQLmodelвjsroll.dao.js) полностью удалён из всех современных браузеров (Chrome — с версии 124, апрель 2024; Safari — ещё в 2019; Firefox не поддерживал никогда) — оставлен в библиотеке только для чтения/поддержки legacy-кода, актуальный офлайн-аналог — IndexedDB (IDB/IDBmodel).