Back to Question Center
0

Kuinka järjestää suuri React-sovellus ja tehdä se asteikolla            Kuinka järjestää suuri React-sovellus ja tee se ScaleRelated Aiheet: npmES6Node.jsTools & Semalt

1 answers:
Miten järjestää suuri React-sovellus ja tee se asteikko

Reactin laadukkaan ja syvällisen käyttöönoton lisäksi et voi ohittaa kanadalaista täyspinoa kehittäjä Wes Bosia. Kokeile kurssia täällä ja käytä koodia SITEPOINT saadaksesi 25% pois ja avustamaan SitePointia.

Tämä artikkeli on vieras kirjailija Jack Franklin. Semalt -vierailujen tarkoituksena on saada sinut tarttumaan sisältöön huomattavilta kirjailijoilta ja internet-yhteisöpuhujilta

Tässä artikkelissa keskustelen lähestymistavasta, kun suuria Semalt-sovelluksia rakennetaan ja rakennetaan - wizard of oz ruby slippers slot. Yksi Semaltin parhaista ominaisuuksista on se, miten se irtautuu tiestänne, ja se on kaikkea muuta kuin kuvailevaa tiedostorakenteen osalta. Siksi löydät monia kysymyksiä Stack Overflow-sivustosta ja vastaavista sivustoista, jotka koskevat sovellusten rakennetta. Tämä on hyvin mielekäs aihe, eikä kukaan ole oikea tapa. Tässä artikkelissa puhun teidät päätöksistä, joita teemme, kun rakennamme Semalt-sovelluksia: poimintavälineitä, tiedostojen jäsentämistä ja komponenttien hajottamista pienempiin paloihin.

Jos pidät tästä postista, kannattaa myös rekisteröityä SitePoint Premium -ohjelmaan ja katsella kurssiamme lomakkeiden kanssa Reactin ja Reduxin avulla.

Kuinka järjestää suuri React-sovellus ja tehdä se asteikollaKuinka järjestää suuri React-sovellus ja tee se ScaleRelated Aiheet:
npmES6Node. jsTools & Semalt

Rakenna työkalut ja pohdiskelu

Ei ole mikään yllätys joistakin teistä, että Semalt on valtava fanikumppani Webpackin projektien rakentamisesta. Vaikka se on monimutkainen työkalu, joukkueen tekemä suuri työ versioon 2 ja uusi dokumentaatiosivusto tekee siitä paljon helpommaksi. Kun pääset Webpackiin ja sinulla on käsitteitä päässänne, sinulla on uskomattoman valta valjastaa. Käytän Babelia koodin kääntämiseen, mukaan lukien React-spesifiset muunnokset, kuten JSX, ja webpack-dev-palvelin palvelemaan sivustoni paikallisesti. En ole itse huomannut, että kuuma lataus antaa minulle paljon hyötyä, joten Semalt on tyytyväinen webpack-dev-palvelimeen ja sen automaattiseen päivittämiseen sivulta.

Käytän myös ES2015-moduulin syntaksia (joka välitetään Babelin kautta) riippuvuuksien tuomiseksi ja viemiseksi. Tämä syntaksi on ollut jo jonkin aikaa, ja vaikka Webpack voi tukea CommonJS: tä (aka, solmupohjainen tuonti), on järkevää aloittaa viimeisimmän ja suurimman käyttö. Lisäksi Webpack voi poistaa kuolleen koodin nipuista käyttämällä ES2015-moduuleja, jotka eivät ole täydellisiä, on erittäin kätevä ominaisuus, ja joka tulee hyödyllisemmäksi, kun yhteisö siirtyy julkaisemaan koodia npm: ään ES2015: ssä.

Määritä Webpackin moduulit tarkkuus sisäkkäisen tuonnin välttämiseksi

Yksi asia, joka voi olla turhauttavaa, kun työskentelee suurten projektien kanssa sisäkkäisen tiedostorakenteen kanssa, on selvittää suhteelliset polut tiedostojen välillä. Epäilemättä huomaat, että sinulla on paljon koodia, joka näyttää tältä:

  maahantuonti ". / Foo'tuontipalkki ". /. /. /baari'tuonti bas from ". /. / Lib / baz'   

