В этой статье есть несколько проблем. Помогите улучшить ее или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти сообщения )
|
Оригинальный автор(ы) | Джордан Уолк |
---|---|
Разработчик(и) | Мета и сообщество |
Первоначальный выпуск | 29 мая 2013 г. ( 2013-05-29 ) | [1] [2]
Стабильный релиз(ы) | |
19.0.0 [3] / 5 декабря 2024 г. ( 5 декабря 2024 г. ) | |
Предварительный просмотр релиза(ов) | |
19.0.0-rc.1 / 14 ноября 2024 г. ( 2024-11-14 ) [4] | |
Репозиторий |
|
Написано в | JavaScript |
Платформа | Веб-платформа |
Тип | Библиотека JavaScript |
Лицензия | Лицензия Массачусетского технологического института |
Веб-сайт | реагировать.dev |
React (также известный как React.js или ReactJS ) — это бесплатная и открытая библиотека JavaScript для фронтенда [5] [6] , которая направлена на то, чтобы сделать создание пользовательских интерфейсов на основе компонентов более «бесшовным». [5] Она поддерживается Meta (ранее Facebook) и сообществом отдельных разработчиков и компаний. [7] [8] [9]
React можно использовать для разработки одностраничных , мобильных или серверных приложений с использованием таких фреймворков, как Next.js и Remix [a] . Поскольку React занимается только пользовательским интерфейсом и отображением компонентов в DOM , приложения React часто полагаются на библиотеки для маршрутизации и других клиентских функций. [11] [12] Ключевым преимуществом React является то, что он повторно отображает только те части страницы, которые были изменены, избегая ненужной повторной визуализации неизмененных элементов DOM.
[13] React придерживается парадигмы декларативного программирования . [14] : 76 разработчиков проектируют представления для каждого состояния приложения, а React обновляет и отображает компоненты при изменении данных. Это контрастирует с императивным программированием . [15]
Код React состоит из сущностей, называемых компонентами . [14] : 10–12 Эти компоненты являются модульными и могут использоваться повторно. [14] : 70 Приложения React обычно состоят из многих слоев компонентов. Компоненты визуализируются в корневом элементе DOM с помощью библиотеки React DOM. При визуализации компонента значения передаются между компонентами через props (сокращение от «properties») . Значения, внутренние для компонента, называются его состоянием. [16]
Два основных способа объявления компонентов в React — это компоненты-функции и компоненты-классы. [14] : 118 [17] : 10
Компоненты функций объявляются с помощью функции (используя синтаксис функций JavaScript или выражение стрелочной функции ), которая принимает один аргумент "props" и возвращает JSX. Начиная с React v16.8, компоненты функций могут использовать состояние с useState
хуком.
16 февраля 2019 года React 16.8 был выпущен для широкой публики, представив React Hooks. [18] Хуки — это функции, которые позволяют разработчикам «подключаться» к состоянию React и функциям жизненного цикла из компонентов функций. [19] Примечательно, что хуки не работают внутри классов — они позволяют разработчикам использовать больше функций React без классов. [20]
React предоставляет несколько встроенных хуков, таких как useState
, [21] [17] : 37 useContext
, [14] : 11 [22] [17] : 12 useReducer
, [14] : 92 [22] [17] : 65–66 useMemo
[14] : 154 [22] [17] : 162 и useEffect
. [23] [17] : 93–95 Другие описаны в Справочнике API хуков. [24] [14] : 62 useState
и useEffect
, которые используются чаще всего, предназначены для управления состоянием [14] : 37 и побочными эффектами [14] : 61 соответственно.
Существует два правила хуков [25] , которые описывают характерные шаблоны кода, на которые опираются хуки:
Хотя эти правила не могут быть реализованы во время выполнения, инструменты анализа кода, такие как линтеры, могут быть настроены для обнаружения множества ошибок во время разработки. Правила применяются как к использованию хуков, так и к реализации пользовательских хуков, [26] которые могут вызывать другие хуки.
Компоненты сервера React (RSC) [27] — это функциональные компоненты, которые работают исключительно на сервере. Эта концепция была впервые представлена в докладе «Извлечение данных с помощью серверных компонентов». [28] Хотя концепция похожа на рендеринг на стороне сервера, RSC не отправляют соответствующий JavaScript клиенту, поскольку гидратации не происходит. В результате у них нет доступа к хукам. Однако они могут быть асинхронными функциями , что позволяет им напрямую выполнять асинхронные операции:
асинхронная функция MyComponent () { const message = await fetchMessageFromDb (); возвращаться ( < div > Сообщение : { message }</ div > );}
В настоящее время серверные компоненты наиболее удобны для использования с Next.js.
Компоненты класса объявляются с использованием классов ES6 . Они ведут себя так же, как компоненты-функции, но вместо использования хуков для управления состоянием и событиями жизненного цикла они используют методы жизненного цикла базового React.Component
класса .
класс ParentComponent расширяет React.Component { состояние = { цвет : 'зеленый' }; оказывать () { возвращаться ( < ChildComponent color = { this.state.color } / > ); }}
Появление React Hooks в React 16.8 в феврале 2019 года позволило разработчикам управлять состоянием и поведением жизненного цикла в функциональных компонентах, снижая зависимость от компонентов класса.
Эта тенденция соответствует более широкому движению отрасли к функциональному программированию и модульному дизайну. Поскольку React продолжает развиваться, разработчикам важно учитывать преимущества функциональных компонентов и React Hooks при создании новых приложений или рефакторинге существующих. [29]
Сам React не имеет встроенной поддержки маршрутизации . React — это в первую очередь библиотека для создания пользовательских интерфейсов, и она не включает в себя полноценное решение маршрутизации из коробки. Для обработки маршрутизации в приложениях React можно использовать сторонние библиотеки. [30] Это позволяет разработчику определять маршруты, управлять навигацией и обрабатывать изменения URL-адресов в дружественном к React способе.
Еще одной примечательной особенностью является использование виртуальной модели объекта документа , или Virtual DOM . React создает кэш структуры данных в памяти , вычисляет полученные различия, а затем эффективно обновляет отображаемый DOM браузера. [31] Этот процесс называется согласованием . Это позволяет программисту писать код так, как будто вся страница отображается при каждом изменении, в то время как React отображает только те компоненты, которые действительно изменяются. Этот выборочный рендеринг обеспечивает значительный прирост производительности. [32] [33]
Когда ReactDOM.render
[34] вызывается снова для того же компонента и цели, React представляет новое состояние пользовательского интерфейса в Virtual DOM и определяет, какие части (если таковые имеются) активного DOM необходимо изменить. [35]
Методы жизненного цикла для компонентов на основе классов используют форму подключения , которая позволяет выполнять код в заданных точках в течение жизненного цикла компонента.
ShouldComponentUpdate
позволяет разработчику предотвратить ненужную повторную отрисовку компонента, возвращая false, если отрисовка не требуется.componentDidMount
вызывается после того, как компонент «смонтирован» (компонент создан в пользовательском интерфейсе, часто путем связывания его с узлом DOM ). Обычно это используется для запуска загрузки данных из удаленного источника через API .componentDidUpdate
вызывается сразу после обновления. [36]componentWillUnmount
вызывается непосредственно перед тем, как компонент будет снесен или "размонтирован". Обычно это используется для очистки ресурсоемких зависимостей компонента, которые не будут просто удалены при размонтировании компонента (например, удаление любых setInterval()
экземпляров, связанных с компонентом, или " eventListener ", установленного на "документе" из-за наличия компонента)render
является наиболее важным методом жизненного цикла и единственным обязательным в любом компоненте. Обычно он вызывается каждый раз, когда обновляется состояние компонента, что должно отражаться в пользовательском интерфейсе.JSX , или JavaScript XML, является расширением синтаксиса языка JavaScript. [37] Похожий по внешнему виду на HTML, [14] : 11 JSX предоставляет способ структурирования рендеринга компонентов с использованием синтаксиса, знакомого [14] : 15 многим разработчикам. Компоненты React обычно пишутся с использованием JSX, хотя это не обязательно (компоненты также могут быть написаны на чистом JavaScript). JSX похож на другой синтаксис расширения, созданный Facebook для PHP, который называется XHP .
Пример кода JSX:
class App extends React.Component { render ( ) { return ( <div> <p> Заголовок </p> <p> Содержимое </p> <p> Нижний колонтитул </p> </div> ) ; } }
Базовая архитектура React применяется не только для рендеринга HTML в браузере. Например, Facebook имеет динамические диаграммы, которые рендерятся по <canvas>
тегам, [38] а Netflix и PayPal используют универсальную загрузку для рендеринга идентичного HTML как на сервере, так и на клиенте. [39] [40]
Рендеринг на стороне сервера (SSR) относится к процессу рендеринга клиентского приложения JavaScript на сервере, а не в браузере. Это может улучшить производительность приложения, особенно для пользователей с более медленными соединениями или устройствами.
С SSR исходный HTML, отправляемый клиенту, включает полностью отрисованный UI приложения. Это позволяет браузеру клиента отображать UI немедленно, а не ждать загрузки и выполнения JavaScript перед отрисовкой UI.
React поддерживает SSR, что позволяет разработчикам отображать компоненты React на сервере и отправлять полученный HTML клиенту. Это может быть полезно для повышения производительности приложения, а также для целей поисковой оптимизации .
React не пытается предоставить полную библиотеку приложений. Он разработан специально для создания пользовательских интерфейсов [5] и поэтому не включает в себя многие инструменты, которые некоторые разработчики могут посчитать необходимыми для создания приложения. Это позволяет разработчику выбирать библиотеки, которые он предпочитает для выполнения таких задач, как сетевой доступ или локальное хранение данных. По мере развития библиотеки появились общие шаблоны использования.
Для поддержки концепции однонаправленного потока данных React (которую можно противопоставить двунаправленному потоку AngularJS ), архитектура Flux была разработана как альтернатива популярной архитектуре модель–представление–контроллер . Flux представляет действия , которые отправляются через центральный диспетчер в хранилище , а изменения в хранилище распространяются обратно в представление. [41] При использовании с React это распространение осуществляется через свойства компонентов. С момента своего замысла Flux был заменен такими библиотеками, как Redux и MobX. [42]
Поток можно считать вариантом модели наблюдателя . [43]
Компонент React в архитектуре Flux не должен напрямую изменять какие-либо переданные ему свойства, но должен передавать функции обратного вызова , которые создают действия , отправляемые диспетчером для изменения хранилища. Действие — это объект, обязанность которого — описывать то, что произошло: например, действие, описывающее одного пользователя, «следующего» за другим, может содержать идентификатор пользователя, идентификатор целевого пользователя и тип USER_FOLLOWED_ANOTHER_USER
. [44] Хранилища, которые можно рассматривать как модели, могут изменять себя в ответ на действия, полученные от диспетчера.
Этот шаблон иногда выражается как «свойства текут вниз, действия текут вверх». С момента его создания было создано множество реализаций Flux, возможно, наиболее известной из которых является Redux , в котором есть единое хранилище, часто называемое единым источником истины . [45]
В феврале 2019 года useReducer
был представлен как React hook в выпуске 16.8. Он предоставляет API, который согласуется с Redux, позволяя разработчикам создавать хранилища, подобные Redux, которые являются локальными для состояний компонентов. [46]
Статус проекта можно отслеживать на форуме обсуждения основной команды. [47] Однако основные изменения в React проходят через репозиторий Future of React и запросы на извлечение . [48] [49] Это позволяет сообществу React предоставлять отзывы о новых потенциальных функциях, экспериментальных API и улучшениях синтаксиса JavaScript.
React был создан Джорданом Уолком, инженером-программистом из Meta , который изначально разработал прототип под названием «F-Bolt» [50], а затем переименовал его в «FaxJS». Эта ранняя версия задокументирована в репозитории GitHub Джордана Уолка. [1] На проект оказали влияние XHP , библиотека HTML- компонентов для PHP .
React был впервые развернут в ленте новостей Facebook в 2011 году, а затем интегрирован в Instagram в 2012 году . [51] В мае 2013 года на JSConf US проект был официально открыт с открытым исходным кодом, что стало важным поворотным моментом в его принятии и росте. [2]
React Native , который позволяет разрабатывать собственные приложения для Android , iOS и UWP с помощью React, был анонсирован на конференции React Conf в Facebook в феврале 2015 года и открыт для доступа в марте 2015 года.
18 апреля 2017 года Facebook анонсировала React Fiber, новый набор внутренних алгоритмов для рендеринга, в отличие от старого алгоритма рендеринга React, Stack. [52] React Fiber должен был стать основой для любых будущих улучшений и разработки функций библиотеки React. [53] [ требуется обновление ] Фактический синтаксис для программирования с React не меняется; изменился только способ выполнения синтаксиса. [54] Старая система рендеринга React, Stack, была разработана в то время, когда не было понимания фокуса системы на динамических изменениях. Stack медленно отрисовывал сложную анимацию, например, пытаясь выполнить все это за один отрезок. Fiber разбивает анимацию на сегменты, которые можно распределить по нескольким кадрам. Аналогично, структуру страницы можно разбить на сегменты, которые можно поддерживать и обновлять отдельно. Функции JavaScript и виртуальные объекты DOM называются «волокнами», и каждое из них можно использовать и обновлять отдельно, что обеспечивает более плавный рендеринг на экране. [55]
26 сентября 2017 года React 16.0 был выпущен для публики. [56]
20 октября 2020 года команда React выпустила React v17.0, примечательную как первый крупный релиз без существенных изменений в API React, ориентированном на разработчиков. [57]
29 марта 2022 года был выпущен React 18, в котором был представлен новый параллельный рендерер, автоматическое пакетирование и поддержка рендеринга на стороне сервера с помощью Suspense. [58]
5 декабря 2024 года был выпущен React 19. В этом выпуске были представлены действия, которые упрощают процесс обновления состояния с помощью асинхронных функций, а не необходимость вручную обрабатывать ожидающие состояния, ошибки и оптимистичные обновления. React 19 также включал поддержку серверных компонентов и улучшенную генерацию статического сайта. [59]
Версия | Дата выпуска | Изменения |
---|---|---|
0.3.0 | 29 мая 2013 г. | Первоначальный публичный релиз |
0.4.0 | 20 июля 2013 г. | Поддержка узлов комментариев <div>{/* */}</div> , улучшенные API рендеринга на стороне сервера, удален React.autoBind, поддержка свойства key, улучшения форм, исправленные ошибки. |
0.5.0 | 20 октября 2013 г. | Улучшено использование памяти, поддержка событий выбора и композиции, поддержка getInitialState и getDefaultProps в миксинах, добавлены React.version и React.isValidClass, улучшена совместимость с Windows. |
0.8.0 | 20 декабря 2013 г. | Добавлена поддержка строк и столбцов, defer и async, цикла для <audio> & <video> , атрибутов autoCorrect. Добавлены события onContextMenu, обновлены инструменты jstransform и esprima-fb, обновлен браузерify. |
0.9.0 | 20 февраля 2014 г. | Добавлена поддержка crossOrigin, download и hrefLang, mediaGroup и muted, sandbox, Seamless и srcDoc, атрибутов scope. Добавлены any, arrayOf, component, oneOfType, renderable, shape в React.PropTypes. Добавлена поддержка событий onMouseOver и onMouseOut. Добавлена поддержка onLoad и onError для <img> элементов. |
0.10.0 | 21 марта 2014 г. | Добавлена поддержка атрибутов srcSet и textAnchor, добавлена функция обновления для неизменяемых данных, гарантируется, что все элементы void не вставляют закрывающий тег. |
0.11.0 | 17 июля 2014 г. | Улучшенная поддержка SVG, нормализованное событие e.view, обновленная команда $apply, добавлена поддержка пространств имен, добавлен новый API transformWithDetails, включает предварительно созданные пакеты в dist/, MyComponent() теперь возвращает дескриптор, а не экземпляр. |
0.12.0 | 21 ноября 2014 г. | Добавлены новые функции. Введен оператор распространения ({...}) для отмены this.transferPropsTo. Добавлена поддержка acceptCharset, classID, атрибутов HTML manifest. В API добавлен React.addons.batchedUpdates. @jsx React.DOM больше не требуется. Исправлены проблемы с CSS-переходами. |
0.13.0 | 10 марта 2015 г. | Устаревшие шаблоны, выдававшие предупреждение в версии 0.12, больше не работают, порядок разрешения ссылок изменился, удалены свойства this._pendingState и this._rootNodeID, поддерживается классы ES6, добавлен API React.findDOMNode(component), поддерживается итераторы и последовательности immutable-js, добавлены новые функции React.addons.createFragment, устаревший React.addons.classSet. |
15.0.0 | 7 апреля 2016 г. | Первоначальный рендеринг теперь использует document.createElement вместо генерации HTML, больше никаких дополнительных <span> s, улучшенная поддержка SVG, ReactPerf.getLastMeasurements() непрозрачность, введены новые устаревшие элементы с предупреждением, исправлено несколько небольших утечек памяти, React DOM теперь поддерживает HTML-атрибуты cite и profile, а также свойства CSS cssFloat, gridRow и gridColumn. |
15.1.0 | 20 мая 2016 г. | Исправлена ошибка пакетной обработки, обеспечено использование последней версии назначения объектов, исправлена регрессия, удалено использование утилиты слияния, переименованы некоторые модули. |
15.2.0 | 1 июля 2016 г. | Включить информацию о стеке компонентов, остановить проверку свойств во время монтирования, добавить React.PropTypes.symbol, добавить обработку onLoad <link> и обработку onError к <source> элементу, добавить isRunning() API, исправить снижение производительности. |
15.3.0 | 30 июля 2016 г. | Добавлен React.PureComponent, исправлена проблема с вложенным серверным рендерингом, добавлены xmlns, xmlnsXlink для поддержки атрибутов SVG и referrerPolicy к атрибутам HTML, обновлено дополнение React Perf, исправлена проблема с ref. |
15.4.0 | 16 ноября 2016 г. | Пакет React и сборка браузера больше не включают React DOM, улучшена производительность разработки, исправлены случайные сбои тестирования, обновлен API batchedUpdates, React Perf и ReactTestRenderer.create() . |
15.5.0 | 7 апреля 2017 г. | Добавлен react-dom/test-utils, удалены peerDependencies, исправлена проблема с Closure Compiler, добавлено предупреждение об устаревании React.createClass и React.PropTypes, исправлена ошибка Chrome. |
15.6.0 | 13 июня 2017 г. | Добавить поддержку переменных CSS в атрибуте стиля и свойствах стиля сетки, исправить поддержку AMD для дополнений, зависящих от React, удалить ненужные зависимости, добавить предупреждение об устаревании для вспомогательных функций фабрики React.createClass и React.DOM. |
16.0.0 | 26 сентября 2017 г. | Улучшена обработка ошибок с введением «границ ошибок», React DOM позволяет передавать нестандартные атрибуты, Незначительные изменения в поведении setState, удалена сборка react-with-addons.js, Добавлен React.createClass как create-react-class, React.PropTypes как prop-types, React.DOM как react-dom-factories, изменения в поведении методов планирования и жизненного цикла. |
16.1.0 | 9 ноября 2017 г. | Прекращение поддержки релизов Bower, исправление случайной дополнительной глобальной переменной в сборках UMD, исправление срабатывания onMouseEnter и onMouseLeave, исправление заполнителя <textarea>, удаление неиспользуемого кода, добавление отсутствующей зависимости package.json, добавление поддержки React DevTools. |
16.3.0 | 29 марта 2018 г. | Добавить новый официально поддерживаемый контекстный API, Добавить новый пакет Предотвратить бесконечный цикл при попытке отрисовки порталов с помощью SSR, Исправлена проблема с this.state, Исправлена проблема IE/Edge. |
16.4.0 | 24 мая 2018 г. | Добавить поддержку спецификации Pointer Events, Добавить возможность указывать propTypes, Исправлен контекст чтения, Исправлена поддержка getDerivedStateFromProps() , Исправлен сбой testInstance.parent, Добавить компонент React.unstable_Profiler для измерения производительности, Изменены имена внутренних событий. |
16.5.0 | 5 сентября 2018 г. | Добавить поддержку React DevTools Profiler, изящно обрабатывать ошибки в более пограничных случаях, добавить react-dom/profiling, добавить событие onAuxClick для браузеров, добавить поля movementX и movementY к событиям мыши, добавить поля tangentialPressure и twist к событию указателя. |
16.6.0 | 23 октября 2018 г. | Добавить поддержку contextType, Поддержать уровни приоритета, продолжения и обернутые обратные вызовы, Улучшить механизм отката, Исправлено серое наложение в iOS Safari, Добавить React.lazy() компоненты для разделения кода. |
16.7.0 | 20 декабря 2018 г. | Исправление производительности React.lazy для лениво загружаемых компонентов, очистка полей при размонтировании для предотвращения утечек памяти, исправление ошибки с SSR, устранение снижения производительности. |
16.8.0 | 6 февраля 2019 г. | Добавить хуки, добавить ReactTestRenderer.act() и ReactTestUtils.act() для пакетных обновлений, поддержать синхронные thenables, передаваемые в React.lazy(), улучшить API ленивой инициализации useReducer Hook. |
16.9.0 | 9 августа 2019 г. | Добавить API React.Profiler для программного сбора показателей производительности. Удалить stable_ConcurrentMode в пользу stable_createRoot |
16.10.0 | 27 сентября 2019 г. | Исправлен пограничный случай, когда обновление хука не запоминалось. Исправлена эвристика для определения того, когда следует гидратировать, чтобы мы не выполняли неправильную гидратацию во время обновления. Очистите дополнительные поля волокон во время размонтирования для экономии памяти. Исправлена ошибка с обязательными текстовыми полями в Firefox. Предпочитайте Object.is вместо встроенного полифилла, если он доступен. Исправлена ошибка при смешивании Suspense и обработки ошибок. |
16.11.0 | 22 октября 2019 г. | Исправлена ошибка, из-за которой обработчики mouseenter не срабатывали дважды внутри вложенных контейнеров React. Удалите экспериментальные API-интерфейсы stable_createRoot и stable_createSyncRoot. (Они доступны в экспериментальном канале как createRoot и createSyncRoot.) |
16.12.0 | 14 ноября 2019 г. | React DOM – Исправление пассивных эффектов ( useEffect ), которые не срабатывали в многокорневом приложении. React Is – Исправление lazy и memo типы считались элементами вместо компонентов |
16.13.0 | 26 февраля 2020 г. | Добавлены функции в React Concurrent mode. Исправлены регрессии в React core library и React Dom. |
16.14.0 | 14 октября 2020 г. | Добавить поддержку нового преобразования JSX. |
17.0.0 | 20 октября 2020 г. | «Нет новых функций» позволяет постепенно обновлять React со старых версий. Добавить новое преобразование JSX, изменения в делегировании событий |
18.0.0 | 29 марта 2022 г. | Параллельный React, автоматическое пакетирование, новые функции Suspense, переходы, API клиентского и серверного рендеринга, новое поведение строгого режима, новые хуки [60] |
18.1.0 | 26 апреля 2022 г. | Множество исправлений и улучшений производительности |
18.2.0 | 14 июня 2022 г. | Множество других исправлений и улучшений производительности. |
18.3.0 | 25 апреля 2024 г. | Добавляет предупреждения об устаревании функций в React 19. |
19.0.0 | 5 декабря 2024 г. | Действия, новые хуки (useActionState, useFormStatus, useOptimistic), использование API, серверные компоненты, серверные действия, передача ссылок как обычного свойства, улучшенные различия гидратации, улучшенный контекстный API, функции очистки ссылок, улучшенный useDeferredValue API, поддержка метаданных документа, поддержка таблиц стилей, поддержка асинхронных скриптов, поддержка предварительной загрузки ресурсов, улучшенные сообщения об ошибках и поддержка пользовательских элементов. |
Первоначальный публичный релиз React в мае 2013 года использовал Apache License 2.0 . В октябре 2014 года React 0.12.00 заменил ее на лицензию BSD из 3 пунктов и добавил отдельный текстовый файл PATENTS, который разрешает использование любых патентов Facebook, связанных с программным обеспечением: [61]
Лицензия, предоставленная по настоящему Соглашению, будет автоматически и без уведомления прекращена для любого лица, которое предъявит иск (включая подачу иска, заявления или иного иска), утверждающий (a) прямое, косвенное или косвенное нарушение или побуждение к нарушению любого патента: (i) со стороны Facebook или любой из ее дочерних компаний или филиалов, независимо от того, связано ли такое требование с Программным обеспечением, (ii) любой стороны, если такое требование возникает полностью или частично из любого программного обеспечения, продукта или услуги Facebook или любой из ее дочерних компаний или филиалов, независимо от того, связано ли такое требование с Программным обеспечением, или (iii) любой стороны, связанной с Программным обеспечением; или (b) что любое право в любой патентной претензии Facebook является недействительным или неисполнимым.
Этот нетрадиционный пункт вызвал некоторые противоречия и дебаты в сообществе пользователей React, поскольку его можно было бы интерпретировать как наделение Facebook полномочиями отзывать лицензию во многих сценариях, например, если Facebook подает в суд на лицензиата, побуждая его предпринять «другие действия», опубликовав действие в блоге или в другом месте. Многие выразили опасения, что Facebook может несправедливо использовать пункт о прекращении или что интеграция React в продукт может усложнить будущее приобретение стартап-компании. [62]
На основе отзывов сообщества Facebook обновил условия выдачи патента в апреле 2015 года, сделав их менее двусмысленными и более разрешительными: [63]
Лицензия, предоставленная по настоящему Соглашению, будет автоматически и без уведомления прекращена, если вы (или любая из ваших дочерних компаний, корпоративных филиалов или агентов) инициируете прямо или косвенно или принимаете прямую финансовую заинтересованность в любой Патентной претензии: (i) против Facebook или любой из ее дочерних компаний или корпоративных филиалов, (ii) против любой стороны, если такая Патентная претензия возникает полностью или частично из любого программного обеспечения, технологии, продукта или услуги Facebook или любой из ее дочерних компаний или корпоративных филиалов, или (iii) против любой стороны, связанной с Программным обеспечением. [...] «Патентная претензия» — это любой иск или иное действие, утверждающее прямое, косвенное или косвенное нарушение или побуждение к нарушению любого патента, включая перекрестный иск или встречный иск. [64]
Apache Software Foundation посчитала это лицензионное соглашение несовместимым с ее политикой лицензирования, поскольку оно «переносит риск на последующих потребителей нашего программного обеспечения, несбалансированно в пользу лицензиара, а не лицензиата, тем самым нарушая нашу юридическую политику Apache как универсального донора», и «не являются подмножеством тех, которые содержатся в [Apache License 2.0], и они не могут быть сублицензированы как [Apache License 2.0]». [65] В августе 2017 года Facebook отклонил последующие опасения Apache Foundation и отказался пересматривать свою лицензию. [66] [67] В следующем месяце WordPress решила переключить свои проекты Gutenberg и Calypso с React. [68]
23 сентября 2017 года Facebook объявила, что на следующей неделе она повторно лицензирует Flow, Jest, React и Immutable.js в соответствии со стандартной лицензией MIT ; компания заявила, что React является «основой широкой экосистемы программного обеспечения с открытым исходным кодом для Интернета», и что они не хотят «сдерживать прогресс по нетехническим причинам». [69]
26 сентября 2017 года React 16.0.0 был выпущен с лицензией MIT. [70] Изменение лицензии MIT также было перенесено в линейку релизов 15.x с React 15.6.2. [71]
JavaScript-фреймворки веб-приложений, такие как React, предоставляют обширные возможности, но идут на соответствующие компромиссы. Эти фреймворки часто расширяют или улучшают функции, доступные через собственные веб-технологии, такие как маршрутизация, компонентная разработка и управление состоянием. В то время как собственные веб-стандарты, включая веб-компоненты, современные JavaScript API, такие как Fetch и ES Modules, и возможности браузера, такие как Shadow DOM, значительно продвинулись вперед, фреймворки по-прежнему широко используются из-за их способности повышать производительность разработчиков, предлагать структурированные шаблоны для крупномасштабных приложений, упрощать обработку крайних случаев и предоставлять инструменты для оптимизации производительности. [72] [73] [74]
Фреймворки могут вводить слои абстракции, которые могут способствовать накладным расходам производительности, большим размерам пакетов и повышенной сложности. Современные фреймворки, такие как React 18, решают эти проблемы с помощью таких функций, как параллельный рендеринг, tree-shaking и выборочная гидратация. Хотя эти усовершенствования повышают эффективность рендеринга и управление ресурсами, их преимущества зависят от конкретного приложения и контекста реализации. Легкие фреймворки, такие как Svelte и Preact, используют различные архитектурные подходы, при этом Svelte полностью устраняет виртуальный DOM в пользу компиляции компонентов в эффективный код JavaScript, а Preact предлагает минимальную, совместимую альтернативу React. Выбор фреймворка зависит от требований приложения, включая опыт команды, цели производительности и приоритеты разработки. [72] [73] [74]
Новая категория веб-фреймворков, включая enhance.dev, Astro и Fresh, использует собственные веб-стандарты, минимизируя абстракции и инструменты разработки. [75] [76] [77] Эти решения подчеркивают прогрессивное улучшение , серверный рендеринг и оптимизацию производительности. Astro по умолчанию рендерит статический HTML, гидратируя только интерактивные части. Fresh фокусируется на серверном рендеринге с нулевыми издержками времени выполнения. Enhance.dev отдает приоритет шаблонам прогрессивного улучшения с использованием веб-компонентов. Хотя эти инструменты уменьшают зависимость от клиентского JavaScript, перенося логику на время сборки или выполнение на стороне сервера, они по-прежнему используют JavaScript там, где это необходимо для интерактивности. Такой подход делает их особенно подходящими для приложений, критически важных для производительности и ориентированных на контент. [72] [73] [74]