РИТ++ 2017, Frontend Сonf
Зал Дели + Калькутта, 6 июня, 18:00
Тезисы:
http://frontendconf.ru/2017/abstracts/2550.html
Краткая история редактирования текста в браузерах. Родовые проблемы WYSIWYG-редакторов. Типы и функции современных веб-редакторов.
Обработка различных способов ввода (клавиатура, голос, copy&paste, autocomplete/autocorrect, gesture input). Проблемы с использованием contenteditable и execCommand. Браузерные API: Selection, Input Method Editor, Clipboard, MutationObserver, CompositionEvents. Спецификация W3C Input Events.
...
19. Проблемы
• What You See is not What You Get
• Функций очень мало или слишком много
• Сложно «подружить» редактор с существующим дизайном сайта
• Кроссбраузерность (IE, Safari, …)
• Редакторы создаются как инструменты общего назначения
20. Проблемы
• Строгая очистка HTML-кода — или наоборот
• Проблемы с SEO
• Верстка только под десктоп
• Поддержка очень старых браузеров или только новых
• …
32. Проблемы
• Разные браузеры генерируют разный HTML
• execCommand работает не везде и не всегда (и тоже по-разному)
• Вы не контролируете, что происходит :—(
35. contenteditable + document state
• contenteditable используется только
как интерфейс для отслеживания событий
• все события перехватываются и происходит
изменение document state
• после изменения state обновляется
DOM-представление документа
• controlled input
36. document и editor state
• Контент (текст, картинки, …)
• Позиция курсора
• Выделение текста
• UI редактора
42. Хранение в виде HTML: плюсы
• Легко показать в браузере
• Легко изменять без редактора
• Скорее всего, сейчас хранится именно так
• Другой код приучен работать с HTML
43. Хранение в виде HTML: минусы
• Разные браузеры выдают разный HTML из contenteditable
• Сложнее экспортировать в другие форматы (FB IA, JSON, …)
• Контент тесно связан с оформлением (style, class, …)
46. Представления
• Plain text
• HTML
• PDF
• JSON, XML
• RSS
• Facebook Instant Articles, Google AMP, Apple News
• А также разный рендеринг сущностей в редакторе и вне его
47. Workaround
• Хранить данные в том формате, который уже есть (HTML)
• При загрузке в редактор парсить их и работать со своим
форматом
• Удобно в тех случаях, когда нужно работать в устоявшейся
экосистеме (например, CMS с плагинами)
61. Clipboard API
• События: copy, cut, paste, beforecopy, beforecut, beforepaste
• document.execCommand(‘copy’)
• Разные типы содержимого
• Что можно сделать?
• изменить содержимое буфера
• запретить вставку
• изменить алгоритм вставки
• Чего нельзя сделать?
• инициировать вставку
68. В чем проблема?
• Редактор — это компонент
• У редактора есть свои стили (UI)
• Редактор живет внутри приложения (CMS)
• У приложения есть свои стили
• Внутри редактора живет пост
• У поста тоже есть свои стили (шрифты, цвета, …)
69. При этом…
• CSS-правила живут в глобальной области видимости
• Порядок применения правил определяется специфичностью
• Помним про WYSIWYG!
76. CSS reset + БЭМ
• Раздувает размер CSS-файла
• Постоянные войны со специфичностью (своей и чужой)
• Не дает 100% гарантии (на каждый хитрый селектор…)
77. iframe
• Создает барьер между страницей и редактором (и хорошо, и
плохо)
• Не адаптируется автоматически под размеры содержимого
78. Shadow DOM + Custom Elements
<my-editor>
#shadow-root
</my-editor>
85. Public API
• Получение и изменение контента в редакторе
• Система событий
• Интеграция с внешней средой (загрузка файлов, взаимодействие
с CMS API и т.д.)
86. Система плагинов
• Плагины должны уметь влиять на state редактора
• Плагин — набор actions и reducers
• API для расширения UI редактора
• Примеры плагинов:
• Проверка орфографии
• Автотипограф
• Интеграция с Google Drive
87. О чем еще надо подумать?
• oembed и санитайзинг HTML
• Контекстное меню
• Горячие клавиши
• Режим редактирования HTML и Custom CSS
• Мета-сущности (комментарии)
• Анимации
• Оффлайн-режим
• Запуск и остановка редактора
93. Как редактировать данные?
• Используйте contenteditable для отслеживания событий
• Храните состояние редактора и контента в хранилище
• Не храните состояние в DOM
94. Как хранить данные?
• Определитесь с сущностями
• Продумайте структуру документа
• Напишите сериализацию и десериализацию
95. Как быть с CSS?
• Редактор будет жить во внешней среде, которую вы не
контролируете
• Заранее подумайте об изоляции CSS
• Кладите редактор в iframe или очищайте все, что можно