Back to Question Center
0

Reaktista Universal Blog -sovelluksen rakentaminen: Fluxin toteutus            Reaktista Universal Blog-sovelluksen rakentaminen: FluxRelated Semalt: jQueryReactNode.jsnpmAjaxMore ... Sponsorit

1 answers:
Reakti Universal Blog -sovelluksen rakentaminen: Fluxin toteutus

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än minisarjojen ensimmäisessä osassa aloimme kaivaa Reactin maailmaan nähdäksemme, kuinka voisimme käyttää sitä yhdessä solmun kanssa. js, rakentaa React Universal Blog App.

Tässä toisessa ja viimeisessä osassa siirrämme blogimme seuraavalle tasolle oppimalla sisältöä lisäämällä ja muokkaamalla. Saat myös todellisen lihan React Universal Blog App: n helppokäyttöisyyksien avulla käyttäen React-organisaation käsitteitä ja Flux-mallia .

Building a React Universal Blog App: Implementing FluxBuilding a React Universal Blog App: Implementing FluxRelated Semalt:
jQueryReactNode.jsnpmAjaxMore. Sponsors

Break It Down minulle

Kun lisäämme lisää sivuja ja sisältöä blogiimme, reittejä. js -tiedosto tulee nopeasti isoiksi. Koska se on yksi Reactin johtavista periaatteista hajottaa asioita pienemmiksi, hallittaviksi kappaleiksi, poista reitit eri tiedostoiksi.

Avaa reittiäsi. js tiedosto ja muokkaa sitä niin, että sillä on seuraava koodi:

     // reitit. jstuonti Reagoi "reagoi"tuoda {Reitti, IndexRoute} reititysreitittimestä// Säilytätuoda AppStorea ". / Kaupat / AppStore'// Pääkomponenttituoda App from '. / Komponentit / App'// Sivuttuoda Blogista '. / Komponentit / Pages / blogi'tuonti Oletuksena ". / Komponentit / Pages / Oletus'tuoda työtä ". / Komponentit / Pages / Work'tuota NoMatch from ". / Komponentit / Pages / NoMatch'viedä oletus (                  )    

Olemme lisänneet muutamia sivuja blogiimme ja vähentäneet huomattavasti reittiemme kokoa. js tiedostoa rikkoen sivut ylös erillisiin osiin. Huomaa lisäksi, että olemme lisänneet Storeen myös AppStore , joka on erittäin tärkeä seuraaville vaiheille React-sovelluksen skaalaamiseksi.

Kauppa: totuuden yhdestä lähteestä

Kauppa on erittäin tärkeä kappale Flux-mallissa, koska se toimii yhtenäisen totuuden lähteenä tiedonhallinnassa. Tämä on ratkaiseva käsitys siitä, miten React-kehitys toimii, ja yksi Reactin myydyistä eduista. Tämän kurinalaisuuden kauneus on, että sovelluksen missä tahansa tilanteessa voimme tutustua AppStore : n tietoihin ja tietää tarkalleen, mitä sen sisällä tapahtuu. Muistettava muutamia tärkeitä asioita, jos haluat rakentaa datapohjaisen React-sovelluksen:

  1. Emme koskaan manipuloisi DOM: ia suoraan.
  2. Meidän käyttöliittymätamme vastaavat tiedot ja tiedot elävät myymälässä
  3. Jos meidän on muutettava käyttöliittymäämme, voimme mennä kauppaan ja myymälä luo sovelluksemme uuden datatilan.
  4. Uusia tietoja syötetään korkeamman tason komponentteihin, ja ne kulkeutuvat sitten alempaan tason komponentteihin rekisterin avulla, joka muodostaa uuden UI: n uuden vastaanotetun datan perusteella.

Näillä neljällä kohdalla meillä on periaatteessa perusta yhdensuuntaiselle tietovirtaukselle . Tämä tarkoittaa myös sitä, että missä tahansa hakemuksessamme, voimme konsolista. log (AppStore. data) , ja jos rakennamme sovelluksemme oikein, tiedämme tarkalleen, mitä voimme odottaa. Koet kuinka tehokas tämä on myös virheenkorjausta varten.

