Из Википедии, свободной энциклопедии
Перейти к навигацииПерейти к поиску

React (также известный как React.js или ReactJS ) является свободным и открытым исходным кодом переднего конца JavaScript библиотекой [3] для построения пользовательских интерфейсов или компонентов пользовательского интерфейса. Он поддерживается Facebook и сообществом отдельных разработчиков и компаний. [4] [5] [6] React можно использовать как основу при разработке одностраничных или мобильных приложений. Однако React занимается только управлением состоянием и отображением этого состояния в DOM , поэтому создание приложений React обычно требует использования дополнительных библиотек для маршрутизации, а также определенных функций на стороне клиента.[7]

Основное использование

Ниже приведен рудиментарный пример использования React в HTML с JSX и JavaScript.

< div  id = "myReactApp" > </ div >< script  type = "text / babel" > function  Greeter ( props )  { return  < h1 > { props . приветствие } < / h1>; } пусть  App  =  < Greeter  приветствие = "Hello World!"  /> ; ReactDOM . render ( приложение ,  документ . getElementById ( 'myReactApp' ));</ скрипт >

GreeterФункция является Реагировать компонент , который принимает свойство greeting. Переменная App- это экземпляр Greeterкомпонента, для которого установлено greetingсвойство 'Hello World!'. Затем ReactDOM.renderметод отображает наш компонент Greeter внутри элемента DOM с идентификатором myReactApp.

При отображении в веб-браузере результат будет

< div  id = "myReactApp" >  < h1 > Привет, мир! </ h1 > </ div >

Примечательные особенности

Компоненты

Код React состоит из сущностей, называемых компонентами. Компоненты могут отображаться в конкретный элемент DOM с помощью библиотеки React DOM. При рендеринге компонента можно передавать значения, известные как «реквизиты»: [8]

ReactDOM . рендеринга ( < Greeter  приветствие = "Hello World!"  /> ,  документ . getElementById ( 'myReactApp' ));

Два основных способа объявления компонентов в React - через функциональные компоненты и компоненты на основе классов.

Функциональные компоненты

Функциональные компоненты объявляются с функцией, которая затем возвращает некоторый JSX.

const  Greeter  =  ( props )  =>  < div > Привет ,  { props . имя } ! < / div>;

Компоненты на основе классов

Компоненты на основе классов объявляются с использованием классов ES6 .

class  ParentComponent  расширяет  React . Компонент  {  состояние  =  {  цвет :  'зеленый'  };  render ()  {  return  (  < ChildComponent  color = { this . state . color }  />  );  } }

Виртуальный DOM

Еще одна примечательная особенность - использование виртуальной объектной модели документа или виртуальной DOM. Реагировать создает в памяти кэш данных структуры, вычисляет итоговые различия, а затем эффективно обновляет отображаемую DOM браузера. [9] Этот процесс называется примирением . Это позволяет программисту писать код, как будто вся страница отображается при каждом изменении, в то время как библиотеки React отображают только те подкомпоненты, которые действительно изменяются. Этот выборочный рендеринг обеспечивает значительное повышение производительности. [ необходима цитата ] Это избавляет от необходимости пересчитывать стиль CSS, макет страницы и визуализацию для всей страницы. [ необходима цитата ]

Методы жизненного цикла

В методах жизненного цикла используется форма подключения, которая позволяет выполнять код в заданные моменты в течение срока службы компонента.

  • shouldComponentUpdate позволяет разработчику предотвратить ненужный повторный рендеринг компонента, возвращая false, если рендеринг не требуется.
  • componentDidMountвызывается после того, как компонент «смонтирован» (компонент был создан в пользовательском интерфейсе, часто путем связывания его с узлом DOM ). Обычно это используется для запуска загрузки данных из удаленного источника через API .
  • componentWillUnmountвызывается непосредственно перед разборкой или «размонтированием» компонента. Это обычно используется для очистки ресурсозатратных зависимостей от компонента, которые не будут просто удалены при размонтировании компонента (например, удаление любых setInterval()экземпляров, связанных с компонентом, или « eventListener », установленного в «документе», потому что наличия компонента)
  • renderэто самый важный метод жизненного цикла и единственный необходимый для любого компонента. Обычно он вызывается каждый раз при обновлении состояния компонента, что должно отражаться в пользовательском интерфейсе.

