Autor (es) original (es) | Jordan Walke |
---|---|
Desarrollador (es) | Facebook y comunidad |
Versión inicial | 29 de mayo de 2013 [1] |
Lanzamiento estable | 17.0.2 [2] / 22 de marzo de 2021 |
Repositorio | |
Escrito en | JavaScript |
Plataforma | Plataforma web |
Escribe | Biblioteca de JavaScript |
Licencia | Licencia MIT |
Sitio web | reactjs |
React (también conocido como React.js o ReactJS ) es una biblioteca de JavaScript de front-end gratuito y de código abierto [3] para construir interfaces de usuario o componentes de UI. Es mantenido por Facebook y una comunidad de desarrolladores y empresas individuales. [4] [5] [6] React se puede utilizar como base en el desarrollo de aplicaciones móviles o de una sola página . Sin embargo, React solo se ocupa de la administración del estado y la representación de ese estado en el DOM , por lo que la creación de aplicaciones React generalmente requiere el uso de bibliotecas adicionales para el enrutamiento, así como ciertas funciones del lado del cliente. [7]
El siguiente es un ejemplo rudimentario del uso de React en HTML con JSX y JavaScript.
< div id = "myReactApp" > </ div >< script type = "text / babel" > función Greeter ( apoyos ) { return < h1 > { props . saludo } < / h1>; } dejó App = < Greeter saludo = "Hello World!" /> ; ReactDOM . render ( Aplicación , documento . getElementById ( 'myReactApp' ));</ script >
La Greeter
función es un componente de React que acepta una propiedad greeting
. La variable App
es una instancia del Greeter
componente donde greeting
se establece la propiedad 'Hello World!'
. El ReactDOM.render
método luego representa nuestro componente Greeter dentro del elemento DOM con id myReactApp
.
Cuando se muestra en un navegador web, el resultado será
< div id = "myReactApp" > < h1 > ¡Hola, mundo! </ h1 > </ div >
Este artículo está escrito como un manual o una guía . ( Septiembre de 2021 ) |
El código de React está formado por entidades llamadas componentes. Los componentes se pueden representar en un elemento particular en el DOM usando la biblioteca React DOM. Al renderizar un componente, se pueden pasar valores que se conocen como "props": [8]
ReactDOM . render ( < Greeter saludo = "Hello World!" /> , documento . getElemenById ( 'myReactApp' ));
Las dos formas principales de declarar componentes en React son a través de componentes de función y componentes basados en clases.
Los componentes de la función se declaran con una función que luego devuelve algo de JSX.
const Greeter = ( props ) => < div > Hola , { props . nombre } ! < / div>;
Los componentes basados en clases se declaran utilizando clases ES6 .
class ParentComponent extiende React . Componente { estado = { color : 'verde' }; render () { return ( < ChildComponent color = { this . state . color } /> ); } }
Otra característica notable es el uso de un modelo de objeto de documento virtual , o DOM virtual. Reaccionar crea una en memoria caché de estructuras de datos, calcula las diferencias resultantes, y luego actualiza mostrado DOM del navegador de manera eficiente. [9] Este proceso se llama reconciliación . Esto permite al programador escribir código como si toda la página se representara en cada cambio, mientras que las bibliotecas de React solo representan los subcomponentes que realmente cambian. Esta representación selectiva proporciona un importante impulso al rendimiento. [ cita requerida ] Ahorra el esfuerzo de recalcular el estilo CSS, el diseño de la página y la representación de toda la página. [ cita requerida ]
Los métodos de ciclo de vida utilizan una forma de enlace que permite la ejecución de código en puntos establecidos durante la vida útil de un componente.
shouldComponentUpdate
permite al desarrollador evitar la renderización innecesaria de un componente devolviendo false si no se requiere una renderización.componentDidMount
se llama una vez que el componente se ha "montado" (el componente se ha creado en la interfaz de usuario, a menudo asociándolo con un nodo DOM ). Esto se usa comúnmente para activar la carga de datos desde una fuente remota a través de una API .componentWillUnmount
se llama inmediatamente antes de que el componente sea desmontado o "desmontado". Esto se usa comúnmente para borrar las dependencias del componente que exigen recursos y que no se eliminarán simplemente con el desmontaje del componente (p. Ej., Eliminar cualquier setInterval()
instancia que esté relacionada con el componente o un " eventListener " establecido en el "documento" porque de la presencia del componente)render
es el método de ciclo de vida más importante y el único requerido en cualquier componente. Por lo general, se llama cada vez que se actualiza el estado del componente, lo que debe reflejarse en la interfaz de usuario.JSX, o JavaScript XML , es una extensión de la sintaxis del lenguaje JavaScript. [10] De apariencia similar a HTML, JSX proporciona una forma de estructurar la representación de componentes utilizando una sintaxis familiar para muchos desarrolladores. Los componentes de React generalmente se escriben usando JSX, aunque no es necesario (los componentes también pueden estar escritos en JavaScript puro). JSX es similar a otra sintaxis de extensión creada por Facebook para PHP llamada XHP .
Un ejemplo de código JSX:
La aplicación de clase extiende React . Componente { render () { retorno ( < div > < p > Encabezado < / p> < p > Contenido < / p> < p > Pie de página < / p> < / div> ); }}
La arquitectura básica de React se aplica más allá de la representación de HTML en el navegador. Por ejemplo, Facebook tiene gráficos dinámicos que se procesan en <canvas>
etiquetas, [11] y Netflix y PayPal utilizan la carga universal para generar HTML idéntico tanto en el servidor como en el cliente. [12] [13]
Los enganches son funciones que permiten a los desarrolladores "conectarse" al estado de React y a las características del ciclo de vida de los componentes de la función. [14] Los Hooks no funcionan dentro de las clases, te permiten usar React sin clases. [15]
Reaccionar proporciona algunos ganchos incorporados como useState
, [16] useContext
, useReducer
, useMemo
y useEffect
. [17] Otros están documentados en la Referencia de API de Hooks. [18] useState
, useReducer
y useEffect
, que son los más utilizados, son para controlar el estado y los efectos secundarios, respectivamente.
Hay reglas de los ganchos [19] que describen el patrón de código característico en el que se basan los ganchos. Es la forma moderna de manejar el estado con React.
Aunque estas reglas no se pueden hacer cumplir en tiempo de ejecución, las herramientas de análisis de código como linters se pueden configurar para detectar muchos errores durante el desarrollo. Las reglas se aplican tanto al uso de hooks como a la implementación de hooks personalizados, [20] que pueden llamar a otros hooks.
React no intenta proporcionar una "biblioteca de aplicaciones" completa. Está diseñado específicamente para crear interfaces de usuario [3] y, por lo tanto, no incluye muchas de las herramientas que algunos desarrolladores pueden considerar necesarias para crear una aplicación. Esto permite la elección de las bibliotecas que prefiera el desarrollador para realizar tareas como realizar el acceso a la red o el almacenamiento de datos local. Los patrones comunes de uso han surgido a medida que la biblioteca madura.
Para respaldar el concepto de React de flujo de datos unidireccional (que podría contrastarse con el flujo bidireccional de AngularJS ), la arquitectura Flux se desarrolló como una alternativa a la popular arquitectura modelo-vista-controlador . Flux presenta acciones que se envían a través de un despachador central a una tienda , y los cambios en la tienda se propagan de regreso a la vista. [21] Cuando se usa con React, esta propagación se logra a través de las propiedades de los componentes. Desde su concepción, Flux ha sido reemplazado por bibliotecas como Redux y MobX. [22]
El flujo se puede considerar una variante del patrón del observador . [23]
Un componente de React bajo la arquitectura Flux no debe modificar directamente ningún accesorio que se le pase, sino que se le deben pasar funciones de devolución de llamada que crean acciones que son enviadas por el despachador para modificar la tienda. La acción es un objeto cuya responsabilidad es describir lo que ha ocurrido: por ejemplo, una acción que describe a un usuario "siguiendo" a otro podría contener una identificación de usuario, una identificación de usuario objetivo y el tipo USER_FOLLOWED_ANOTHER_USER
. [24] Las tiendas, que pueden considerarse modelos, pueden modificarse en respuesta a las acciones recibidas del despachador.
Este patrón a veces se expresa como "las propiedades fluyen hacia abajo, las acciones fluyen hacia arriba". Se han creado muchas implementaciones de Flux desde sus inicios, quizás la más conocida sea Redux , que presenta una sola tienda, a menudo llamada una sola fuente de verdad . [25]
El estado del proyecto se puede rastrear a través del foro de discusión del equipo central. [26] Sin embargo, los cambios importantes en React pasan por los problemas del repositorio Future of React y las solicitudes de extracción . [27] [28] Esto permite a la comunidad React proporcionar comentarios sobre nuevas características potenciales, API experimentales y mejoras de sintaxis de JavaScript.
React fue creado por Jordan Walke, un ingeniero de software de Facebook, quien lanzó un primer prototipo de React llamado "FaxJS". [29] [30] Fue influenciado por XHP , una biblioteca de componentes HTML para PHP . Se implementó por primera vez en el News Feed de Facebook en 2011 y luego en Instagram en 2012. [31] Fue de código abierto en JSConf US en mayo de 2013. [30]
React Native , que permite el desarrollo nativo de Android , iOS y UWP con React, fue anunciado en la React Conf de Facebook en febrero de 2015 y de código abierto en marzo de 2015.
El 18 de abril de 2017, Facebook anunció React Fiber, un nuevo conjunto de algoritmos internos para renderizado, a diferencia del antiguo algoritmo de renderizado de React, Stack. [32] React Fiber se convertiría en la base de cualquier mejora futura y desarrollo de funciones de la biblioteca React. [33] [ necesita actualización ] La sintaxis real para programar con React no cambia; sólo ha cambiado la forma en que se ejecuta la sintaxis. [34]El antiguo sistema de renderizado de React, Stack, se desarrolló en un momento en que no se entendía el enfoque del sistema en el cambio dinámico. Stack fue lento para dibujar animaciones complejas, por ejemplo, tratando de lograrlo todo en un solo fragmento. La fibra divide la animación en segmentos que se pueden distribuir en varios fotogramas. Asimismo, la estructura de una página se puede dividir en segmentos que se pueden mantener y actualizar por separado. Las funciones de JavaScript y los objetos DOM virtuales se denominan "fibras", y cada uno puede operarse y actualizarse por separado, lo que permite una representación en pantalla más fluida. [35]
El 26 de septiembre de 2017, React 16.0 se lanzó al público. [36]
El 16 de febrero de 2019, React 16.8 se lanzó al público. [37] El lanzamiento introdujo React Hooks. [38]
El 10 de agosto de 2020, el equipo de React anunció el primer candidato de lanzamiento para React v17.0, notable como el primer lanzamiento importante sin cambios importantes en la API orientada al desarrollador de React. [39]
Versión | Fecha de lanzamiento | Cambios |
---|---|---|
0.3.0 | 29 de mayo de 2013 | Lanzamiento público inicial |
0.4.0 | 20 de julio de 2013 | Soporte para nodos de comentarios <div> {/ * * /} </div>, API de renderizado del lado del servidor mejoradas, React.autoBind eliminado, Soporte para el apoyo clave, Mejoras en los formularios, Errores corregidos. |
0.5.0 | 20 de octubre de 2013 | Mejore el uso de la memoria, soporte para eventos de selección y composición, soporte para getInitialState y getDefaultProps en mixins, agregada React.version y React.isValidClass, compatibilidad mejorada para Windows. |
0.8.0 | 20 de diciembre de 2013 | Se agregó soporte para filas y columnas, aplazar y asíncrono, bucle para <audio> y <video>, atributos de autocorrección. Se agregaron eventos onContextMenu, herramientas jstransform y esprima-fb mejoradas, browserify actualizado. |
0.9.0 | 20 de febrero de 2014 | Se agregó soporte para crossOrigin, download y hrefLang, mediaGroup y muted, sandbox, seamless y srcDoc, atributos de alcance, Se agregó any, arrayOf, component, oneOfType, renderizable, shape a React.PropTypes, Se agregó soporte para el evento onMouseOver y onMouseOut, Se agregó soporte para onLoad y onError en elementos <img>. |
0.10.0 | 21 de marzo de 2014 | Se agregó soporte para los atributos srcSet y textAnchor, agregue la función de actualización para datos inmutables, asegúrese de que todos los elementos vacíos no inserten una etiqueta de cierre. |
0.11.0 | 17 de julio de 2014 | Soporte SVG mejorado, evento e.view normalizado, comando Update $ apply, soporte agregado para espacios de nombres, nueva API transformWithDetails agregada, incluye paquetes prediseñados bajo dist /, MyComponent () ahora devuelve un descriptor, no una instancia. |
0.12.0 | 21 de noviembre de 2014 | Se agregaron nuevas características Spread operator ({...}) introducido para desaprobar this.transferPropsTo, Se agregó soporte para acceptCharset, classID, atributos HTML de manifiesto, React.addons.batchedUpdates agregado a API, @jsx React.DOM ya no es necesario, Problemas resueltos con transiciones CSS. |
0.13.0 | 10 de marzo de 2015 | Los patrones obsoletos que advirtieron en 0.12 ya no funcionan, el orden de resolución de la referencia ha cambiado, se eliminaron las propiedades this._pendingState y this._rootNodeID, admite clases ES6, API agregada React.findDOMNode (componente), soporte para iteradores y secuencias inmutables-js, agregado nuevo características React.addons.createFragment, React.addons.classSet obsoleto. |
0.14.1 | 29 de octubre de 2015 | Se agregó soporte para srcLang, predeterminado, atributos de tipo y atributo de color, acceso garantizado de .props heredados en los nodos DOM, se corrigió scryRenderedDOMComponentsWithClass, se agregó react-dom.js. |
15.0.0 | 7 de abril de 2016 | El renderizado inicial ahora usa document.createElement en lugar de generar HTML, No más <span> s adicionales, Soporte SVG mejorado, ReactPerf.getLastMeasurements () es opaco, Nuevas deprecaciones introducidas con una advertencia, Se corrigieron múltiples fugas de memoria pequeñas, React DOM ahora admite el cite y perfile atributos HTML y propiedades CSS cssFloat, gridRow y gridColumn. |
15.1.0 | 20 de mayo de 2016 | Corregir un error de procesamiento por lotes, garantizar el uso de la última asignación de objetos, corregir la regresión, eliminar el uso de la utilidad de combinación, renombrar algunos módulos. |
15.2.0 | 1 de julio de 2016 | Incluya información de la pila de componentes, Detenga la validación de accesorios en el momento del montaje, Agregue React.PropTypes.symbol, Agregue el manejo de onLoad a <link> y el manejo de onError al elemento <source>, Agregue la API isRunning (), Corrija la regresión del rendimiento. |
15.3.0 | 30 de julio de 2016 | Agregue React.PureComponent, solucione el problema con la representación del servidor anidado, agregue xmlns, xmlnsXlink para admitir atributos SVG y referrerPolicy a los atributos HTML, actualice el complemento React Perf, problema solucionado con ref. |
15.3.1 | 19 de agosto de 2016 | Mejore el rendimiento de las compilaciones de desarrollo, limpie los enlaces internos, actualice los fbjs, mejore el tiempo de inicio de React, corrija la fuga de memoria en el renderizado del servidor, corrija React Test Renderer, cambie el invariante trackedTouchCount a un error de consola. |
15.4.0 | 16 de noviembre de 2016 | El paquete React y la compilación del navegador ya no incluyen React DOM, rendimiento de desarrollo mejorado, fallas de prueba ocasionales corregidas, actualización de la API batchedUpdates, React Perf y ReactTestRenderer.create (). |
15.4.1 | 23 de noviembre de 2016 | Reestructurar la asignación de variables, manejo de eventos fijo, compatibilidad fija de la construcción del navegador con entornos AMD. |
15.4.2 | 6 de enero de 2017 | Se corrigieron problemas de compilación, se agregaron dependencias de paquetes faltantes, se mejoraron los mensajes de error. |
15.5.0 | 7 de abril de 2017 | Se agregó react-dom / test-utils, se eliminaron peerDependencies, se solucionó el problema con el compilador de cierre, se agregó una advertencia de desaprobación para React.createClass y React.PropTypes, se corrigió el error de Chrome. |
15.5.4 | 11 de abril de 2017 | Corrija la compatibilidad con Enzyme al exponer batchedUpdates en un renderizador superficial, actualice la versión de prop-types, corrija el paquete react-addons-create-fragment para incluir la transformación loose-envify. |
15.6.0 | 13 de junio de 2017 | Agregue soporte para variables CSS en el atributo de estilo y propiedades de estilo de cuadrícula, corrija el soporte de AMD para complementos según reaccione, elimine la dependencia innecesaria, agregue una advertencia de desaprobación para los ayudantes de fábrica React.createClass y React.DOM. |
16.0.0 | 26 de septiembre de 2017 | Manejo de errores mejorado con la introducción de "límites de error", React DOM permite pasar atributos no estándar, cambios menores en el comportamiento de setState, eliminar la compilación de react-with-addons.js, agregar React.createClass como create-react-class, React.PropTypes como prop-tipos, React.DOM como react-dom-fábricas, cambios en el comportamiento de los métodos de programación y ciclo de vida. |
16.1.0 | 9 de noviembre de 2017 | Discontinuar las versiones de Bower, corregir una variable global adicional accidental en las compilaciones de UMD, corregir la activación de onMouseEnter y onMouseLeave, corregir el marcador de posición <textarea>, eliminar el código no utilizado, agregar una dependencia de package.json que falta, agregar soporte para React DevTools. |
16.3.0 | 29 de marzo de 2018 | Agregue una nueva API de contexto oficialmente admitida, agregue un nuevo paquete, evite un bucle infinito al intentar representar portales con SSR, solucione un problema con this.state, solucione un problema de IE / Edge. |
16.3.1 | 3 de abril de 2018 | Prefijar API privada, corregir la regresión de rendimiento y errores de manejo de errores en el modo de desarrollo, agregar dependencia de pares, corregir una advertencia de falso positivo en IE11 al usar Fragmento. |
16.3.2 | 16 de abril de 2018 | Solucione un bloqueo de IE, corrija las etiquetas en las mediciones de tiempo del usuario, agregue una compilación de UMD, mejore el rendimiento de la API de unstable_observedBits con anidamiento. |
16.4.0 | 24 de mayo de 2018 | Agregue soporte para la especificación de eventos de puntero, agregue la capacidad de especificar propTypes, corrija el contexto de lectura, corrija el soporte de getDerivedStateFromProps (), corrija un bloqueo de testInstance.parent, agregue el componente React.unstable_Profiler para medir el rendimiento, cambie los nombres de eventos internos. |
16.5.0 | 5 de septiembre de 2018 | Agregue soporte para React DevTools Profiler, Maneje errores en más casos extremos con elegancia, Agregue react-dom / perfilado, Agregue el evento OnAuxClick para navegadores, Agregue campos MovementX y MovementY a los eventos del mouse, Agregue tangentialPressure y campos de giro al evento del puntero. |
16.6.0 | 23 de octubre de 2018 | Agregue soporte para contextType, soporte de niveles de prioridad, continuaciones y devoluciones de llamada envueltas, mejore el mecanismo de respaldo, corrija la superposición gris en iOS Safari, agregue React.lazy () para componentes de división de código. |
16.7.0 | 20 de diciembre de 2018 | Corrija el rendimiento de React.lazy para los componentes cargados de forma diferida, borre los campos al desmontar para evitar fugas de memoria, corrija el error con SSR, corrija una regresión del rendimiento. |
16.8.0 | 6 de febrero de 2019 | Agregue Hooks, Agregue ReactTestRenderer.act () y ReactTestUtils.act () para las actualizaciones por lotes, Admita thenables síncronos pasados a React.lazy (), Mejore la API de inicialización perezosa de useReducer Hook. |
16.8.6 | 27 de marzo de 2019 | Corregir un rescate incorrecto en useReducer (), Corregir advertencias de iframe en Safari DevTools, Advertir si contextType está configurado como Context.Consumer en lugar de Context, Advertir si contextType está configurado en valores no válidos. |
16.9.0 | 9 de agosto de 2019 | Agregue la API <React.Profiler> para recopilar medidas de rendimiento de manera programática. Eliminar unstable_ConcurrentMode en favor de unstable_createRoot |
16.10.0 | 27 de septiembre de 2019 | Arregle el caso de borde donde no se estaba memorizando una actualización de gancho. Se corrige la heurística para determinar cuándo hidratarse, para no hidratarnos incorrectamente durante una actualización. Borre campos de fibra adicionales durante el desmontaje para ahorrar memoria. Soluciona el error con los campos de texto obligatorios en Firefox. Preferir Object.is en lugar de polyfill en línea, cuando esté disponible. Se corrigió el error al mezclar Suspenso y manejo de errores. |
16.10.1 | 28 de septiembre de 2019 | Corrija la regresión en las aplicaciones Next.js permitiendo que el desajuste de Suspense durante la hidratación continúe silenciosamente |
16.10.2 | 3 de octubre de 2019 | Corrija la regresión en react-native-web restaurando el orden de los argumentos en los extractores de complementos de eventos |
16.11.0 | 22 de octubre de 2019 | Se corrigió que los controladores del mouseenter se dispararan dos veces dentro de los contenedores React anidados. Elimine las API experimentales unstable_createRoot y unstable_createSyncRoot. (Están disponibles en el canal Experimental como createRoot y createSyncRoot). |
16.12.0 | 14 de noviembre de 2019 | React DOM: corrige los efectos pasivos ( useEffect ) que no se disparan en una aplicación de múltiples raíces.React Is: corrige |
16.13.0 | 26 febrero 2020 | Funciones agregadas en el modo React Concurrent. Corrija las regresiones en la biblioteca central de React y React Dom. |
16.13.1 | 19 marzo 2020 | Se corrigió un error en el modo heredado Suspense. Revertir la advertencia para las actualizaciones de componentes cruzados que ocurren dentro de los ciclos de vida de renderizado de clases |
16.14.0 | 14 de octubre de 2020 | Agregue soporte para la nueva transformación JSX. |
17.0.0 | 20 de octubre de 2020 | "Sin nuevas funciones" permite actualizaciones graduales de React de versiones anteriores. Agregar nueva transformación JSX, cambios en la delegación de eventos |
17.0.1 | 22 de octubre de 2020 | React DOM: corrige un bloqueo en IE11 |
El lanzamiento público inicial de React en mayo de 2013 utilizó Apache License 2.0 . En octubre de 2014, React 0.12.0 reemplazó esto con la licencia BSD de 3 cláusulas y agregó un archivo de texto PATENTES separado que permite el uso de cualquier patente de Facebook relacionada con el software: [40]
La licencia otorgada en virtud del presente terminará, automáticamente y sin previo aviso, para cualquier persona que haga cualquier reclamo (incluso mediante la presentación de una demanda, afirmación u otra acción) alegando (a) una infracción directa, indirecta o contributiva o un incentivo para infringir cualquier patente: (i ) por Facebook o cualquiera de sus subsidiarias o afiliadas, ya sea que dicho reclamo esté relacionado o no con el Software, (ii) por cualquier parte si dicho reclamo surge en su totalidad o en parte de cualquier software, producto o servicio de Facebook o cualquiera de sus subsidiarias o afiliadas, ya sea que dicha reclamación esté o no relacionada con el Software, o (iii) por cualquier parte relacionada con el Software; o (b) que cualquier derecho en cualquier reclamo de patente de Facebook es inválido o inaplicable.
Esta cláusula poco convencional provocó cierta controversia y debate en la comunidad de usuarios de React, porque podría interpretarse que faculta a Facebook para revocar la licencia en muchos escenarios, por ejemplo, si Facebook demanda al titular de la licencia y lo impulsa a tomar "otra acción" mediante la publicación de la acción. en un blog o en otro lugar. Muchos expresaron su preocupación de que Facebook podría explotar injustamente la cláusula de rescisión o que la integración de React en un producto podría complicar la futura adquisición de una empresa de nueva creación. [41]
Según los comentarios de la comunidad, Facebook actualizó la concesión de la patente en abril de 2015 para que fuera menos ambigua y más permisiva: [42]
La licencia otorgada a continuación terminará, automáticamente y sin previo aviso, si usted (o cualquiera de sus subsidiarias, afiliadas corporativas o agentes) inicia directa o indirectamente, o tiene un interés financiero directo en, cualquier Afirmación de Patente: (i) contra Facebook o cualquier de sus subsidiarias o afiliadas corporativas, (ii) contra cualquier parte si dicha afirmación de patente surge en su totalidad o en parte de cualquier software, tecnología, producto o servicio de Facebook o cualquiera de sus subsidiarias o afiliadas corporativas, o (iii) contra cualquier parte relacionados con el Software. [...] Una "afirmación de patente" es cualquier demanda u otra acción que alegue una infracción directa, indirecta o contributiva o un incentivo para infringir cualquier patente, incluida una contrademanda o contrademanda. [43]
La Apache Software Foundation consideró que este acuerdo de licencia es incompatible con sus políticas de licencia, ya que "transfiere el riesgo a los consumidores intermedios de nuestro software desequilibrado a favor del licenciante, no al licenciatario, lo que infringe nuestra política legal de Apache de ser un donante universal. "y" no son un subconjunto de los que se encuentran en [Apache License 2.0], y no se pueden sublicenciar como [Apache License 2.0] ". [44] En agosto de 2017, Facebook desestimó las preocupaciones posteriores de la Fundación Apache y se negó a reconsiderar su licencia. [45] [46] Al mes siguiente, WordPress decidió cambiar sus proyectos Gutenberg y Calypso de React. [47]
El 23 de septiembre de 2017, Facebook anunció que la semana siguiente volvería a licenciar Flow, Jest , React e Immutable.js bajo una licencia MIT estándar ; la empresa afirmó que React era "la base de un amplio ecosistema de software de código abierto para la web" y que no querían "frenar el progreso por razones no técnicas". [48]
El 26 de septiembre de 2017, se lanzó React 16.0.0 con la licencia MIT. [49] El cambio de licencia del MIT también se ha actualizado a la línea de lanzamiento 15.x con React 15.6.2. [50]