Настройка SSR

На сервере импортируйте только nabi-note/ssr, а не браузерные поверхности и UI. Он проверяет сохранённый JSON NABI TREE и превращает его в опубликованный HTML или HTML редактора, готовый к гидратации.

Рендеринг опубликованного HTML

ts
import { makeRegistry, renderStoredHtml, wings } from 'nabi-note/ssr'

const registry = makeRegistry(wings().allBasic().build())
const html = renderStoredHtml(storedJson, registry)

if (html === null) throw new Error('Не удалось прочитать сохранённый документ.')

renderStoredHtml() проверяет и нормализует свой JSON-ввод, а затем возвращает опубликованный HTML. null означает, что текущий registry не может прочитать этот ввод. На опубликованной странице подключите CSS пакета и .nabi-content.

html
<link rel="stylesheet" href="/assets/nabi.css">
<article class="nabi-content">...</article>

В браузере добавляйте attachViewer() из nabi-note/viewer только для интерактивной сортировки таблиц или подсветки кода. Обычному опубликованному содержимому нужен только CSS.

Гидратация заранее отрендеренной разметки редактора

Чтобы редактор был виден уже при первой отрисовке, отрендерьте его на сервере через renderStoredEditorHtml() и передайте hydrate: true браузерной поверхности.

ts
// сервер
const initialEditorHtml = renderStoredEditorHtml(storedJson, registry)

// браузер
const { nabi, registry } = createNabiWith(wings().allBasic(), { doc: storedJson })
const surface = mountSurface({ nabi, registry, root: content, hydrate: true })

Сервер и браузер должны использовать один документ, одни и те же объявления wing в одинаковом порядке и параметры, влияющие на HTML. Вставляйте результат сервера без изменений как непосредственных потомков корневого элемента содержимого и не задавайте этому корню заранее contenteditable. При различии структуры поверхность отрисует новый HTML редактора.

Предварительный рендеринг панели инструментов

renderToolbarHtml() и renderViewToolsHtml() могут заранее отрендерить элементы панели на сервере. Монтирование в браузере подключает эти элементы, когда совпадают registry, locale и порядок групп. Произвольный DOM хоста внутри корня панели не поддерживается.

Не используйте во время SSR браузерные API, такие как injectSheets(). Подключите собранный файл nabi-note/nabi.css или включите его в свой CSS bundle.