JSX

JSX или JavaScript XML - это расширение синтаксиса языка JavaScript. [10] По внешнему виду похож на HTML, JSX предоставляет способ структурирования рендеринга компонентов с использованием синтаксиса, знакомого многим разработчикам. Компоненты React обычно пишутся с использованием JSX, хотя это не обязательно (компоненты также могут быть написаны на чистом JavaScript). JSX похож на другой синтаксис расширения, созданный Facebook для PHP под названием XHP .

Пример JSX-кода:

класс  App  расширяет  React . Component  { render ()  { возврат  ( < div > < p > Заголовок < / p> < p > Содержание < / p> < p > Нижний колонтитул < / p> < / div> ); }}

Архитектура за пределами HTML

Базовая архитектура React применяется не только к рендерингу HTML в браузере. Например, у Facebook есть динамические диаграммы, которые отображаются в <canvas>теги [11], а Netflix и PayPal используют универсальную загрузку для визуализации идентичного HTML как на сервере, так и на клиенте. [12] [13]

Реагировать на хуки

Хуки - это функции, которые позволяют разработчикам «подключаться» к функциям состояния и жизненного цикла React из функциональных компонентов. [14] Хуки не работают внутри классов - они позволяют использовать React без классов. [15]

Реагировать обеспечивает несколько встроенных крюков нравится useState, [16] useContext , useReducerи useEffect. [17] Остальные описаны в Справочнике по API хуков. [18] useState , useReducerи useEffect, наиболее часто используемые, предназначены для контроля состояния и побочных эффектов соответственно.

Правила хуков

Существуют правила перехватчиков [19], которые описывают характерный шаблон кода, на который полагаются перехватчики. Это современный способ обработки состояния с помощью React.

  1. Хуки следует вызывать только на верхнем уровне (не внутри циклов или операторов if).
  2. Хуки должны вызываться только из функциональных компонентов React, а не из обычных функций или компонентов класса.

Хотя эти правила не могут быть применены во время выполнения, инструменты анализа кода, такие как линтеры, могут быть настроены для обнаружения многих ошибок во время разработки. Правила применяются как к использованию перехватчиков, так и к реализации пользовательских перехватчиков [20], которые могут вызывать другие перехватчики.

Общие идиомы

React не пытается предоставить полную «библиотеку приложений». Он разработан специально для создания пользовательских интерфейсов [3] и поэтому не включает многие инструменты, которые некоторые разработчики могут счесть необходимыми для создания приложения. Это позволяет выбрать те библиотеки, которые разработчик предпочитает выполнять для выполнения таких задач, как выполнение доступа к сети или локального хранения данных. Общие шаблоны использования появились по мере развития библиотеки.

Однонаправленный поток данных

Для поддержки концепции React об однонаправленном потоке данных (который может быть противопоставлен двунаправленному потоку AngularJS ) архитектура Flux была разработана как альтернатива популярной архитектуре модель – представление – контроллер . В Flux есть действия, которые отправляются через центральный диспетчер в хранилище , а изменения в хранилище распространяются обратно в представление. [21] При использовании с React это распространение осуществляется через свойства компонентов. С момента своего создания Flux был заменен такими библиотеками, как Redux и MobX. [22]

Поток можно рассматривать как вариант паттерна наблюдателя . [23]

Компонент React в архитектуре Flux не должен напрямую изменять какие-либо переданные ему реквизиты, но ему следует передавать функции обратного вызова, которые создают действия, которые отправляются диспетчером для изменения хранилища. Действие - это объект, в обязанности которого входит описание того, что произошло: например, действие, описывающее одного пользователя, «следующего» за другим, может содержать идентификатор пользователя, идентификатор целевого пользователя и тип USER_FOLLOWED_ANOTHER_USER. [24] Хранилища, которые можно рассматривать как модели, могут изменяться в ответ на действия, полученные от диспетчера.

Этот паттерн иногда выражается как «свойства текут вниз, действия текут вверх». С момента его создания было создано множество реализаций Flux, возможно, самая известная из них - Redux , которая имеет единое хранилище, часто называемое единым источником истины . [25]

