Я внедряю чат-клиент в Electron (Chrome) и React. Наш главный приоритет - скорость. Таким образом, нам следует использовать компонент виртуализированного списка (также известный как «буферизованный рендер» или «рендеринг окна»). Мы исследовали реакцию-виртуализацию, реакцию-окно и реакцию-бесконечность, среди прочих.
Одной из общих черт всех этих компонентов является то, что если поддерживаются элементы списка с переменной высотой, то высоты должны быть известны заранее. Сейчас некоторые чаты очень длинные, а другие очень короткие, поэтому это представляет для нас проблему. (Изображения и видео просты благодаря данным EXIF и ffprobe).
Итак, мы столкнулись с проблемой измерения высоты, одновременно стремясь быть чрезвычайно производительными. Один очевидный способ - поместить элементы в контейнер браузера вне области просмотра, выполнить измерения и затем отобразить список. Но это вредит нам в отношении требований к производительности. Такие программы, как реагирующая виртуализация / CellMeasurer (которая больше не поддерживается первоначальным автором) и реагирующее окно, делают нас из этого метода встроенным в библиотеку, но производительность несколько медленная и ненадежная. Аналогичная идея, которая могла бы быть более производительной, заключалась бы в использовании фонового окна Electron Browser для визуализации и измерения, но моя интуиция заключается в том, что это не будет намного быстрее.
Я утверждаю, что должны быть некоторыерешен способ заранее определить высоту строки в соответствии с переносом слов, максимальной шириной и правилами шрифта.
Моя текущая идея - использовать такую библиотеку, как string-pixel-width , чтобы вычислить высоту строк, как только мы получим текстовые данные через наш API. По сути, библиотека использует этот фрагмент кода для создания карты ширины символов [*]. Затем, как только мы узнаем ширину каждого текста, мы разделяем каждую строку, когда она максимально вычисляет максимальную ширину строки, и, наконец, выводим высоту элемента списка по количеству строк. Это потребует немного алгоритмического возмущения из-за разрывных слов, но есть библиотеки, которые помогут с этим - css-line-break кажется многообещающим.
[*] Нам пришлось бы немного его изменить, чтобы учесть все диапазоны символов Юникода, но это тривиально.
Некоторые опции, которые я еще не полностью изучил, включают в себя проект python weasyprint и проект facebook-yoga. Я открыт для ваших идей!