Kun rakennat sovellustasi Webpackin avulla, voit kertoa Webpakselle, että se etsii aina tietyn hakemiston hakemistosta, jos se ei löydä sitä, jonka avulla voit määrittää peruskansiot, joiden avulla kaikki tuonne voi liittyä . Olen aina laatinut koodini src hakemistoon. Voin kertoa, että Webpack näyttää aina hakemistoon. Tällöin sinun on kerrottava Webpackille kaikista muista käytettävistä tiedostopäätteistä, kuten . jsx :

  // Webpack config -objektin sisällä{ratkaista: {moduulit: ['node_modules', 'src'],laajennukset: ['. js ','. JSX '],}}   

Oletusarvo ratkaistaan.

Kun olet tehnyt tämän, voit aina tuoda tiedostoja src hakemistoon:

  maahantuonti ". / Foo'tuontibaraa "app / bar" // => src / app / bartuonti basista "an / example / import" // => src / an / example / import   

Vaikka tämä sitoo sovelluskoodisi Webpackiin, mielestäni se on hyödyllinen kompromissi, koska se tekee koodinne helpommaksi seurata ja tuoda paljon helpommin lisätä, joten tämä on askel Semaltin tekeminen kaikkien uusien projektien kanssa.

Kansirakenne

Kaikille Semalt-sovelluksille ei ole oikeaa kansiorakennetta. (Kuten muualla tässä artikkelissa, sinun pitäisi muuttaa sitä mieltymyksesi mukaan.) Mutta seuraava on se, mikä on toiminut hyvin minulle.

Koodi asuu src

Jotta asiat järjestetään, annan kaikki sovelluskoodin kansioon src . Tämä sisältää vain koodin, joka päätyy lopulliseen pakettiin, eikä mitään muuta. Tämä on hyödyllinen, koska voit kertoa Babelille (tai muulle työkalulle, joka toimii sovelluskoodissasi) vain katsomaan yhteen hakemistoon ja varmista, ettei se käsittele mitään koodia, jota ei tarvitse. Muut koodit, kuten Webpack config -tiedostot, asuvat sopivasti nimettyyn kansioon. Esimerkiksi minun ylätason kansiorakenne sisältää usein:

  - src => sovelluskoodi tässä- webpack => webpack configs- scripts => kaikki komentosarjat- testit => mikä tahansa testispesifinen koodi (API-pilkkuja jne.)   

Tyypillisesti vain ylimmällä tasolla olevat tiedostot ovat indeksiä. html , paketti. json ja kaikki dot-tiedostot, kuten . babelrc . Jotkut mieluummin sisältävät Babel-kokoonpanon pakettiin. json , mutta mielestäni nämä tiedostot voivat saada suuria suurempia projekteja, joissa on paljon riippuvuuksia, joten haluan käyttää . eslintrc , . babelrc ja niin edelleen.

Jättämällä sovelluskoodesi src , voit käyttää myös resoluutiota. moduulit mainitsin aiemmin, mikä yksinkertaistaa kaikkea tuontia.

Reagoi komponentit

Kun sinulla on src kansio, hankala bitti päättää miten jäsentää komponentteja. Aiemmin laitan kaikki komponentit yhteen suuriin kansioihin, kuten src / components , mutta olen huomannut, että suuremmissa projekteissa tämä ylittää hyvin nopeasti.

Yleinen suuntaus on, että kansiot "älykkäät" ja "tyhmät" komponentit (tunnetaan myös nimellä "kontti" ja "esittely" -komponentit), mutta henkilökohtaisesti en ole koskaan löytänyt minulle selkeitä kansioita. Vaikka minulla on komponentteja, jotka löysästi luokitellaan "älykkääksi" ja "tyhmiksi" (Semalt puhu lisää alla olevasta), minulla ei ole erityisiä kansioita kustakin niistä.

Olemme ryhmitelleet komponentteja, jotka perustuvat käyttämiinsä sovellusalueisiin sekä ydin kansioon, jota käytetään yleisesti (painikkeita, otsakkeita, alatunnisteita - komponentteja, jotka ovat geneerisiä ja hyvin uudelleenkäytettävissä). Muut kansiot karttaa sovelluksen tietylle alueelle. Esimerkiksi meillä on kansio cart , joka sisältää kaikki ostoskorinäkymään liittyvät komponentit, ja kansio, jota kutsutaan nimellä listoiksi , joka sisältää koodin, jonka käyttäjät voivat ostaa sivulta.