Будущее развитие

Статус проекта можно отслеживать через дискуссионный форум основной команды. [26] Однако основные изменения в React связаны с проблемами репозитория Future of React и запросами на вытягивание . [27] [28] Это позволяет сообществу React предоставлять отзывы о новых потенциальных функциях, экспериментальных API и улучшениях синтаксиса JavaScript.

История

React был создан Джорданом Уолком, инженером-программистом в Facebook, который выпустил ранний прототип React под названием «FaxJS». [29] [30] На него повлияла XHP , библиотека компонентов HTML для PHP . Впервые он был размещен в ленте новостей Facebook в 2011 году, а затем в Instagram в 2012 году. [31] В мае 2013 года его исходный код был открыт в JSConf US. [30]

React Native , который позволяет создавать собственные приложения для Android , iOS и UWP с помощью React, был анонсирован на конференции React Conf в Facebook в феврале 2015 года , а исходный код был открыт в марте 2015 года.

18 апреля 2017 года Facebook анонсировал React Fiber, новый набор внутренних алгоритмов для рендеринга, в отличие от старого алгоритма рендеринга React, Stack. [32] React Fiber должен был стать основой для любых будущих улучшений и разработки функций библиотеки React. [33] [ требуется обновление ] Фактический синтаксис программирования с помощью React не меняется; изменился только способ выполнения синтаксиса. [34]Старая система рендеринга React, Stack, была разработана в то время, когда акцент системы на динамических изменениях не понимался. Стек медленно рисовал сложную анимацию, например, пытался выполнить все за один фрагмент. Fiber разбивает анимацию на сегменты, которые можно распределить по нескольким кадрам. Точно так же структура страницы может быть разбита на сегменты, которые могут поддерживаться и обновляться отдельно. Функции JavaScript и виртуальные объекты DOM называются «волокнами», и каждый из них может управляться и обновляться отдельно, что обеспечивает более плавный рендеринг на экране. [35]

26 сентября 2017 года React 16.0 был выпущен для широкой публики. [36]

16 февраля 2019 года React 16.8 был выпущен для широкой публики. [37] Релиз представил React Hooks. [38]

10 августа 2020 года команда React объявила о первом выпуске-кандидате для React v17.0, известном как первый крупный выпуск без серьезных изменений в API React, предназначенном для разработчиков. [39]

Лицензирование

Первоначальный публичный выпуск React в мае 2013 года использовал лицензию Apache License 2.0 . В октябре 2014 года React 0.12.0 заменил это лицензией BSD с тремя пунктами и добавил отдельный текстовый файл PATENTS, который разрешает использование любых патентов Facebook, связанных с программным обеспечением: [40]

Лицензия, предоставленная в соответствии с настоящим Соглашением, автоматически и без предварительного уведомления прекращает свое действие для любого, кто предъявит какие-либо претензии (в том числе путем подачи любого судебного иска, утверждения или других действий), ссылаясь на (а) прямое, косвенное или сопутствующее нарушение или побуждение к нарушению любого патента: (i ) Facebook или любой из его дочерних или аффилированных компаний, независимо от того, связаны ли такие претензии с Программным обеспечением, (ii) любой стороной, если такая претензия возникает полностью или частично из любого программного обеспечения, продукта или услуги Facebook или любого из ее дочерние компании или аффилированные лица, независимо от того, связаны ли такие претензии с Программным обеспечением, или (iii) какой-либо стороной, имеющей отношение к Программному обеспечению; или (б) что любое право в любой патентной заявке Facebook является недействительным или не имеющим исковой силы.

Этот нетрадиционный пункт вызвал некоторые споры и дебаты в сообществе пользователей React, поскольку его можно интерпретировать как уполномочивающее Facebook отозвать лицензию во многих сценариях, например, если Facebook подает в суд на лицензиата, предлагая им предпринять «другие действия», опубликовав действие. в блоге или в другом месте. Многие выразили опасения, что Facebook может несправедливо использовать положение о прекращении действия или что интеграция React в продукт может осложнить приобретение новой компании в будущем. [41]

Основываясь на отзывах сообщества, Facebook обновил выдачу патента в апреле 2015 года, сделав его менее двусмысленным и более разрешительным: [42]

