0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Неизменяемость меняется. Ладно, как минимум меняется реализация неизменяемости в React. Шутки в сторону, дальше речь идёт о серьёзных вещах.</p>
1
<p>Неизменяемость меняется. Ладно, как минимум меняется реализация неизменяемости в React. Шутки в сторону, дальше речь идёт о серьёзных вещах.</p>
2
<h2>Содержание</h2>
2
<h2>Содержание</h2>
3
<ul><li><a>История</a></li>
3
<ul><li><a>История</a></li>
4
<li><a>Люди, культура и сообщество Immer</a></li>
4
<li><a>Люди, культура и сообщество Immer</a></li>
5
<li><a>Об актуальности Immer в контексте React</a></li>
5
<li><a>Об актуальности Immer в контексте React</a></li>
6
<li><a>Выносливость</a></li>
6
<li><a>Выносливость</a></li>
7
</ul><h2>История</h2>
7
</ul><h2>История</h2>
8
<p>Необходимость в неизменяемости в JavaScript неочевидна. Классически, главным преимуществом неизменяемости считается многопоточность. Но поскольку JavaScript - однопоточный язык, этот вариант не подходит.</p>
8
<p>Необходимость в неизменяемости в JavaScript неочевидна. Классически, главным преимуществом неизменяемости считается многопоточность. Но поскольку JavaScript - однопоточный язык, этот вариант не подходит.</p>
9
<p>Историю<a>неизменяемости в React</a>можно проследить с декабря 2013 года. Тогда Дэвид Нолен<a>представил Om</a>- UI-фреймворк на ClojureScript, который работает поверх React. Oн оказался быстрее самого React.</p>
9
<p>Историю<a>неизменяемости в React</a>можно проследить с декабря 2013 года. Тогда Дэвид Нолен<a>представил Om</a>- UI-фреймворк на ClojureScript, который работает поверх React. Oн оказался быстрее самого React.</p>
10
<p>Как обёртка может быть быстрее исходной технологии? Дэвид Нолен объяснил это<a>в выступлении</a>. Краткая суть: скорость Om объясняется неизменяемостью данных. React тратит много ресурсов на<a>согласования</a>. Оказалось, что эту работу можно не выполнять, если удаётся использовать поверхностное сравнение объектов и массивов, а также<a>мемоизацию</a>. С помощью механизма согласования Fiber React активно использует мемоизацию, чтобы не выполнять действия повторно.</p>
10
<p>Как обёртка может быть быстрее исходной технологии? Дэвид Нолен объяснил это<a>в выступлении</a>. Краткая суть: скорость Om объясняется неизменяемостью данных. React тратит много ресурсов на<a>согласования</a>. Оказалось, что эту работу можно не выполнять, если удаётся использовать поверхностное сравнение объектов и массивов, а также<a>мемоизацию</a>. С помощью механизма согласования Fiber React активно использует мемоизацию, чтобы не выполнять действия повторно.</p>
11
<p>Ли Байрон (Lee Byron) сделал идею неизменяемости в React мейнстримом в 2015 году<a>с помощью Immutable.js</a>. Запись выступления есть<a>на Vimeo</a>. Immutable.js - специальная<a>библиотека для реализации неизменяемости</a>в JavaScript.</p>
11
<p>Ли Байрон (Lee Byron) сделал идею неизменяемости в React мейнстримом в 2015 году<a>с помощью Immutable.js</a>. Запись выступления есть<a>на Vimeo</a>. Immutable.js - специальная<a>библиотека для реализации неизменяемости</a>в JavaScript.</p>
12
<p>Сообщество Redux легко приняло Immutable.js, так как философия этого инструмента похожа на философию Flux. Так решилась проблема неизменяемости. Верно?</p>
12
<p>Сообщество Redux легко приняло Immutable.js, так как философия этого инструмента похожа на философию Flux. Так решилась проблема неизменяемости. Верно?</p>
13
<h2>Люди, культура и сообщество Immer</h2>
13
<h2>Люди, культура и сообщество Immer</h2>
14
<p>В начале 2018 года Майкл Вестстрейт (Michael Weststrate) запустил проект с открытым исходным кодом Immer. Перед тем, как читать дальше, рекомендуется ознакомиться<a>с сообщением о запуске Immer</a>, а также<a>с readme проекта</a>. Также полезно посмотреть выступление Вестстрейта на конференции<a>React Finland</a>(вот<a>презентация</a>).</p>
14
<p>В начале 2018 года Майкл Вестстрейт (Michael Weststrate) запустил проект с открытым исходным кодом Immer. Перед тем, как читать дальше, рекомендуется ознакомиться<a>с сообщением о запуске Immer</a>, а также<a>с readme проекта</a>. Также полезно посмотреть выступление Вестстрейта на конференции<a>React Finland</a>(вот<a>презентация</a>).</p>
15
<p>Вот несколько восторженных реакций на появление Immer. Первая от корпоративного мира, компания<a>Workday Engineering</a>:</p>
15
<p>Вот несколько восторженных реакций на появление Immer. Первая от корпоративного мира, компания<a>Workday Engineering</a>:</p>
16
<p><em>- Несмотря на недостатки, Immer - отличный инструмент. К тому же он лёгкий, простой и мощный. Разработчикам Immer нравится. Этот инструмент легко изучать, и он не требует серьезных изменений в проектах.</em></p>
16
<p><em>- Несмотря на недостатки, Immer - отличный инструмент. К тому же он лёгкий, простой и мощный. Разработчикам Immer нравится. Этот инструмент легко изучать, и он не требует серьезных изменений в проектах.</em></p>
17
<p>Вторая от<a>преподавателя Кори Хаус</a>:</p>
17
<p>Вторая от<a>преподавателя Кори Хаус</a>:</p>
18
<p><em>- Предпочитаю использовать Immer.</em></p>
18
<p><em>- Предпочитаю использовать Immer.</em></p>
19
<p>Третья от мейнтейнеров опенсорс-проектов<a>Марка Эриксона</a>:</p>
19
<p>Третья от мейнтейнеров опенсорс-проектов<a>Марка Эриксона</a>:</p>
20
<p><em>- Использую Immer.</em></p>
20
<p><em>- Использую Immer.</em></p>
21
<p>И<a>Брэндона Дейла</a>:</p>
21
<p>И<a>Брэндона Дейла</a>:</p>
22
<p><em>- В react-copy-write используется Immer. Он позволяет изменять черновик объекта, чтобы выполнять неизменяемые обновления. Поскольку здесь реализовано совместное использование, react-copy-write выполняет повторный рендеринг только когда это необходимо.</em></p>
22
<p><em>- В react-copy-write используется Immer. Он позволяет изменять черновик объекта, чтобы выполнять неизменяемые обновления. Поскольку здесь реализовано совместное использование, react-copy-write выполняет повторный рендеринг только когда это необходимо.</em></p>
23
<p>Ещё один<a>отзыв от Себастиана Маркбэйджа</a>из команды React:</p>
23
<p>Ещё один<a>отзыв от Себастиана Маркбэйджа</a>из команды React:</p>
24
<p><em>- Если вам нравится MobX, рекомендую следить за проектом Майкла Вестстрейта Immer. MobX ушёл в сторону от пути, по которому идёт React. А Immer точно следует этому пути.</em></p>
24
<p><em>- Если вам нравится MobX, рекомендую следить за проектом Майкла Вестстрейта Immer. MobX ушёл в сторону от пути, по которому идёт React. А Immer точно следует этому пути.</em></p>
25
<h2>Об актуальности Immer в контексте React</h2>
25
<h2>Об актуальности Immer в контексте React</h2>
26
<p>Вокруг Immer происходит какая-то магия, ни больше ни меньше. Поэтому стоит детально разобраться с философией Immer и попробовать понять, где она совпадает с принципами React.</p>
26
<p>Вокруг Immer происходит какая-то магия, ни больше ни меньше. Поэтому стоит детально разобраться с философией Immer и попробовать понять, где она совпадает с принципами React.</p>
27
<p>Когда разговор идёт о понимании философии React, которая в той или иной степени отличается от актуального состояния библиотеки React, автор оригинальной публикации рекомендует ознакомиться с двумя документами. Это раздел<a>"Принципы проектирования React"</a>в официальной документации, а также<a>react-basics</a>- формальное объяснение ментальной модели React. В этих документах есть три концепции, релевантные Immer.</p>
27
<p>Когда разговор идёт о понимании философии React, которая в той или иной степени отличается от актуального состояния библиотеки React, автор оригинальной публикации рекомендует ознакомиться с двумя документами. Это раздел<a>"Принципы проектирования React"</a>в официальной документации, а также<a>react-basics</a>- формальное объяснение ментальной модели React. В этих документах есть три концепции, релевантные Immer.</p>
28
<h3>Временная изменяемость</h3>
28
<h3>Временная изменяемость</h3>
29
<p>Модель данных React неизменяемая благодаря<a>функциям, обновляющим состояние</a>. Если необходимо простое приложение для подсчёта кликов по элементу, мы специально не пишем такой код в React:</p>
29
<p>Модель данных React неизменяемая благодаря<a>функциям, обновляющим состояние</a>. Если необходимо простое приложение для подсчёта кликов по элементу, мы специально не пишем такой код в React:</p>
30
<p>Хотя мы можем изменить React, чтобы он поддерживал такой код. Но вместо этого мы пишем так:</p>
30
<p>Хотя мы можем изменить React, чтобы он поддерживал такой код. Но вместо этого мы пишем так:</p>
31
<p>Это очень похоже на Producers в Immer:</p>
31
<p>Это очень похоже на Producers в Immer:</p>
32
<h3>Совместимость</h3>
32
<h3>Совместимость</h3>
33
<p><a>Одна из самых больших проблем Immutable.js</a>- сложность реализации совместимости. Мы используем Immutable.js в Netlify более двух лет. И мы постоянно вспоминаем, что используем "не просто JavaScript", когда пытаемся, например, деструктурировать Map’ы Immutable.js:</p>
33
<p><a>Одна из самых больших проблем Immutable.js</a>- сложность реализации совместимости. Мы используем Immutable.js в Netlify более двух лет. И мы постоянно вспоминаем, что используем "не просто JavaScript", когда пытаемся, например, деструктурировать Map’ы Immutable.js:</p>
34
<p>Это приводит к утечке абстракции, так как приходится всё время думать, обёрнуты ли переменные, с которыми мы работаем, с помощью Immutable.js.</p>
34
<p>Это приводит к утечке абстракции, так как приходится всё время думать, обёрнуты ли переменные, с которыми мы работаем, с помощью Immutable.js.</p>
35
<p>В Immer все объекты и массивы - это обычные объекты и массивы JavaScript, поэтому с ними можно работать так, как вы привыкли делать это в JavaScript.</p>
35
<p>В Immer все объекты и массивы - это обычные объекты и массивы JavaScript, поэтому с ними можно работать так, как вы привыкли делать это в JavaScript.</p>
36
<p>Это та же философия, которая привела к успеху React. Благодаря<a>фокусировке на совместимости</a>возможно частичное внедрение вместо необходимости преобразовывать всё и сразу. Также совместимость позволяет использовать React с другими библиотеками в экосистеме JavaScript, которые ожидают, что приходящие к ним данные - это чистый JavaScript. Такую же цель преследовал Брендан Айх, когда<a>предложил прокси в 2010 году</a>. Immer - отличный инструмент расширения языка, для использования которого не надо ничего ломать и даже резко менять.</p>
36
<p>Это та же философия, которая привела к успеху React. Благодаря<a>фокусировке на совместимости</a>возможно частичное внедрение вместо необходимости преобразовывать всё и сразу. Также совместимость позволяет использовать React с другими библиотеками в экосистеме JavaScript, которые ожидают, что приходящие к ним данные - это чистый JavaScript. Такую же цель преследовал Брендан Айх, когда<a>предложил прокси в 2010 году</a>. Immer - отличный инструмент расширения языка, для использования которого не надо ничего ломать и даже резко менять.</p>
37
<h3>Отладка</h3>
37
<h3>Отладка</h3>
38
<p>Для отладки и трассировки в Immer применяются<a>Patches</a>. Потенциально на основе Patches можно даже создать инструменты разработчика.</p>
38
<p>Для отладки и трассировки в Immer применяются<a>Patches</a>. Потенциально на основе Patches можно даже создать инструменты разработчика.</p>
39
<p>Это похоже на то, как реализована<a>отладка в React</a>. Она включает отслеживание ошибочных обновлений UI. Также в React реализованы инструменты разработчика (ReactDevTools).</p>
39
<p>Это похоже на то, как реализована<a>отладка в React</a>. Она включает отслеживание ошибочных обновлений UI. Также в React реализованы инструменты разработчика (ReactDevTools).</p>
40
<p>В Patches также есть возможность использовать<a>undo/redo Redux</a>. В источнике по ссылке смотрите примеры кода.</p>
40
<p>В Patches также есть возможность использовать<a>undo/redo Redux</a>. В источнике по ссылке смотрите примеры кода.</p>
41
<h2>Выносливость</h2>
41
<h2>Выносливость</h2>
42
<p>В экосистеме JavaScript используется термин churn или отток. Этим термином обозначают долю фреймворков и библиотек, которые были созданы, раскручены и затем заброшены создателями и сообществом. Способность определить "выносливые" инструменты, то есть инструменты, которые долго будут востребованными - залог стабильного роста и развития.</p>
42
<p>В экосистеме JavaScript используется термин churn или отток. Этим термином обозначают долю фреймворков и библиотек, которые были созданы, раскручены и затем заброшены создателями и сообществом. Способность определить "выносливые" инструменты, то есть инструменты, которые долго будут востребованными - залог стабильного роста и развития.</p>
43
<p>CEO Netlify Маттиас Биилман (Mathias Biilmann)<a>рассказал о практиках</a>, которые помогают определять "выносливые" инструменты:</p>
43
<p>CEO Netlify Маттиас Биилман (Mathias Biilmann)<a>рассказал о практиках</a>, которые помогают определять "выносливые" инструменты:</p>
44
<ul><li>изучайте историю;</li>
44
<ul><li>изучайте историю;</li>
45
<li>люди, сообщество и культура играют важную роль;</li>
45
<li>люди, сообщество и культура играют важную роль;</li>
46
<li>всегда задавайте вопрос "зачем".</li>
46
<li>всегда задавайте вопрос "зачем".</li>
47
</ul><p>Автор оригинальной публикации старался провести читателя через эту ментальную модель с помощью статьи. Это хороший способ оценки технологий. Он помогает понять, почему одни опенсорсные проекты становятся более востребованными сообществом, чем другие.</p>
47
</ul><p>Автор оригинальной публикации старался провести читателя через эту ментальную модель с помощью статьи. Это хороший способ оценки технологий. Он помогает понять, почему одни опенсорсные проекты становятся более востребованными сообществом, чем другие.</p>
48
<p>Стремительный взлёт Immer примечателен. Причиной этого успеха стало изучение исторического опыта, а также популярность в сообществе React. Последнее было бы невозможным без совпадения фундаментальной философии React с философией Immer.</p>
48
<p>Стремительный взлёт Immer примечателен. Причиной этого успеха стало изучение исторического опыта, а также популярность в сообществе React. Последнее было бы невозможным без совпадения фундаментальной философии React с философией Immer.</p>
49
<p>Дэн Абрамов (Dan Abramov) отметил, что развитие технологии проходит через определённые циклы, и что люди меняют парадигмы:</p>
49
<p>Дэн Абрамов (Dan Abramov) отметил, что развитие технологии проходит через определённые циклы, и что люди меняют парадигмы:</p>
50
<p><em>- Рецепт успеха: возьмите что-то, что легко отлаживать, и сделайте так, чтобы работа с этим инструментом не раздражала. Спасибо Майклу Вестстрейту за Immer.</em></p>
50
<p><em>- Рецепт успеха: возьмите что-то, что легко отлаживать, и сделайте так, чтобы работа с этим инструментом не раздражала. Спасибо Майклу Вестстрейту за Immer.</em></p>
51
<p>Это важный инсайт - успех Immer стал возможен, так как сообщество React уже оценило преимущества неизменяемости. Immer фокусируется на тех же преимуществах, что и React, при этом он улучшает API теми же способами, которые сделали успешным React.</p>
51
<p>Это важный инсайт - успех Immer стал возможен, так как сообщество React уже оценило преимущества неизменяемости. Immer фокусируется на тех же преимуществах, что и React, при этом он улучшает API теми же способами, которые сделали успешным React.</p>
52
<p>Лучший способ начать работать с Immer - использовать редьюсеры<a>Redux</a>или шаблоны<a>React setState</a>. Затем обращайте внимание на другие библиотеки на базе Immer, например,<a>Redux Starter Kit</a>, а также не связанные с Redux инструменты управления состоянием, например,<a>react-copy-write</a>,<a>immer-wieder</a>,<a>bey</a>.</p>
52
<p>Лучший способ начать работать с Immer - использовать редьюсеры<a>Redux</a>или шаблоны<a>React setState</a>. Затем обращайте внимание на другие библиотеки на базе Immer, например,<a>Redux Starter Kit</a>, а также не связанные с Redux инструменты управления состоянием, например,<a>react-copy-write</a>,<a>immer-wieder</a>,<a>bey</a>.</p>
53
<p>Адаптированный перевод статьи<a>The Rise of Immer in React</a>by Swyx. Мнение администрации "Хекслета" может не совпадать с мнением автора оригинальной публикации.</p>
53
<p>Адаптированный перевод статьи<a>The Rise of Immer in React</a>by Swyx. Мнение администрации "Хекслета" может не совпадать с мнением автора оригинальной публикации.</p>