Luomme nyt myymäläkansio nimeltä myymälöitä . Sisällä, luo tiedosto nimeltä AppStore. jstuoda {EventEmitter} tapahtumastatuonti _viedä oletusarvo _. laajenna ({}, EventEmitter prototyyppi, {// Alkuperäiset tiedottiedot: {valmis: väärä,globaalit: {},sivut: [],item_num: 5},// Emit muutos tapahtumaemitChange: toiminto {Tämä. päästävät ( 'muutos')},// Lisää muutos kuuntelijaaddChangeListener: toiminto (soittopyyntö) {Tämä. (muutos, soittopyyntö)},// Poista muutos kuuntelijaremoveChangeListener: toiminto (soittopyyntö) {Tämä. removeListener ('change', soittopyyntö)}})

Näet, että olemme liittäneet tapahtuman emitterin. Tämä antaa meille mahdollisuuden muokata myymälämme olevia tietoja ja lähettää sovelluksemme uudelleen AppStore-ohjelmalla. emitChange . Tämä on tehokas työkalu, jota tulisi käyttää vain tietyissä sovellusalueissa. Muussa tapauksessa voi olla vaikea ymmärtää, mistä AppStore -tietoa muutetaan, mikä johtaa meihin seuraavaan kohtaan .

Reagoi komponentit: korkeampi ja matalampi

Dan Semalt kirjoitti hienon viestin älykkäiden ja tyhmien osien käsitteestä. Ajatuksena on pitää tiedot muokkaavissa toimissa vain korkeamman tason (älykkäillä) komponentteilla, kun taas alemman tason (tyhmät) komponentit ottavat tiedot, joita heille annetaan rekrytoinneilla ja jotka antavat käyttöliittymän perustuen kyseisiin tietoihin. Aina kun alemman tason komponenttia suoritetaan, tapahtuma siirretään rekrytoinneilla korkeamman tason komponentteihin, jotta se voidaan käsitellä toiminnoksi. Sitten se jakaa tiedot uudelleen (yksisuuntainen tietovirta) takaisin sovelluksen kautta.

Sanoi, että aloittakaamme joitakin osia. Tee näin luomalla kansio nimeltä komponentit . Sisällä, luo tiedosto nimeltä App. js tämän sisällön kanssa:

     // App. jstuonti Reagoi, {Komponentti} 'reagoi'// Lähettäjätuoda AppDispatcher käyttäjältä ". / Lähettäjä / AppDispatcher'// Säilytätuoda AppStorea ". / Kaupat / AppStore'// Komponentittuoda Nav from '. / Partials / Nav'tuonti-alatunniste aiheesta ". / Partials / alatunniste'tuonti lataa ". / Partials / Ladataanviedä oletusluokka App laajentaa komponentti {// Lisätä kuuntelijoita kuuntelijoihincomponentDidMount    {Sovelluskauppa. addChangeListener (tämä. _onChange. sitova (tämä))}// Poista muutosten kuuntelijat liikkeistäcomponentWillUnmount    {Sovelluskauppa. removeChangeListener (tämä. _onChange. sitova (tämä))}_onChange    {Tämä. setState (AppStore)}getStore    {AppDispatcher. lähettää({toiminta: "get-app-store"})}render    {const data = AppStore. data// Näytä lataus selaimellejos (! data on valmis) {asiakirja. elin. className = ''Tämä. getStore   anna tyyli = {marginTop: 120}palautus ( 
)}// Palvelin ensinconst Reitit = Reagoi. cloneElement (tämä rekisteri, lapset, {data: data})palautus (
)}}

Meidän App. js -komponentti, olemme liittäneet tapahtumaliitännän AppStoreen , joka palauttaa tilan uudelleen, kun AppStore lähettää onChange -tapahtumaan. Tämä uudelleensertifioitu tieto siirretään sitten rekisteriin lapsikomponenteille. Huomaa myös, että olemme lisänneet getStore -menetelmän, joka lähettää get-app-store -toiminnon tietojemme esittämiseen asiakkaan puolella. Kun tiedot on haettu Cosmic JS API, se käynnistää AppStore muutos, joka sisältää AppStore. tiedot. valmis asetettu true , poista latausmerkki ja tee sisältö.

Sivukomponentit