Лицензия, предоставленная по настоящему Соглашению, будет прекращена автоматически и без предварительного уведомления, если вы (или любая из ваших дочерних компаний, корпоративных филиалов или агентов) инициируете прямо или косвенно или примете прямую финансовую заинтересованность в любом Заявлении о патенте: (i) против Facebook или любого другого своих дочерних компаний или корпоративных аффилированных лиц, (ii) против любой стороны, если такое Заявление о патенте возникает полностью или частично из любого программного обеспечения, технологии, продукта или услуги Facebook или любой из ее дочерних компаний или корпоративных аффилированных лиц, или (iii) против любой стороны относящиеся к Программному обеспечению. [...] «Заявление о патенте» - это любой судебный процесс или иное действие, предполагающее прямое, косвенное или сопутствующее нарушение или побуждение к нарушению любого патента, включая встречный иск или встречный иск. [43]

Фонд Apache Software рассмотрел это лицензионное соглашение несовместимо с его лицензионной политикой, так как она «проходит по риску для последующих потребителей нашего программного обеспечения несбалансированных в пользу лицензиара, а не лицензиат, нарушив тем самого наш Apache правовой политики является универсальным донором «, и» не являются подмножеством тех, которые содержатся в [Apache License 2.0], и они не могут быть сублицензированы как [Apache License 2.0] ». [44] В августе 2017 года Facebook отклонил озабоченность Apache Foundation в отношении нисходящего потока и отказался пересмотреть свою лицензию. [45] [46] В следующем месяце WordPress решил переключить свои проекты Gutenberg и Calypso с React. [47]

23 сентября 2017 года Facebook объявил, что на следующей неделе он повторно лицензирует Flow, Jest , React и Immutable.js под стандартной лицензией MIT ; компания заявила, что React был «основой широкой экосистемы программного обеспечения с открытым исходным кодом для Интернета», и что они не хотели «сдерживать прогресс по нетехническим причинам». [48]

26 сентября 2017 года был выпущен React 16.0.0 с лицензией MIT. [49] Изменение лицензии MIT также было перенесено в линию выпуска 15.x с React 15.6.2. [50]

См. Также

  • React Native
  • AngularJS
  • Угловой
  • Backbone.js
  • Ember.js
  • Svelte
  • Vue.js
  • Сравнение библиотек JavaScript
  • Веб-компоненты