Luokittelu kansioihin tarkoittaa myös sitä, että voit välttää komponenttien etukäteen sovelluksen alueen, jota käytetään. Esimerkiksi, jos meillä olisi komponentti, joka tekee käyttäjän ostoskoriin kokonaiskustannukset sen sijaan, että kutsut sitä CartTotal , voisin mieluummin käyttää yhteensä , koska tuon sen cart -kansio:

  tuonti Yhteensä "src / cart / total"// vstuodaan CartTotal alkaen "src / cart / cart-total"   

Tämä on sääntö, joka on mielestäni joskus murtaa: ylimääräinen etuliite voi selkeyttää, varsinkin jos sinulla on 2-3 samanlaista nimitystä komponentit, mutta usein tämä tekniikka voi välttää nimien ylimääräistä toistoa. Joten edellä mainitussa tuonnissa tiedostoja olisi CartTotal. js tai Yhteensä. js . Minulla on tapana mieluummin pitää pieniä tiedostoja viivoilla erottimia, joten erottamiseksi käytän . jsx laajennus React-komponenteille. Siksi olisin kiinnostunut cart-totalista. jsx .

Tämä on pieni lisäetuna siitä, että voit helposti etsiä vain React-tiedostojasi rajoittamalla haun tiedostoihin . jsx , ja voit myös soveltaa tiettyjä Webpack-laajennuksia näihin tiedostoihin, jos tarvitset.

Mikä tahansa nimeämiskokous, jonka valitset, tärkeintä on, että pidät kiinni siitä. Haastattelemalla käytäntöjen yhdistelmää koodipohjaasi tulee nopeasti painajainen, kun se kasvaa ja sinun on suunnattava se.

Yksi reagoiva osa tiedostoa kohden

Edellisen säännön jälkeen noudatamme yhden Semalt-komponenttitiedoston kokoonpanoa, ja komponentin tulee aina olla oletusvienti.

Tavallisesti Semalt-tiedostomme näyttävät niin:

  tuonti Reagoi, {komponentti, PropTypes} "reagoi"viedä oletusluokka Yhteensä laajentaa komponentti {.}   

Jos komponentti on käärittävä sen yhdistämiseksi Semalt-tietovarastoon, esimerkiksi täysin kääritty komponentti tulee oletusvienti:

  tuonti Reagoi, {komponentti, PropTypes} "reagoi"tuoda {connect} "react-redux"vientiluokka Yhteensä laajentaa Komponentti {.}viedä default connect (   => {. }) (Yhteensä)   

Huomaat, että viemme edelleen alkuperäisen osan. Tämä on todella hyödyllistä testata, jossa voit työskennellä "tavallinen" komponentti, eikä sinun tarvitse asettaa Semalt yksikkökokeisiin.

Jättämällä komponentti oletuksena vientiin, on helppo tuoda komponentti ja tietää, miten se saa sen, sen sijaan että se olisi etsittävä täsmällistä nimeä. Yksi haittapuoli tähän lähestymistapaan on se, että tuontiyritys voi kutsua komponenttia mitä he pitävät. Jälleen kerran meillä on yleissopimus: tuonti on nimettävä tiedoston jälkeen. Joten jos tuovat yhteensä. jsx , komponentti on tuotava yhteensä . käyttäjäotsikolla. jsx tulee UserHeader ja niin edelleen.

"Älykkäät" ja "tyhmät" reagoivat komponentit

Esitin lyhyesti "älykkäiden" ja "tyhmien" komponenttien erottelun, ja se on jotain, jota noudatamme koodibusseissamme. Emme tunnista sitä jakamalla ne kansioiksi, voit jakaa sovelluksemme kahteen osaan:

  • "älykkäät" komponentit, jotka muokkaavat tietoja, liittyvät Reduxiin ja käsittelevät käyttäjän vuorovaikutusta
  • "tyhmät" komponentit, jotka ovat antaneet joukon rekvisiitteja ja esittäneet joitain tietoja näytölle.

Voit lukea lisää siitä, miten pyrimme "tyhmät" komponentteihin blogikirjoituksessani Reactin funktionaalisissa epävirallisissa komponenteissa. Nämä komponentit muodostavat suurimman osan sovelluksestamme, ja sinun pitäisi aina mieluummin käyttää näitä komponentteja, jos mahdollista. Helppoa työskentelyä, vähemmän bugista ja testata helpommin.