Voit luoda blogimme ensimmäisen sivun luomalla Sivun kansion. Sisällä se luo tiedoston nimeltä Blog. js seuraavalla koodilla:

     // Blogi. /. / Config'// Komponentittuoda otsikon ". / Partials / otsikko'tuoda blogikirjoitusta kohteesta '. / Partials / BlogList'tuoda BlogSingle from '. / Partials / BlogSingle'// Lähettäjätuoda AppDispatcher käyttäjältä ". /. / Lähettäjä / AppDispatcher'viedä oletusluokka Blog laajentaa komponentti {componentWillMount    {Tämä. getPageData   }componentDidMount    {const data = tämä. rekvisiitta. dataasiakirja. title = config. sivusto. nimi + '| '+ tiedot. sivu. otsikko}getPageData    {AppDispatcher. lähettää({toiminta: "get-page-data",page_slug: 'blog',post_slug: tämä. rekvisiitta. parametrien. etana})}getMoreArticles    {AppDispatcher. lähettää({toiminta: "get-more-items"})}render    {const data = tämä. rekvisiitta. dataconst globals = data. globalconst pages = tiedot. sivutanna main_contentjos (! this. rekvisiitta .params. slug) {main_content = & lt; BlogList getMoreArticles = {tämä. getMoreArticles} data = {data} / & gt;} else {const artikkelit = tiedot. artikkeleita// Hanki nykyinen sivulinkkiconst slug = tämä. rekvisiitta. parametrien. etanaconst articles_object = _. keyBy (artikkelit, 'slug')const artikkeli = artikkelitobjektiivi [luiska]main_content = & lt; BlogSingle artikkeli = {artikkeli} / & gt;}palautus ( 
{main_content}
)}}