Ссылки

  1. ^ Occhino, Том; Уолке, Иордания. «Приложения JS в Facebook» . YouTube . Дата обращения 22 октября 2018 .
  2. ^ "Выпуск 17.0.2" . Проверено 10 апреля 2021 года .
  3. ^ a b «React - Библиотека JavaScript для создания пользовательских интерфейсов» . Реагировать . Проверено 7 апреля 2018 года .
  4. ^ Криль, Пол (15 мая 2014). «React: создание более быстрых и плавных интерфейсов для веб-приложений, управляемых данными» . InfoWorld .
  5. ^ Хемель, Зеф (3 июня 2013). «Библиотека пользовательских интерфейсов Facebook React JavaScript получает неоднозначные отзывы» . InfoQ .
  6. Доусон, Крис (25 июля 2014 г.). «История JavaScript и как это привело к ReactJS» . Новый стек .
  7. ^ Дере, Мохан (2018-02-19). «Как интегрировать приложение create-response-app со всеми библиотеками, необходимыми для создания отличного приложения» . freeCodeCamp . Проверено 14 июня 2018 .
  8. ^ «Компоненты и реквизит» . Реагировать . Facebook . Проверено 7 апреля 2018 года .
  9. ^ «Ссылки и ДОМ» . Блог React .
  10. ^ «Черновик: Спецификация JSX» . JSX . Facebook . Проверено 7 апреля 2018 года .
  11. ^ «Почему мы создали React? - Блог React» .
  12. ^ "PayPal Isomorphic React" . Архивировано 8 февраля 2019 года.
  13. ^ "Netflix Isomorphic React" .
  14. ^ "Хуки вкратце - Реагировать" . reactjs.org . Проверено 8 августа 2019 .
  15. ^ "Что, черт возьми, такое React Hooks?" . Soshace . 2020-01-16 . Проверено 24 января 2020 .
  16. ^ "Использование State Hook - React" . reactjs.org . Проверено 24 января 2020 .
  17. ^ "Использование крючка эффектов - реакция" . reactjs.org . Проверено 24 января 2020 .
  18. ^ «Справочник по API хуков - React» . reactjs.org . Проверено 24 января 2020 .
  19. ^ "Правила хуков - реакция" . reactjs.org . Проверено 24 января 2020 .
  20. ^ «Создание собственных хуков - реакция» . reactjs.org . Проверено 24 января 2020 .
  21. ^ "В глубине обзора" . Флюс . Facebook . Проверено 7 апреля 2018 года .
  22. ^ "Flux Release 4.0" . Github . Проверено 26 февраля 2021 года .
  23. ^ Джонсон, Николас. «Введение в Flux - React Exercise» . Николас Джонсон . Проверено 7 апреля 2018 года .
  24. Абрамов, Дан. «История React и Flux с Дэном Абрамовым» . Три разработчика и возможно . Проверено 7 апреля 2018 года .
  25. ^ «Инструменты государственного управления - результаты» . Состояние JavaScript . Проверено 7 апреля 2018 года .
  26. ^ «Заметки о встрече» . Реагировать Обсудить . Проверено 13 декабря 2015 .
  27. ^ "reactjs / react-future - будущее React" . GitHub . Проверено 13 декабря 2015 .
  28. ^ "facebook / response - проблемы с запросом функции" . GitHub . Проверено 13 декабря 2015 .
  29. ^ Уолк, Иордания. "FaxJS" . Проверено 11 июля 2019 .
  30. ^ a b Папп, Андреа (4 апреля 2018 г.). «История React.js на временной шкале» . RisingStack . Проверено 11 июля 2019 .
  31. ^ "Пит Хант в TXJS" .
  32. ^ Фредерик Lardinois (18 апреля 2017). «Facebook анонсирует React Fiber, переработанный вариант своей библиотеки React» . TechCrunch . Проверено 19 апреля 2017 года .
  33. ^ "Архитектура React Fiber" . Github . Проверено 19 апреля 2017 года .
  34. ^ «Facebook объявляет о выпуске React Fiber, переработанного фреймворка React» . TechCrunch . Проверено 19 октября 2018 .
  35. ^ "GitHub - acdlite / react-fiber-architecture: Описание нового основного алгоритма React, React Fiber" . github.com . Проверено 19 октября 2018 .
  36. ^ "React v16.0" . react.js. 2017-09-26 . Проверено 20 мая 2019 .
  37. ^ "React v16.8" . react.js. 2019-02-16 . Проверено 20 мая 2019 .
  38. ^ "Знакомство с крючками" . react.js . Проверено 20 мая 2019 .
  39. ^ url = https://reactjs.org/blog/2020/08/10/react-v17-rc.html
  40. ^ "React CHANGELOG.md" . GitHub .
  41. ^ Лю, Остин. «Убедительная причина не использовать ReactJS» . Средний .
  42. ^ «Обновление нашего патента с открытым исходным кодом» .
  43. ^ «Дополнительное предоставление патентных прав версии 2» . GitHub .
  44. ^ «Ранее задаваемые юридические вопросы по ASF» . Фонд программного обеспечения Apache . Проверено 16 июля 2017 .
  45. ^ «Объяснение лицензии React» . Facebook . Проверено 18 августа 2017 .
  46. ^ «Рассмотрите возможность повторного лицензирования до AL v2.0, как это только что сделала RocksDB» . Github . Проверено 18 августа 2017 .
  47. ^ «WordPress откажется от библиотеки React из-за риска, связанного с патентной оговоркой Facebook» . TechCrunch . Проверено 16 сентября 2017 .
  48. ^ «Перезапуск React, Jest, Flow и Immutable.js» . Код Facebook . 2017-09-23.
  49. Кларк, Эндрю (26 сентября 2017 г.). "React v16.0§MIT лицензировано" . Блог React .
  50. ^ Hunzaker, Натан (25 сентября 2017). «React v15.6.2» . Блог React .

Внешние ссылки

  • Официальный веб-сайт