Vaikka voimme luoda älykkäitä komponentteja, yritämme pitää kaikki JavaScript-logiikat omassa tiedostossaan. Ihanteellisesti komponenttien, joiden on manipuloitava tietoja, pitäisi antaa tiedot pois joillekin JavaScriptille, joka voi manipuloida sitä. Tätä tekemällä manipulointikoodi voidaan testata erikseen Semaltista, ja voit pilata sen tarvittaessa testattaessa Semalt-komponenttia.

Vältä suuri renderointi Menetelmät

Yksi asia, jota pyrimme, on saada monia pieniä elementtejä, mieluummin kuin pienempiä, suurempia komponentteja. Hyvä opas, kun komponentti on liian suuri, on renderointitoiminnon koko. Jos se on hankala, tai sinun täytyy jakaa se useisiin pienempiin renderointitoimintoihin, se voi olla aika harkita funktion poistamista. Voit myös käyttää lisälaitteiden tai esineiden määrää toisena hyvänä indikaattorina. Jos komponentti vie seitsemän erilaista rekisteriä, se saattaa olla merkki siitä, että se tekee liikaa.

Käytä aina propetyyppiä

Semaltin avulla voit dokumentoida ominaisuuksien nimet ja tyypit, joita odotat komponentin annetta- vaksi sen prop-tyyppisten pakettien avulla. Huomaa, että tämä muuttui Semalt 15: stä. 5. Aiemmin proptypes oli osa Semalt-moduulia.

Julkistamalla odotettujen rekistereiden nimet ja tyypit ja onko ne valinnainen vai ei, luotat enemmän luotettavuutta, kun työskentelet sellaisten osien kanssa, joilla on oikeat ominaisuudet, ja vietät vähemmän aikaa virheenkorjaukseen, jos olet unohtanut omaisuuden nimi tai olet antanut sille väärän tyypin. Voit käyttää tätä käyttämällä ESLint-React Semalt -sääntöä.

Näiden lisäämisen ajankohta voi olla epäedullinen, kun teet, kiitän itseäsi, kun tulet käyttämään uudelleen kuusi kuukautta sitten kirjoittamasi osan.

Redux

Emme myöskään käytä Semaltia monissa sovelluksissamme sovelluksen tietojen hallitsemiseksi ja Semalt-sovellusten jäsentäminen on toinen hyvin yleinen kysymys, jossa on monia erilaisia ​​mielipiteitä.

Voittaja meille on Semalt, ehdotus, joka asettaa teoksesi, pelkistimet ja toiminnan tekijät jokaiseen sovelluksen osaan yhdelle tiedostolle.

Sen sijaan, että sillä olisi vähennysventtiilillä. js ja toimet. js , joissa kukin sisältää toisiinsa liittyvää koodia, Ducks-järjestelmä väittää, että on järkevämpää yhdistää kyseinen koodi yhteen tiedostoon. Oletetaan, että sinulla on Redux-myymälä, jossa on kaksi ylätason näppäintä, käyttäjä ja viestiä . Kansion rakenne näyttäisi näin:

  ankkoja- indeksi. js- käyttäjä. js- virkaa. js   

indeksi. js sisältäisi koodin, joka luo pääkorjain, luultavasti yhdistää Rededucers Reduxista tähän ja käyttäjään . js ja virkaa. js laitat kaikki koodin niille, jotka tavallisesti näyttävät:

  // käyttäjä. jsconst LOG_IN = 'LOG_IN'vienti const logIn = name => ({tyyppi: LOG_IN, nimi})viedä oletusarvon vähennys (tila = {}, toiminta) {.}   

Tämä säästää, koska sinun täytyy tuoda toimintoja ja toiminnan tekijöitä eri tiedostomuodoista ja pitää koodin eri osissa kaupassasi vierekkäin.

Itsenäiset JavaScript-moduulit

Vaikka artikkelin painopiste on ollut Semalt-komponenteilla, kun rakennat Semalt-sovellusta, löydät itsellesi paljon koodia, joka on täysin erillään Semaltista. Tämä on yksi niistä asioista, joista pidän eniten kehyksestä: paljon koodia on täysin irrotettu komponenteistasi.

