React- programvare | |
---|---|
Sjanger | Rammeverk for webapplikasjoner |
Utvikler | Meta og fellesskap |
Dato for første versjon | 29. mai 2013 |
Siste versjon | 18.2.0 (14. juni 2022) |
Operativsystem | Multiplattform |
Språk | JavaScript |
Tillatelse | MIT -lisens ( gratis lisens ) |
Nettsted | reactjs.org/ , ar.reactjs.org/ og ru.reactjs.org/ |
React (også kjent som React.js eller ReactJS ) er et åpen kildekode , frontend , JavaScript [1] bibliotek for å bygge brukergrensesnitt . Det vedlikeholdes av Meta (tidligere Facebook) og et fellesskap av individuelle utviklere og selskaper. [2] [3] [4]
React kan brukes som grunnlag i utviklingen av enkeltsideapplikasjoner , men den kan også brukes på mobil gjennom React Native , et bibliotek også utviklet av Meta som transformerer React-komponenter til native komponenter ( iOS og Android ) [5] . Imidlertid er React bare opptatt av å gjengi data på DOM , så å bygge React-applikasjoner krever generelt bruk av ekstra biblioteker for tilstandsadministrasjon og ruting. [6] Redux [7] og React Router [8] er respektive eksempler på slike biblioteker.
Nedenfor er et rudimentært eksempel på bruk av React i HTML med JSX og JavaScript.
< div id = "myReactApp" > </ div > < script type = "tekst / babel" > funksjon Greeter ( rekvisitter ) { return < h1 > { props . hilsen } < / h1> } var App = < Greeter hilsen = "Hello World!" /> ; ReactDOM . render ( App , document . getElementById ( 'myReactApp' )); </ script >Funksjonen Greeterer en React-komponent som aksepterer en egenskap greeting. Variabelen Apper en forekomst av komponenten Greeterhvis egenskap greetinger satt til 'Hello World!'. Metoden ReactDOM.rendergjengir deretter Greeter-komponenten inne i DOM -elementet med id myReactApp.
Sett i en nettleser vil resultatet være:
< div id = "myReactApp" > < h1 > Hei verden! </ h1 > </ div >React-kode er bygd opp av enheter som kalles komponenter. Komponenter kan gjengis på et bestemt element i DOM ved å bruke React DOM-biblioteket. Når du gjengir en komponent, kan du sende verdier kjent som "rekvisitter" [9] :
ReactDOM . render ( < Greeter greeting = "Hello World!" /> , document . getElementById ( 'myReactApp' ));De to hovedmåtene å deklarere komponenter i React er gjennom funksjonelle komponenter og klassebaserte komponenter.
Funksjonelle komponenter er deklarert med en funksjon som deretter returnerer noe JSX.
const Hilsen = ( rekvisitter ) => < div > Hei , { rekvisitter . navn } ! < / div>;Klassebaserte komponenter er deklarert ved bruk av ES6- klasser . De er også kjent som "stateful" komponenter, fordi deres tilstand kan inneholde verdier gjennom hele komponenten og kan sendes til underordnede komponenter via rekvisitter:
klasse ParentComponent utvider React . Komponent { state = { color : 'green' }; render () { return ( < ChildComponent color = { this . state . color } /> ); } }En annen bemerkelsesverdig funksjon er bruken av en virtuell dokumentobjektmodell (DOM). React oppretter en datastrukturbuffer i minnet, beregner de resulterende forskjellene og oppdaterer deretter effektivt DOM-en som vises av nettleseren. [10] Dette lar programmereren skrive kode som om hele siden gjengis ved hver endring, mens React-bibliotekene bare gjengir underkomponenter som faktisk endres.
Livssyklusmetoder er kroker som tillater kodeutførelse på forhåndsbestemte punkter i løpet av en komponents levetid.
JSX, eller JavaScript XML , er en utvidelse av JavaScript-språksyntaksen. [11] I likhet med HTML gir JSX en måte å strukturere komponentgjengivelse ved å bruke en syntaks som er kjent for mange utviklere. React-komponenter er vanligvis skrevet med JSX, selv om de ikke trenger å være det (komponenter kan også skrives i ren JavaScript). JSX ligner på en annen utvidelsessyntaks laget av Facebook for PHP kalt XHP.
Et eksempel på JSX-kode:
klasse App utvider React . Komponent { gjengi () { returnere ( < div > < p > Overskrift < / p> < p > Innhold < / p> < p > Bunntekst < / p> < /div> ); } } Nestede elementerFlere elementer på samme nivå må være innelukket i et enkelt inneholdende element som elementet <div>vist ovenfor eller returneres som en matrise. [12]
AttributterJSX tilbyr en rekke elementattributter designet for å speile de som leveres av HTML. Egendefinerte attributter kan også overføres til komponenten. [13] Alle attributter vil bli mottatt av komponenten som rekvisitter.
JavaScript-uttrykkJavaScript- uttrykk ( men ikke utsagn) kan brukes i JSX med krøllede parenteser {}:
< h1 > { 10 + 1 } < / h1>Eksemplet ovenfor vil se slik ut:
< h1 > 11 </ h1 > Betingede utsagnIf-else-setninger kan ikke brukes i JSX, men betingede uttrykk kan brukes. Følgende eksempel vil vise { i === 1 ? 'true' : 'false' }som en streng 'true'hvorfor iden er lik 1.
klasse App utvider React . Komponent { gjengi () { const i = 1 ; returnere ( < div > < h1 > { i === 1 ? 'true' : 'false' } < / h1> < /div> ); } }Ovennevnte vil gjengi:
< div > < h1 > sant </ h1 > </ div >Funksjoner og JSX kan brukes i betingelser:
klasse App utvider React . Komponent { gjengi () { const seksjoner = [ 1 , 2 , 3 ]; returnere ( < div > { seksjoner . lengde > 0 && seksjoner . kart ( n => ( / * 'nøkkel' brukes av react for å holde styr på listeelementer og deres endringer * / / * Hver 'nøkkel' må være unik * / < div- tast = { "seksjon-" + n } > Seksjon { n } < / div> ))} < /div> ); } }Ovennevnte vil gjengi:
< div > < div > Seksjon 1 </ div > < div > Seksjon 2 </ div > < div > Seksjon 3 </ div > </ div >Kode skrevet i JSX krever konvertering med et verktøy som <i> Babel </i> før den kan forstås av nettlesere. [14] Denne behandlingen gjøres vanligvis under programvarebyggingsprosessen før applikasjonen distribueres .
Kjernearkitekturen til React gjelder i tillegg til HTML-gjengivelse i nettleseren. For eksempel har Facebook dynamisk grafikk som gjengis i tagger <canvas>[15] og Netflix og PayPal bruker universell opplasting for å gjengi identisk HTML på både serveren og klienten. [16] [17]
Hooks, introdusert i versjon 16.8 (februar 2019), er funksjoner som lar utviklere "hekte" til tilstanden til React og livssykluskarakteristikkene til funksjonskomponentene. [18] De gjør koder lesbare og enkle å forstå. Kroker fungerer ikke i klassene: de lar deg bruke React uten klasser. [19]
React har noen innebygde kroker som useState, [20] useContext og useReducer[ useEffect21] for å nevne noen. De er alle oppført i Hooks Reference API Guide. [22] useState og useEffect, som er de mest brukte, er nyttige for å kontrollere henholdsvis tilstandene og bivirkningene i React-komponentene.
Eksempel på bruk useStatei en funksjonell komponent.
const BirthdayComponent = () => { const [ myAge , setMyAge ] = useState ( 16 ); const handleClick = () => setMyAge ( minAlder + 1 ); return ( <> < p > Min faktiske alder er { myAge }. < / p> { myAge > = 18 && < p > ... og nå er jeg voksen < / p >} < button onClick = { handleClick } > Legg til ett år < / button> < /> ); }; Hook RulesDet er også krokerregler [23] som må følges før de kan brukes:
Ved å lage tilpassede kroker [24] kan du trekke ut komponentlogikk til gjenbrukbare funksjoner. En tilpasset hook er en JavaScript-funksjon hvis navn begynner med "bruk" og som kan kalle andre kroker. De generelle reglene for kroker gjelder også for tilpassede.
React har ikke til hensikt å tilby et komplett "applikasjonsbibliotek". Den er designet spesielt for å bygge brukergrensesnitt [1] og inkluderer derfor ikke mange av verktøyene som enkelte utviklere kan finne nødvendige for å bygge en applikasjon. Dette lar deg velge hvilke biblioteker utvikleren foretrekker til å utføre oppgaver som nettverkstilgang eller lokal datalagring. Vanlige bruksmønstre har dukket opp etter hvert som biblioteket har modnet.
For å støtte Reacts konsept med enveis dataflyt (som står i kontrast til AngularJS sin toveisflyt ), er Flux-arkitekturen et alternativ til den populære modell-visningskontroller- arkitekturen . Flux inkluderer handlinger som sendes via en sentral koordinator til en butikk , og endringer i den butikken forplantes til visningen. [25] Når den brukes med React, gjøres denne forplantningen gjennom komponentegenskaper.
Flux kan betraktes som en variant av Observer-mønsteret . [26]
En React-komponent under Flux-arkitekturen skal ikke direkte modifisere noen prop-objekter, men skal sendes til tilbakeringingsfunksjonene som oppretter handlinger sendt av avsenderen for å endre butikken. Handling er et objekt hvis ansvar er å beskrive hva som skjedde: for eksempel kan en handling som beskriver en bruker som "følger" en annen inneholde en bruker-ID, målbruker-ID og type USER_FOLLOWED_ANOTHER_USER. [27] Butikker, som kan betraktes som maler, kan endres som svar på handlinger mottatt av ekspeditøren.
Denne modellen uttrykkes noen ganger som "egenskapene flyter ned, handlinger flyter opp". Mange implementeringer av Flux har blitt laget siden starten, hvorav kanskje den mest kjente er Redux, som har en enkelt butikk, ofte kalt en enkelt kilde til sannhet (SSOT) . [28]
Prosjektstatus kan overvåkes via diskusjonsforumet for kjerneteamet. [29] De viktigste endringene i React går imidlertid gjennom Future of React - repository-problemer og pull-forespørsler . [30] [31] Dette lar React-fellesskapet gi tilbakemelding om potensielle nye funksjoner, eksperimentelle APIer og JavaScript-syntaksforbedringer.
React ble opprettet av Jordan Walke, en Facebook-programvareingeniør, som opprinnelig kalte det "FaxJS". [32] Det ble påvirket av XHP, et HTML -komponentbibliotek for PHP . Den ble først brukt på Facebooks nyhetsstrøm i 2011 og senere på Instagram i 2012. [33] Den ble utgitt for publikum på JSConf US i mai 2013. [34]
React Native, som muliggjør naturlig utvikling av Android , iOS og UWP med React, ble annonsert på Facebooks React Conf i februar 2015 og utgitt i mars 2015.
18. april 2017 annonserte Facebook React Fiber, en ny kjernealgoritme fra React-biblioteket for å bygge brukergrensesnitt . [35] React Fiber ble designet som et grunnlag for eventuelle fremtidige forbedringer og utviklinger av React-biblioteket. [36]
26. september 2017 ble React 16.0 utgitt for offentligheten. [37]
16. februar 2019 ble React 16.8 utgitt for offentligheten. [38] Utgivelsen introduserte kroker. [39]
Versjon | Utgivelsesdato | Endringer |
---|---|---|
0.3.0 | 29. mai 2013 | Første offentlig utgivelse |
0.4.0 | 20. juli 2013 | Støtte for kommentarnode <div> {/ * * /} </div>, API for gjengivelse på serversiden er forbedret, React.autoBind fjernet, støtte for støttenøkler, modulforbedringer, feil fikset. |
0.5.0 | 20. oktober 2013 | Forbedret minnebruk, støtte for valg og komposisjonshendelser, støtte for getInitialState og getDefaultProps i mixins, lagt til React.version og React.isValidClass, forbedret kompatibilitet for Windows. |
0.8.0 | 20. desember 2013 | Lagt til støtte for rader og kolonner, defer og async, loops for <audio> og <video>, autoCorrect-attributter. Lagt til på ContextMenu-hendelser, oppdatert jstransform, esprima-fb og browserify. |
0.9.0 | 20. februar 2014 | Lagt til støtte for crossOrigin, nedlasting og hrefLang, mediaGroup og muted, sandbox, sømløs og srcDoc, omfangsattributter. Lagt til hvilken som helst, arrayOf, component, oneOfType, renderable, shape til React.PropTypes, lagt til støtte for onMouseOver og onMouseOut-hendelser, lagt til støtte for onLoad og onError på <img>-elementer. |
0.10.0 | 21. mars 2014 | Lagt til støtte for srcSet- og textAnchor-attributter, lagt til oppdateringsfunksjon for uforanderlige data, sjekk at den avsluttende taggen er ekskludert fra alle void-elementer. |
0.11.0 | 17. juli 2014 | Forbedret SVG-støtte, normalisert e.view-hendelse, $ application-kommandooppdatering, lagt til støtte for navnerom, lagt til nytt transformWithDetails API, inkluderer forhåndskompilerte pakker under dist /, MyComponent () returnerer nå en deskriptor, i stedet for en forekomst. |
0.12.0 | 21. november 2014 | Nye funksjoner lagt til: Spread-operator ({...}) introdusert for å avvikle this.transferPropsTo. Lagt til støtte for acceptCharset, classID, HTML-manifestattributter, React.addons.batchedUpdate lagt til API, @jsx React.DOM er ikke lenger nødvendig. Rettet problemer med CSS-overganger. |
0.13.0 | 10. mars 2015 | Utdaterte mønstre rapportert i 0.12 som ikke lenger fungerer, løsningsrekkefølgen for refs har endret seg. Fjernet egenskapene for this._pendingState og this._rootNodeID. Støtte for ES6-klasser, lagt til React.findDOMNode API (komponent), støtte for immutable-js-iteratorer og sekvenser, lagt til ny React.addons.createFragment-funksjonalitet, avviklet React.addons.classSet. |
0.14.1 | 29. oktober 2015 | Lagt til støtte for srcLang, standard, typeattributter og fargeattributter, gitt eldre .props-tilgang på DOM-noder, fikset ScryRenderedDOMComponentsWithClass, lagt til react-dom.js. |
15.0.0 | 7. april 2016 | Innledende gjengivelse bruker nå document.createElement i stedet for å generere HTML, Ikke flere <span>-tillegg, forbedret SVG-støtte, ReactPerf.getLastMeasurements () er ugjennomsiktig, nye avskrivninger introdusert med en advarsel, fikset flere små minnelekkasjer, React DOM støtter nå sitatet og profil HTML-attributter og CSS-egenskapene cssFloat, gridRow og gridColumn. |
15.1.0 | 20. mai 2016 | Rettet en batch-feil, tilbudt tilgang til den siste objekttilordningen, fikset regresjon, fjernet bruken av fletteverktøyet, endret navn på noen moduler. |
15.2.0 | 1. juli 2016 | Inkludert komponentstabelinformasjon, fjernet rekvisittvalidering ved monteringstidspunkt, lagt til React.PropTypes.symbol, onLoad-håndtering til <link>, onError-håndtering til <source>-element, API isRunning (), fast ytelsesregresjon. |
15.3.0 | 30. juli 2016 | Lagt til React.PureComponent, fikset nestet servergjengivelsesproblem, lagt til xmlns, xmlnsXlink for å støtte SVG og referrerPolicy-attributter til HTML-attributter, oppdatert React Perf-tillegg, fikset ref. |
15.3.1 | 19. august 2016 | Forbedret byggeytelse for utvikling, opprydding av interne kroker, oppdaterte fbjs, forbedrede React-oppstartstider, fikset minnelekkasje i servergjengivelse, fikset React Test Renderer, invariant trackedTouchCount på console.error. |
15.4.0 | 16. november 2016 | React-pakken og nettleserbygget inkluderer ikke lenger React DOM, forbedret utviklingsytelse, sporadiske testfeil fikset, batchUpdates API-oppdatering, React Perf og ReactTestRenderer.create (). |
15.4.1 | 23. november 2016 | Omstrukturert tildeling av variabler, korrekt håndtering av hendelser, korrekt kompatibilitet av nettleserbygget i AMD-miljøer. |
15.4.2 | 6. januar 2017 | Rettet byggeproblemer, lagt til manglende pakkeavhengigheter, forbedrede feilmeldinger. |
15.5.0 | 7. april 2017 | Lagt til react-dom / test-utils, fjernet peerDependencies, fikset problem med Closure Compiler, lagt til advarsel om avskrivning for React.createClass og React.PropTypes, fikset feil på Chrome. |
15.5.4 | 11. april 2017 | Fikset kompatibilitet med Enzyme som eksponerer batchedUpdates på overflaterenderere, oppdatert prop-type versjon, fast react-addons-create-fragment-pakke for å inkludere loose-envify transformation. |
15.6.0 | 13. juni 2017 | Lagt til støtte for CSS-variabler i Grid-stilattributter og stilegenskaper, fast AMD-støtte for tillegg basert på react, fjernet unødvendig avhengighet, lagt til advarsel om avskrivning for React.createClass og React fabrikkhjelpere. SUN |
16.0.0 | 26. september 2017 | Forbedret feilhåndtering med innføring av "feilgrenser", tillatt passasje til React DOM av ikke-standardattributter, mindre endringer i oppførselen til setState, fjerning av react-con-addons.js, tillegg av React.createClass som create-react -klasse, React.PropTypes som prop-typer, React.DOM som react-dom-fabrikker, endringer i oppførselen til planlegging og livssyklusmetoder. |
16.1.0 | 9. november 2017 | Avbryt Bower-utgivelser, fiks en utilsiktet ekstra global variabel i UMD-bygg, fiks onMouseEnter og onMouseLeave-aktivering, fiks <textarea> plceholder, fjern ubrukt kode, legg til manglende avhengighet av package.json, legg til støtte for React DevTools. |
16.3.0 | 29. mars 2018 | Lagt til en ny offisielt støttet kontekst API, lagt til ny pakke, fikset uendelig sløyfe ved gjengivelse av portaler med SSR, fikset problem med this.state, fikset problem på IE / Edge. |
16.3.1 | 3. april 2018 | Privat API-prefiks, fast ytelsesregresjon og feilhåndtering i utviklingsmodus, lagt til peer-avhengighet, fikset en falsk positiv advarsel på IE11 ved bruk av Fragment. |
16.3.2 | 16. april 2018 | Rettet IE-krasj, fikset etiketter i User Timing-målinger, lagt til UMD-bygg, forbedret unstable_observedBits API-ytelse med nesting. |
16.4.0 | 24. mai 2018 | Lagt til støtte for Pointer Events-spesifikasjon, lagt til mulighet til å spesifisere propTypes, korrigert lesekontekst, fast støtte for getDerivedStateFromProps (), fikset crash testInstance.parent, lagt til React.unstable_Profiler-komponent for å måle ytelse, endret navn på interne hendelser. |
16.5.0 | 5. september 2018 | Lagt til støtte for React DevTools Profiler, diskret feilhåndtering i flere edge-tilfeller, lagt til react-dom / profilering, legg til AuxClick-hendelse for nettleser, lagt til motionX- og motionY-felt til musehendelser, lagt til tangentalPressure- og rotasjonsfelt til pekerhendelsen. |
16.6.0 | 23. oktober 2018 | Lagt til støtte for contextType, støtte for innebygde prioritetsnivåer, fortsettelser og tilbakeringinger, forbedret fallback-mekanisme, fast grå overlegg på iOS Safari, lagt til React.lazy () for kodedelingskomponenter. |
16.7.0 | 20. desember 2018 | Rettet React.lazy-ytelse for lazy-lastede komponenter, fjernet felt ved avmontering for å unngå minnelekkasjer, fikset feil i SSR, fikset ytelsesregresjon. |
16.8.0 | 6. februar 2019 | Lagt til kroker, lagt til ReactTestRenderer.act () og ReactTestUtils.act () for batchoppdateringer, støtte for synkrone elementer sendt til React.lazy (), forbedret lazy useReducer hook initialization API. |
16.8.6 | 27. mars 2019 | Rettet feil lagring i useReducer (), fikset iframe-advarsler i Safari DevTools, advarsel om å sette contextType til Context.Consumer i stedet for Context, advarsel om å sette contextType til ugyldige verdier. |
16.9.0 | 9. august 2019 | Lagt til <React.Profiler> API for planlagt innsamling av ytelsesmålinger. fjernet unstable_ConcurrentMode til fordel for unstable_createRoot |
16.10.0 | 27. september 2019 | Rettet grensetilfelle der en hook-oppdatering ikke ble lagret. heuristisk løsning for å bestemme når den skal hydreres, for ikke å starte den feilaktig under en oppdatering. Fjernet ekstra fiberfelt under avmontering for å spare minne. Feilretting på obligatoriske tekstfelt i Firefox. Object.is-preferanse i stedet for inline polyfill, hvis tilgjengelig. Feilretting ved sammenslåing av suspense og feilhåndtering. |
16.10.1 | 28. september 2019 | Rettet regresjon i Next.js-apper som tillater Suspense-mismatch under hydrat for stille prosedyre |
16.10.2 | 3. oktober 2019 | Rettet regresjon i react-native-web ved å gjenopprette rekkefølgen på argumenter i hendelsesplugin-uttrekkere |
16.11.0 | 22. oktober 2019 | Rettet dobbeltkasting av museinntaster-behandlere inne i nestede React-beholdere. Fjernet unstable_createRoot og unstable_createSyncRoot eksperimentelle APIer. (Disse er tilgjengelige i den eksperimentelle kanalen som createRoot og createSyncRoot.) |
16.12.0 | 14. november 2019 | React DOM - Faste passive effekter (useEffect) ikke aktivert i multi-root app.
React Is - Fikset lat- og memotyper som anses som elementer i stedet for komponenter |
16.13.0 | 26. februar 2020 | Funksjoner lagt til i React Concurrent-modus. Faste regresjoner i hovedbiblioteket til React og React Dom. |
Den første offentlige utgivelsen av React i mai 2013 brukte Apache 2.0-lisensen . I oktober 2014 erstattet React 0.12.0 den med BSD 3-klausul lisensen og la til en separat PATENTS tekstfil som ga samtykke til å bruke Facebook-patenter relatert til programvaren: [40]
Lisensen som er gitt heri vil avsluttes, automatisk og uten varsel, for alle som fremsetter krav (inkludert innlevering av rettslige skritt, påstander eller andre handlinger) knyttet til (a) krenkelse eller direkte, indirekte eller medvirkende tilskyndelse til å krenke et patent: (i ) av Facebook eller noen av dets datterselskaper eller tilknyttede selskaper, uavhengig av om en slik klage er relatert til programvaren eller ikke, (ii) av en part dersom en slik klage oppstår helt eller delvis fra programvare, produkt eller tjeneste fra Facebook eller av dets datterselskaper eller tilknyttede selskaper, uavhengig av om et slikt krav er relatert til programvaren eller (iii) noen part relatert til programvaren; eller (b) at enhver rettighet i et Facebook-patentkrav er ugyldig eller ikke kan håndheves.
Denne ukonvensjonelle klausulen har forårsaket en del kontroverser og debatt i React-brukerfellesskapet, fordi den kan tolkes slik at Facebook kan tilbakekalle lisensen i mange scenarier, for eksempel hvis Facebook saksøker lisensinnehaveren ved å presse på for å ta "andre handlinger" ved å legge ut lisensen handling på en blogg eller andre steder. Mange har uttrykt bekymring for at Facebook kan utnytte oppsigelsesklausulen urettferdig eller at integrering av React i et produkt kan komplisere det fremtidige oppkjøpet av et oppstartsselskap. [41]
Basert på tilbakemeldinger fra samfunnet, oppdaterte Facebook patentbevilgningen i april 2015 for å gjøre den mindre tvetydig og mer ettergivende: [42]
Lisensen som gis deretter vil opphøre, automatisk og uten varsel, hvis du (eller noen av dine datterselskaper, tilknyttede selskaper eller bedriftsagenter) direkte eller indirekte initierer eller tar en direkte økonomisk interesse i en patenterklæring: (i) mot Facebook eller noen av dets datterselskaper eller tilknyttede selskaper, (ii) mot en part dersom slik patenterklæring helt eller delvis stammer fra programvare, teknologi, produkter eller tjenester fra Facebook eller noen av dets datterselskaper eller tilknyttede selskaper, eller (iii) mot noen del relatert til programvaren. [...] En "Patenterklæring" er enhver rettslig handling eller annen handling relatert til direkte, indirekte eller medvirkende krenkelse eller oppfordring til å krenke et patent, inkludert et krav eller motkrav. [43]
Apache Software Foundation har funnet denne lisensavtalen uforenlig med lisensieringsretningslinjene, siden den "overfører risikoen til forbrukere nedstrøms for vår partiske programvare til fordel for lisensgiveren, ikke lisensinnehaveren, og dermed bryter vår juridiske Apache-policy. å være en universell giver "og" er ikke en undergruppe av de i [Apache 2.0 License] og kan ikke lisensieres som [Apache 2.0 License] ". [44] I august 2017 avviste Facebook Apache Foundations bekymringer nedstrøms og nektet å revurdere lisensen deres. [45] [46] Den påfølgende måneden bestemte WordPress seg for å rekonfigurere Gutenberg- og Calypso-prosjektene sine utenfor React. [47]
23. september 2017 kunngjorde Facebook at de ville lisensiere Flow, Jest, React og Immutable.js på nytt med en standard MIT-lisens uken etter ; selskapet hevdet at React var "grunnlaget for et enormt økosystem av åpen kildekode-programvare for nettet" og at de ikke ønsket å "holde tilbake fremgang av ikke-tekniske årsaker." [48]
26. september 2017 ble React 16.0.0 utgitt under MIT-lisensen. [49] Overgangen til MIT-lisensen er også inkludert i 15.x-utgivelseslinjen med React 15.6.2. [50]