Автор оригинала: FreeCodeCamp Community Member.
Sindre Osen Aarsaeter
Выходя за пределы виртуального дома и государственного управления
Виртуальный дом был фантастическим инновациям. Он привел к гораздо более продуктивному способу написания веб-приложений, позволяя нам написать наши взгляды в декларативной манере.
Эта большая выгода имеет мало, чтобы сделать с производительностью первоначального визуализации. Вместо этого процесс обновления DOM для отражения изменений в вашем штате стал намного быстрее.
Этот процесс привлечения дома в синхронизации с государством часто называют Дом примирение Отказ
Если у нас был бесконечно быстрый примирение, мы могли бы значительно упростить наши приложения по Оказание всего на каждом кадре Отказ Государственный слой никогда не понадобится узнавать о взглядах вообще – гораздо меньше отправляет события и отслеживать, какие взгляды необходимо реагировать, когда определенные части состояния изменяются. Вид всегда будет синхронизирован с данными, независимо от того, что вы бросили на него.
К сожалению, виртуальные домовые реализации являются не бесконечно быстро. Они на самом деле, удивительно медленно. К счастью, многие подскочили на Bandwag на немнозримость ™ Bandwag, в этом случае виртуальный дом спасибо вам! Другие обертывают все состояние в наблюдаемых (например, MOBX) и отслеживать, какой взгляд зависит от того, в каком состоянии. Это позволяет смириться только только части вашего мнения, но поставляется с собственным набором недостатков.
Самая большая проблема заключается в том, что мы склонны решать, как управлять состоянием приложения на основе нашего просмотра уровня. Что если бы мы могли получить Лучше Производительность в мире, где слой данных и уровень просмотра на самом деле не знают или заботятся друг о друге?
Встретить мемузионный дом
Imba Является ли язык программирования для Интернета. Он включает в себя интерактивную платформу ScreenCasting scrimba.com из которых я ведущий разработчик. Imba был рожден, чтобы снова заработать разработку веб-приложений. Он имеет чистый и читаемый синтаксис, вдохновленный Ruby. Он компилируется для читаемого и исполняющего JavaScript и работает внутри существующей экосистемы.
Помимо чистого и читаемого синтаксиса, самое большое преимущество IMBA заключается в том, что он действительно относится к элементам DOM в качестве первоклассных граждан, на гораздо более глубоком уровне, чем JSX. Это позволяет вам написать представления, но это …| не использует виртуальный дом. Вместо этого IMBA компилирует вид на Memoied Dom, который оказывается порядок быстрее Отказ
Как это работает
Общая идея состоит в том, что мы создаем легкие обертки вокруг элементов DOM, а также компилируйте декларативные взгляды на цепочки.
tag AppView
def render
"Welcome"
0.5)> "Roulette" Выше представление IMBA выше будет примерно компилировать в следующем JavaScript:
class AppView extends Imba.Tag {
render() {
var $ = this.$; // inline cache for tag
return this.setChildren($.$ = $.$ || [
Imba.tag('h1',$).flag('title').setText("Welcome"),
Imba.tag('p',$).flag('desc').setText("Roulette")
]).synced(
$[1].flagIf('red',Math.random() > 0.5)
);
}
}Это Очень Простой пример, чтобы проиллюстрировать основную концепцию. Во время компиляции мы разделяем создание и обновления в отдельные ветви. Первый раз рендер вызывается для . Хоть и гораздо более сложный, та же концепция используется для условных, петель, и все остальное внутри деревьев тегов. Если вы заинтересованы в том, как это действительно работает, я рекомендую читать Это вступление Отказ Большинство ориентировчиков тестируют такие вещи, как «Вставка/случайно/удалить 1000 строк». Это дает мало признаков реальной эффективности. Когда есть сотни изменений, большая часть разницы съедает фактическими мутациями DOM, перекраски и т. Д. Это не измеряет наиболее важной метрики. Если вы действительно хотите проверить производительность примирения DOM, вам нужно посмотреть, как быстро реализация приносит DOM в синхронизации с состоянием, Особенно Когда нет/без изменений Отказ Таким образом, захватить реалистичный вид на производительность примирения, мы могли бы изменить небольшую часть состояния приложения в каждой итерации, а затем измерить время, которое требуется, чтобы принудительно принести просмотр в синхронизации с этим измененным состоянием. Вид не должен слушать любую часть государства, и государство не должно быть никому уведомить, что изменилось ли он. Этот тест Шаги через детерминированную последовательность государственных изменений, делать не более Одно изменение на итерацию Отказ Мы измерим время, необходимое для согласования Вся приложение View после: Запуск теста на IMAC (4 ГГц I7) дает следующие результаты: Это кажется возмутительным правильно? Конечно, это не может быть правильным. Все реализации, вероятно, могут быть оптимизированы больше. Я очень рад принять pull-запросы на Github Отказ Быть ясным, у меня огромное уважение к тому, что реагировал, и я действительно люблю Vue. Имба взяла много вдохновения от этого. Я подозреваю, что должно быть возможно для компиляции Vue шаблонов, используя аналогичный подход, и полюбил бы кого-то, чтобы дать ему идти! Давайте проверим производительность RAW Reconciler, когда даже нет никаких изменений. Это удаляет время, потраченное на фактические мутации DOM из уравнения, и дает нам хорошую картину о том, сколько работы происходит во время примирения. Профиль CPU Charted из Chrome дает визуальную индикацию того, насколько меньше работает с метеологическими методом DOM. Это цитата от кого-то, кто прочитал ранний черновик этой статьи, и я хотел бы решить его голову. Разница производительности не ограничивается простым тестом, совсем наоборот. Imba был использован в производстве в течение нескольких лет на scrimba.com С Но это все еще не для слабого сердца. Для большинства разработчиков массовые экосистемы для Vue и реагирования будут жесткими (и, вероятно, неразумными) оставить позади. Документация IMBA Все еще оставляет многое желать, но мы улучшаем это каждый день. Я уверен, что вы слышали, что реагирование достаточно быстро. Но достаточно быстро для чего? Это не имеет значения, если реагировать на 15% быстрее, но с порядком улучшения величины мы можем начать исследовать более простые способы создания приложений. Это не о воспринимается Скорость, но о том, что она позволяет вам сделать. На scrimba.com Мы не беспокойтесь о том, чтобы сохранить вид синхронизации с состоянием. Мы не беспокойтесь о отслеживании, когда состояние изменилось. Наши модели данных не наблюдаются. Мы просто оказываемся. В любое время. И это освобождает.F o ты Ориентир
Полученные результаты
Safari 11.
Chrome 65.
Firefox 58.
Профилирование
IMBA 1.3
Реагировать 16.2
Vue 2.5.
Это масштабируется?
Это имеет значение?
Оригинал: “https://www.freecodecamp.org/news/the-virtual-dom-is-slow-meet-the-memoized-dom-bb19f546cc52/”