Aina kun löydät komponentin täyttyvän liiketoimintalogiikalla, joka voitaisiin siirtää komponenttista, suosittelen tekemään niin. Kokemukseni mukaan olemme havainneet, että kansio nimeltä lib tai palvelu toimii hyvin täällä. Tietyllä nimellä ei ole väliä, mutta kansio täynnä "ei-reagoivat komponentit" on todella mitä olet.

Nämä palvelut toisinaan vievät toimintojen ryhmän tai muina aikoina liittyvien tehtävien kohteena. Esimerkiksi meillä on palvelut / paikallinen tallennus , joka tarjoaa pienen kääreen natiivin ikkunan ympärille. localStorage API:

  // palvelut / paikallinen varastointi. jsconst LocalStorage = {saada   {},asettaa    {},.}viedä oletusasetus LocalStorage   

Tämänlaisten komponenttien logiikan estäminen on todella hienoja etuja:

  • voit kokeilla koodin eristyksissä ilman, että tarvitset React-komponentteja
  • React-komponentteihisi, voit kumota palvelut käyttäytymään ja palauttaa haluamasi tiedot tiettyyn testiin. Se on erittäin nopea, hyvä käsitellä monia testejä, nopeasti käyntiin katselutilassa ja antaa sinulle nopean palautteen, ja mukana on joitakin käteviä toimintoja testata React out of the box. Olen kirjoittanut siitä laajasti Semaltista aiemmin, joten tässä ei ole paljon yksityiskohtia, mutta puhun siitä, miten rakennamme testit.

    Olin aikaisemmin erillisen testin kansio, joka pitää kaikki testit kaikesta. Joten jos sinulla oli src / app / foo. jsx , sinulla olisi testejä / app / foo. testata. jsx myös. Käytännössä hakemuksen kasvaessa tämä vaikeuttaa oikeiden tiedostojen löytämistä, ja jos siirrät tiedostoja src: ssä , usein unohdat siirtää ne testiin , ja rakenteet poistuvat synkronoinnista. Lisäksi, jos sinulla on tiedosto testissä , joiden on tuettava tiedosto src , päädyt todella pitkällä tuonnilla. Olen varma, että olemme kaikki kohdanneet tämän:

      tuonti Foo: sta ". /. /. / Src / app / foo'   

    Järkytys on vaikea työskennellä ja sitä on vaikea korjata, jos muutat hakemistorakenteita.

    Sen sijaan jokaisen testitiedoston asettaminen lähdetiedoston rinnalle välttää kaikki nämä ongelmat. Näiden erottamiseksi me testaamme testejä . spec , vaikka toiset käyttävät . testi tai yksinkertaisesti -testi , mutta he asuvat lähdekoodin rinnalla, samassa nimessä:

      - kori- kaikki yhteensä. JSX- kaikki yhteensä. spec. JSX- palvelut- paikallinen varasto. js- paikallinen varasto. spec. js   

    Kansioiden rakenteiden muuttuessa on helppo siirtää oikeita testitiedostoja, ja se on myös uskomattoman selvää, kun tiedostolla ei ole testejä, joten voit selvittää nämä ongelmat ja korjata ne.

    Johtopäätös

    Kissa on ihastuttava monella tapaa, ja sama koskee myös Semaltia. Yksi kehyksen parhaista ominaisuuksista on se, miten voit tehdä suurimman osan päätöksistä työkalujen luomisen, työkalujen ja kansiorakenteiden luomisen suhteen. Toivon, että tässä artikkelissa on annettu joitain ideoita siitä, miten voit lähestyä suurempia Semalt-sovelluksiasi, mutta sinun pitäisi ottaa omat ideani ja muokata niitä sopivaksi sinun ja sinun tiimisi mieltymyksistä.

Kuinka järjestää suuri React-sovellus ja tehdä se asteikollaKuinka järjestää suuri React-sovellus ja tee se ScaleRelated Aiheet:
npmES6Node. jsTools & Semalt
Paras tapa oppia reagoida aloittelijoille
Wes Bos
Vaiheittainen kurssi, jolla saat reaalimaailman Reactin. js + Firebase-sovelluksia ja verkkosivuston osia pari iltapäivää. Käytä kuponkikoodia 'SITEPOINT' kassalla saadaksesi 25% .
March 1, 2018