Immer. js рекурсивные изменения состояния - прокси прокси? - PullRequest
0 голосов
/ 10 января 2020

Мы создаем высокопроизводительное приложение, которое должно использовать неизменяемое состояние для объектов, которые меняются очень часто (тысячи раз в секунду).

Первоначально мы создавали решение на основе Proxy; Прокси будет обернуть необработанный базовый объект, и у него также будет объект с именем modified, который каждый раз, когда вызывается Прокси set, мы записываем в объект modified, а не в необработанный базовый объект.

* Затем 1007 *get сначала проверит, содержит ли modified данный ключ, и если да, то вернет его; в противном случае он возвращал значение из базового объекта.

Это работало хорошо, но было в два раза медленнее, чем прямой доступ к свойству простого старого объекта (почти точно, последовательно). Это было связано с проверкой if (modified[key] === undefined).

Я понимаю, что Immer. js использует прокси. Мой вопрос: когда вы продолжаете создавать новое состояние из предыдущего состояния с помощью Immer, это просто оборачивает предыдущий прокси новым? Что означает, что если вы сделали 1000 «мутаций» для объекта, то для вызова get потенциально может потребоваться рекурсивный вызов get, пока он не достигнет первого базового объекта?

И если это так, есть ли способ существенно "сплющить" дерево прокси (по сути, заплатить "клон"), чтобы уменьшить глубину вложенных прокси?

...