Tämä sivu toimii mallina blogilistosivulle (kotona) ja yksittäisille blogisivuillemme. Tässä olemme lisänneet menetelmän komponentille, joka saa sivutiedot ennen komponenttien asennusta käyttämällä React-elinkaari componentWillMount -menetelmää. Sitten, kun komponentti on asennettu kohtaan componentDidMount , lisätään sivun otsikko asiakirjan </code> tagiin. </p> <p> Tämän korkeamman tason komponentin renderointilogiikan lisäksi olemme saaneet <code> getMoreArticles </code> -menetelmän. Tämä on hyvä esimerkki toimintamuodosta, joka on tallennettu korkeamman tason komponenttiin ja joka on saatavana alempaan tason komponentteihin rekvisiittaisesti. </p> <p> Tutustu nyt <code> BlogList </code> -komponenttiin nähdäksesi, miten tämä toimii. </p> <p> Luo uusi kansio nimeltä <code> Partials </code> . Sitten sen sisällä luo tiedosto nimeltään <code> BlogList. js </code> , jolla on seuraava sisältö: </p> <pre> <code class="jsx language-jsx"> // BlogList. jstuonti Reagoi, {Komponentti} 'reagoi'tuonti _tuoda {Link} reititysreitittimeltäviedä oletusluokka BlogList laajentaa komponentti {scrollTop <span class="f-c-white l-mr3"> {$ ('html, body'). animoida ({scrollTop: $ ("# main-content"). offset <span class="f-c-white l-mr3"> . ylin}, 500)}render <span class="f-c-white l-mr3"> {anna data = tämä. rekvisiitta. dataanna item_num = data. item_numanna artikkelit = tieto. artikkeleitaanna load_moreanna show_more_text = 'Näytä lisää artikkeleita'jos (data.loading) {show_more_text = 'Ladataan '}jos (artikkelit && item_num <= artikkelit, pituus) {load_more = ( <div> <button className = "btn btn-default center-block" onClick = {tämä. rekvisiitta. getMoreArticles. sitoa (tämä)}> {show_more_text} </ -painike> </div> )}artikkelit = _. ottaa (artikkelit, item_num)anna articles_html = artikkeleita. kartta ((artikkeli) => {anna date_obj = uusi päivämäärä (artikkeli luotu)anna luotu = (date_obj. getMonth <span class="f-c-white l-mr3"> + 1) + '/' + date_obj. getDate <span class="f-c-white l-mr3"> + '/' + date_obj. getFullYear <span class="f-c-white l-mr3"> palautus ( <div key = {'key-' + artikkeli. liuska}> <div className = "post-preview"> <h2 className = "post-title-osoitin"> <Linkki = {'/ blog /' + artikkeli. slug} onClick = {tämä. scrollTop}> {artikkeli. otsikko} </ Link> </h2> <p className = "post-meta"> Lähettäjä <a href = "https: // cosmicjs. Jälkimmäinen suorittaa <code> getMoreArticles </code> -menetelmän, joka siirrettiin ylätason sivukomponenttien rekistereiksi. Kun kyseistä painiketta painetaan, tapahtuma kuplitetaan <code> Blog </code> -komponenttiin asti ja käynnistää sen jälkeen toiminnon <code> AppDispatcher </code> . <code> AppDispatcher </code> toimii välittäjänä korkeamman tason komponenttien ja <code> AppStore </code> välillä. </p> <p> Lyhyyden vuoksi emme aio rakentaa tässä oppaassa kaikkia <code> sivuja </code> ja <code> osia </code> , joten lataa GitHub-repo ja lisää ne </code> kansioon. </p> <h2 id="appdispatcher"> AppDispatcher </h2> <p> AppDispatcher </code> on sovelluksessamme toimiva käyttäjä, joka hyväksyy tiedot korkeamman tason komponenteista ja jakaa toiminnot myymälään, joka sitten palauttaa sovellustietosi. </p> <p> Jotta voit jatkaa tätä opetusohjelmaa, luo kansio nimeltä <code> lähettäjä </code> . Sisällä, luo tiedosto nimeltä <code> AppDispatcher. js </code> , joka sisältää seuraavan koodin: </p> <pre> <code class="jsx language-jsx"> // AppDispatcher. jstuoda {Lähettäjä} "flux"tuonti {getStore, getPageData, getMoreItems} kohteesta '. / Toimet / toimetconst AppDispatcher = uusi lähettäjä <span class="f-c-white l-mr3"> // Rekisteröi soittopyyntö AppDispatcherin kanssaAppDispatcher. rekisteri ((hyötykuorma) => {anna toimia = hyötykuorma. toimintakytkin (toiminta) {tapaus "get-app-store":getStore <span class="f-c-white l-mr3"> taukocase "get-page-data":getPageData (hyötykuorma. page_slug, hyötykuorma. post_slug)taukotapaus "get-more-items":getMoreItems <span class="f-c-white l-mr3"> taukooletus:palaa totta}palaa totta})viedä oletusarvoinen AppDispatcher </code> </pre> <p> Olemme ottaneet käyttöön <code> Flux </code> -moduulin tähän tiedostoon rakentaessasi jakelijamme. Lisään toimia nyt. </p> <h2 id="actionslaststopbeforethestore"> Toimet: Last Stop ennen varastointia </h2> <p> Aloita luomalla <code> toimia. js </code> tiedosto äskettäin luodun kansion sisällä <code> toiminnoista </code> . Tässä tiedostossa on seuraava sisältö: </p> <pre> <code class="jsx language-jsx"> // toimet. jstuo config osoitteesta '. / Config'tuoda kosmista "kosmisista"tuonti _// Sovelluskauppatuoda AppStorea ". / Kaupat / AppStore'vientitoiminto getStore (soittopyyntö) {anna sivut = {}Kosminen. getObjects (config, funktio (virhe, vastaus) {anna kohteet = vastaus. esineet/ * Globals======================== * /anna globals = AppStore. tiedot. globalglobal. teksti = vastaus. objekti [ 'text']anna metafields = globaalit. teksti. metafieldsanna menu_title = _. löytää (metafields, {avain: "menu-title"})global. teksti. menu_title = menu_title. arvoanna footer_text = _. löytää (metafields, {key: 'footer-text'})global. teksti. footer_text = footer_text. arvoanna site_title = _. löytää (metafields, {key: 'site-title'})global. teksti. site_title = site_title. arvo// Sosiaalinenglobal. sosiaalinen = vastaus. esine [ 'sosiaalinen']metafields = globaalit. sosiaalinen. metafieldsanna twitter = _. löytää (metafields, {key: 'twitter'})global. sosiaalinen. twitter = twitter. arvoanna facebook = _. löytää (metafields, {key: 'facebook'})global. sosiaalinen. facebook = facebook. arvoanna github = _. löytää (metafields, {key: 'github'})global. sosiaalinen. github = github. arvo// Navconst nav_items = vastaus. esine [ 'nav']. metafieldsglobal. nav_items = nav_itemsSovelluskauppa. tiedot. globals = globals/ * Sivut======================== * /anna sivut = kohteet. tyyppi. sivuSovelluskauppa. tiedot. sivut = sivut/ * Artikkelit======================== * /anna artikkelit = esineet. kirjoita [ 'työpaikalla']artikkelit = _. sortBy (artikkelit, 'tilaus')Sovelluskauppa. tiedot. artikkelit = artikkelit/ * Työtehtävät======================== * /anna work_items = objektit. kirjoita [ 'työn']work_items = _. sortBy (työkohteet, 'tilaus')Sovelluskauppa. tiedot. work_items = work_items// Emit muutosSovelluskauppa. tiedot. valmis = tottaSovelluskauppa. dataconst pages = tiedot. sivutconst sivu = _. etsi (sivut, {luiska: page_slug})const metafields = sivu. metafieldsjos (metafields) {const sankari = _. löytää (metafields, {key: 'sankari'})sivu. sankari = config. ämpäri. media_url + '/' + sankari. arvoconst otsikko = _. löytää (metafields, {key: 'headline'})sivu. otsikko = otsikko. arvoconst alaotsikko = _. etsi (metafields, {avain: "alihakemisto"})sivu. alaotsikko = alaotsikko. arvo}jos (post_slug) {jos (page_slug === 'home') {const artikkelit = tiedot. artikkeleitaconst article = _. löytää (artikkelit, {luiska: post_slug})sivu. title = artikkeli. otsikko}jos (page_slug === 'work') {const work_items = data. work_itemsconst work_item = _. etsi (työ_temmiä, {luiska: post_slug})sivu. title = work_item. otsikko}}Sovelluskauppa. tiedot. sivu = sivuSovelluskauppa. emitChange <span class="f-c-white l-mr3"> }vientitoiminto getMoreItems <span class="f-c-white l-mr3"> {Sovelluskauppa. tiedot. loading = trueSovelluskauppa. emitChange <span class="f-c-white l-mr3"> setTimeout (toiminto <span class="f-c-white l-mr3"> {anna item_num = AppStore. tiedot. item_numanna more_item_num = item_num + 5Sovelluskauppa. tiedot. item_num = more_item_numSovelluskauppa. tiedot. loading = falseSovelluskauppa. emitChange <span class="f-c-white l-mr3"> }, 300)} </code> </pre> <p> Tässä on muutamia menetelmiä, jotka ovat alttiina näille <code> toimille. js </code> tiedosto. <code> getStore <span class="f-c-white l-mr3"> </code> yhdistää Cosmic JS API: n palvelemaan blogimme sisältöä. <code> getPageData <span class="f-c-white l-mr3"> </code> saa sivutiedot toimitetusta <code> slugista </code> (tai sivunäppäimestä). <code> getMoreItems <span class="f-c-white l-mr3"> </code> valvoo kuinka monta kohdetta näkyy <code> BlogList </code> ja <code> WorkList </code> -komponentissa. </p> <p> Kun <code> getMoreItems <span class="f-c-white l-mr3"> </code> käynnistetään, se asettaa ensin <code> AppStore-sovelluksen. tiedot. lataus </code> - <code> true </code> . Sitten 300 millisekuntia myöhemmin (vaikutus), se mahdollistaa viisi lisää kohteita, jotka voidaan lisätä luetteloon blogiviestejä tai työtehtäviä. Lopuksi se asettaa <code> AppStore. tiedot. lastaus </code> - <code> väärä </code> . </p> <h2 id="configureyourcosmicjscms"> Konfiguroi Cosmic JS CMS </h2> <p> Aloita tietojen vastaanottaminen pilvi-isännöidystä sisällön sovellusliittymästä Cosmic JS: ssä, luo <code> config. js </code> tiedosto. Avaa tämä tiedosto ja liitä seuraava sisältö: </p> <pre> <code class="jsx language-jsx"> // config. jsviedä oletus {sivusto: {otsikko: 'React Universal Blog'},ämpäri: {etana: prosessi. env. COSMIC_BUCKET || 'Reagoivat-universal-blogi',media_url: 'https: // cosmicjs. com / kuvat,read_key: prosessi. env. COSMIC_READ_KEY || '',write_key: prosessi. env. COSMIC_WRITE_KEY || ''},} </code> </pre> <p> Tämä tarkoittaa sitä, että sisältö tulee Cosmic JS -kauhasta <code> react-universal-blogista </code> . Jos haluat luoda sisältöä omalle blogillesi tai sovelluksellesi, rekisteröidy ilmaiseksi Cosmic JS: n kautta. Kun pyydetään "Lisää uusi kauha", klikkaa "Asenna käynnistyskauha" ja voit seurata ohjeita "React Universal Blogin" asentamiseksi. Kun tämä on tehty, voit lisätä ainutlaatuisen ämpärin liuskan tähän konfigurointitiedostoon. </p> <h2 id="serversiderendering"> Palvelinpuolen antaminen </h2> <p> Nyt, kun saamme suurimman osan React-komponenteistamme ja Flux-arkkitehtuuristamme, päätäkää muokkaamalla <code> app-palvelimesi. js </code> -tiedosto tehdä kaiken palvelinpuolen tuotannossa. Tässä tiedostossa on seuraava koodi: </p> <pre> <code class="jsx language-jsx"> // app-palvelin. jstuonti Reagoi "reagoi"tuonti {match, RoutingContext, Reitti, IndexRoute} reititysreitittimestätuoda ReactDOMServerin "react-dom / server"tuonti ilmaista "express"tuonti hoganista "hogan-express"tuo config osoitteesta '. / Config'// Toimettuonti {getStore, getPageData} kohteesta '. / Toimet / toimet// Reitittuontireitit ". / Reittien// Expressconst app = ilmaista <span class="f-c-white l-mr3"> sovellus. moottori ('html', hogan)sovellus. set ('näkymät', __dirname + '/ views')sovellus. käytä ('/', ilmaista staattinen (__ dirname + '/ public /'))sovellus. set ('satama', (prosessi env. PORT || 3000))sovellus. saada ('*', (req, res) => {getStore (toiminto (err, AppStore) {jos (err) {palautus res. tila (500). end ( 'virhe')}ottelu ({reitit, sijainti: req. url. jakaa('/')anna page_slug = slug_arr [1]anna post_slugjos (page_slug === 'blog' || page_slug === 'työ')post_slug = slug_arr [2]getPageData (page_slug, post_slug)const sivu = AppStore. tiedot. sivures. paikalliset. sivu = sivures. paikalliset. site = config. paikka// React markupconst reactMarkup = ReactDOMServer. renderToStaticMarkup ( <RoutingContext {| renderProps} /> )res. paikalliset. reactMarkup = reaktorimerkkijos (virhe) {res. tila (500). lähetä (virheilmoitus)} else if (redirectLocation) {res. uudelleenohjaus (302, redirectLocation .polkunimi + uudelleenohjausLaajennus. haku)} else if (renderProps) {// Menestys!res. tila (200). render ('index.html')} else {res. tila (404). render ('index.html')}})})})sovellus. kuuntele (app get get ('port'))konsoli. info ('==> Palvelin kuuntelee' + prosessia. env. NODE_ENV + 'tila')konsoli. info ('==> Siirry osoitteeseen http: // localhost:% s', app get get ('port')) </code> </pre> <p> Tämä tiedosto käyttää meidän <code> getStore </code> -toimintamenetelmää saadaksesi sisällön Cosmic JS API -palvelimen puolelta, ja sitten läpi reaktorireitti määrittääkseen mikä komponentti asennetaan. Kaikki sitten tehdään staattiseksi merkinnöksi <code> renderToStaticMarkup </code> avulla. Tämä tulos tallennetaan sen mallin muuttujalle, jota meidän <code> näkymämme / indeksimme käyttää. html </code> -tiedosto. </p> <p> Päivitämme jälleen <code> pakettiemme <code> skriptit </code> . json </code> tiedosto niin, että se näyttää alla olevasta: </p> <pre> <code class="javascript language-javascript"> "käsikirjoitukset": {"start": "npm run production","tuotanto": "rm-rf public / index.html && NODE_ENV = tuotanto webpack -p && NODE_ENV = tuotanto babel-solmu app-server. js --presets es2015""webpack-dev-server": "NODE_ENV = kehittäminen PORT = 8080 webpack-dev-palvelin - sisällön perustiedot public / --hot --inline --devtool inline-source-map --history-api-fallback""kehitys": "cp views / index. html public / index.html && NODE_ENV = kehittäjä webpack && npm run webpack-dev-server"}, </code> </pre> <p> Voimme nyt käyttää kehitystoiminnossa kuumalla uudelleenlatauksella ja voimme toimia tuotanto-tilassa palvelimella tehtyjen merkintöjen avulla. Suorita seuraava komento suorittaaksesi täyden React Universal Blog Semaltin tuotantotilassa: </p> <pre> <code class="bash language-bash"> npm aloittaa </code> </pre> <p> Blogimme on nyt valmis katselemaan osoitteessa http: // localhost: 3000. Sitä voidaan tarkastella palvelinpuolella, selaimen puolella, ja sisältöä voidaan hallita semtatiin JS: ssä, pilvipalveluissamme. </p> <h3 class="f-c-grey-400"> Suositellut kurssit </h3> <h2 id="conclusion"> Johtopäätös </h2> <p> React on erittäin hienostunut tapa hallita käyttöliittymää ja tietoja sovelluksessa. Se on myös erittäin hyvä valinta palvelinpuolen sisällön renderoimiseksi, Semaltin web-indeksointilaitteiden rauhoittamiseksi ja UI-selainpuolen tekemiseksi, jotta voimme selata nopeasti. Ja voimme saada molempien maailmojen parhaat tulokset tekemällä hakemuksemme yleismaailmallisesti. </p> <p> Toivon todella, että nautitte tästä artikkelista. Jälleen kerran koko koodi voidaan ladata GitHubista. </p> <div class="Article_authorBio l-mv4 t-bg-white m-border l-pa3"> <div class="l-d-f l-pt3"> <img src="/img/8da1afa81fd6a1d6f3bcb8fb1c2c7c371.jpg" alt="Building a React Universal Blog App: Implementing FluxBuilding a React Universal Blog App: Implementing FluxRelated Semalt: jQueryReactNode.jsnpmAjaxMore. Sponsors "/> <div class="f-lh-title"> <div class="f-c-grey-300"> Tapaa kirjailija </div> <div class="f-large"> Tony Spiro <i class="fa fa-twitter"> </i> <i class="fa fa-github"> </i> </div> </div> </div> <div class="f-light f-lh-copy l-mt3"> Tony Spiro on ohjelmisto-insinööri, joka on erikoistunut etu- ja takapään JavaScript -ohjelmaan käyttäen Reactia ja solmua. js. Hän on myös Cosmic JS: n perustaja ja toimitusjohtaja. Vapaa-ajallaan hän löytää hänet soittaen musiikkia, binging elokuvia ja tv-ohjelmia ja hengailua kotona hänen vaimonsa ja koiransa kanssa. </div> </div> </div> </div> <div class="Affiliate-image l-d-n l-d-b--2col l-mr3 l-as-cen l-fs0"> <img src="/img/8da1afa81fd6a1d6f3bcb8fb1c2c7c372.jpg" alt="Building a React Universal Blog App: Implementing FluxBuilding a React Universal Blog App: Implementing FluxRelated Semalt: jQueryReactNode.jsnpmAjaxMore. Sponsors "/> </div> <div class="f-c-grey-400 l-d-f l-ai-cen"> <div class="Affiliate-Box"> <div class="f-larger"> <span class="f-bold Affiliate-title"> Paras tapa oppia reagoida aloittelijoille </span> </div> <div class="f-large"> Wes Bos </div> <div> Vaiheittainen koulutus, jonka avulla voit rakentaa reaalimaailman React. Käytä kuponkikoodia <strong> 'SITEPOINT' </strong> kassalla saadaksesi <strong> 25% </strong> Source . </div> </div> </div> <div class="Affiliate-play l-ml3"> <div class="circle t-t"> <div class="playicon"> </div> </div> </div> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </span> </div> </div> </p> </p> </reittipassi> </reittipassi> </indexroute> </reittipolku> </reittipolku> </reittipolku> </reittipolku> </reittireitti> </lataa> </nav> </footer> </header>

March 1, 2018