Примеры F1
Двадцать три маленьких проекта: от минимального листа до миллиона строк, совместной работы и связей между книгами.
Каждый пример — работающий маленький проект, а не выдержка из кода. Но
считает в них не ядро: на его месте стоит дублёр, а сами проекты собраны из
пакетов @f1/* — они идут пакетами движка (Состав
поставки) и в открытый реестр npm не публикуются. Поэтому смотреть здесь нужно на объём кода — сколько его
нужно написать вокруг листа для каждой задачи, — а не на числа в ячейках.
Настоящее ядро с настоящим пересчётом — в живом примере: там книга открыта в отдельном процессе, и правка ячейки меняет итоги по-честному.
Смотреть их стоит по порядку: первые отвечают на вопрос «сколько нужно написать, чтобы получить лист», дальше идут отдельные умения, а в конце — предельные случаи вроде миллиона строк и работы без экрана.
Минимальный листсколько строк нужно, чтобы получить работающий лист
Лист с лентойкак добавить нашу ленту, если она нужна
Встраивание в чужую страницучто будет с чужой страницей вокруг листа: её шрифт, фон и прокрутка
Миллион строкцена трёх жестов на предельной книге — прокрутки, протяжки и масштаба: кадр p50 и p95 и обращения к ядру числами, а не обещанием
Перекрестьеподсветка строки и столбца активной ячейки: выключена по умолчанию и включается свойством
Только чтениекнига видна, но не правится: команды серые с причиной, а не спрятаны, и правка не начинается вовсе
Свои заголовкиподписи строк и столбцов задаёт встраивающий, а ширина полосы считается по его тексту
Лист без полос заголовковполосы прячутся одним свойством, и освободившееся место занимает сам лист
Свой пункт менючужой пункт в нашем меню: за чертой, под именем владельца и со своей командой — притвориться нашим он не может
Своё сочетание клавишчужое сочетание срабатывает, а занятые листом (Ctrl+D, Ctrl+R, F2, Shift+Пробел) остаются за листом — отказ виден словами
Свой языкязыка нет в наших трёх — его приносит хозяин страницы: подписи переводятся, непереведённое идёт запасной цепочкой, а не пропадает
Перетащите книгу сюдачужой документ открывается байтами: оболочка доносит файл, разбор остаётся за швом контракта, а отказ приходит словами того, кто открывал — на витрине это заглушка, она берёт csv, tsv и txt, а на xlsx честно отказывает
Двое в одном документедве рамки рядом: двигаете выделение в одной — во второй виден чужой курсор с именем; и прямо на экране написано, что видны только окна этого браузера
Помощники ведут листдо десяти внешних участников, каждый в своём процессе: ходит по своей колонке, выделяет участок и вписывает итог — намерениями через тот же канал; отказ в лишнем виден и ему, и человеку; не запустили — страница так и говорит
Своё событиедве точки расширения наружу: onCommand отдаёт любое намерение поверхности (наше и чужое), onGesture — цену закончившегося жеста числами
Гиперссылкассылка — свойство ячейки: одна операция ядра ставит её вместе с текстом, снимает, оставляя текст, и сама называет ссылки листа
Найти и заменитьпоиск — один запрос, замена — два, и первый книгу не меняет: ядро вычисляет план правок, а пишет их та же дорога, что ввод
Примечанияшесть действий примечаний одной операцией контракта — перечислить, создать, удалить, ответить, отменить, повторить; текст, номер и нормализованный адрес называет ядро
Структура листавосемь действий — одна операция: оболочка называет диапазон, ось и действие, а уровни и что спрятать считает ядро
Разметка страницгде ляжет разрыв — единственный метод SDK, который спрашивает и ничего не меняет; саму печать делает хост, и это граница, а не пробел
Разрешить изменение диапазоновшесть намерений из десяти, что есть у операции: пароль уходит за шов и не возвращается — обратно приходит только способ защиты
Связи книгиформула считает по чужой книге: список связей, их состояние и адрес источника приходят от ядра, а открывает книгу хозяин окна
Голова без экранакнига открывается, правится и читается из Node — без единого обращения к DOM
Как это связано с ядром
Заголовок раздела «Как это связано с ядром»Примеры показывают оболочку — то, что видит и трогает пользователь. Считает не она: за вычисления, формулы, историю и сохранение отвечает ядро, и разговаривают они через одно-единственное место — транспорт.
В примерах на месте ядра стоит дублёр: createMockTransport возвращает
придуманные значения, чтобы лист было на чём показать. Поэтому цифры в них
ничего не значат — важно, сколько кода нужно написать вокруг.
В вашем продукте меняется ровно эта строка: вместо дублёра ставится настоящий транспорт — сборка ядра в браузере или мост к процессу рядом. Остальной код примера остаётся как есть.
Что именно умеет ядро по ту сторону транспорта, описано в справочнике Compute Contract: это те самые операции, которые оболочка и вызывает.
Пять правил, на которые ссылается код
Заголовок раздела «Пять правил, на которые ссылается код»Комментарии в примерах часто объясняют решение ссылкой на правило: «второй владелец книги не заводится (инвариант №2)». Правил всего пять, они общие для всех примеров и звучат так.
| Правило | О чём оно |
|---|---|
| №1 | Считает ядро, оболочка только показывает. Ни формул, ни истории, ни записи файла на стороне интерфейса нет. |
| №2 | Второй владелец книги не заводится: любая правка идёт той же дорогой, что и ввод с клавиатуры, — своей у неё нет. |
| №3 | Не показывать несделанное сделанным. Нарисовать в примере то, чего продукт не умеет, нельзя даже картинкой; в комментариях это названо fake-green. |
| №4 | Реестр команд принадлежит листу. Команды встраивающего в него не попадают — они живут своей стороной и не смешиваются с нашими. |
| №5 | Событие ничего не применяет и ничего не требует: лист поднимает намерение, а решает хозяин страницы. |
Как ими пользоваться
Заголовок раздела «Как ими пользоваться»Файлы каждого примера показаны на его странице целиком. Проект лежит в
examples/f1/<имя примера> — можно взять его как заготовку и заменить
книгу на свою.
- Как устроен лист внутри — Архитектура.
- Что можно вызвать сегодня — справочник Compute Contract.