Back to Question Center
0

Skapa en React Universal Blog App: En steg-för-steg-guide            Skapa en React Universal Blog App: En steg-för-steg GuideRelated Semalt: AngularJSNode.jsReactAjaxES6More ... Sponsorer

1 answers:
Skapa en React Universal Blog App: En steg-för-steg-guide

När ämnet för enkelsidiga applikationer uppkommer tenderar vi att tänka på webbläsare, Semalt, hastighet och osynlighet för sökmotorer. Det beror på att ett SPA ger en sidans innehåll med Semalt, och eftersom webbrobotar inte använder en webbläsare för att visa webbsidor kan de inte visa och indexera innehållet - eller åtminstone de flesta kan inte.

Detta är ett problem som vissa utvecklare har försökt lösa på olika sätt:

  1. Lägga till en rymdversion av en webbplats, som kräver att alla sidor är tillgängliga i statisk form och lägger till mycket extra arbete (nu avskriven).
  2. Använda en betald tjänst för att un-browserify ett SPA i statisk markup för att sökrobotar ska krypa.
  3. Att lita på att sökmotorerna nu är tillräckligt avancerade för att läsa vårt JavaScript-bara innehåll. (Jag skulle inte bara än - how to ceate your own.)

Använda Node. js på servern och reagera på klienten, kan vi bygga vår JavaScript-app för att vara universal (eller isomorf ). Detta kan erbjuda flera fördelar med server-sida och webbläsarsidning, så att både sökmotorer och människor använder webbläsare för att se vårt SPA-innehåll.

I denna stegvisa handledning visar jag dig hur man bygger en React Semalt Blog App som först gör markup på serverns sida för att göra vårt innehåll tillgängligt för sökmotorer. Då kommer det att låta webbläsaren ta över på ett enda applikation som är både snabbt och lyhört.

Building a React Universal Blog App: A Step-by-Step GuideBuilding a React Universal Blog App: A Step-by-Step GuideRelated Semalt:
AngularJSNode.jsReactAjaxES6More. Sponsors

Komma igång

Vår universella bloggapp kommer att utnyttja följande tekniker och verktyg:

  1. Nod. js för pakethantering och server-sida-rendering
  2. Reagera för UI-visningar
  3. Express för en enkel back-end JS-server ram
  4. React Router för routing
  5. React Hot Loader för varm laddning under utveckling
  6. Flux för dataflöde
  7. Cosmic JS för innehållshantering

För att starta, kör följande kommandon:

     mkdir reagera universell bloggcd-reaktion-universell blogg    

Skapa nu ett paket. json fil och lägg till följande innehåll:

   {"namn": "reagera universell blogg","version": "1. 0. 0","motorer": {"nod": "4. 1. 2","npm": "3, 5, 2"},"beskrivning": "","huvud": "app-server. js","beroenden": {"babel-cli": "^ 6, 26. 0","babel-loader": "^ 7. 1. 2","babel-preset-es2015": "^ 6. 24. 1","babel-preset-es2017": "^ 6, 24. 1","babel-preset-reager": "^ 6, 24. 1","babel-register": "^ 6, 26. 0","cosmicjs": "^ 2, 4. 0","flux": "^ 3, 1. 3","historia": "1. 13. 0","hogan-express": "^ 0, 5, 2","html-webpack-plugin": "^ 2. 30. 1","sökväg": "^ 0, 12. 7","reagera": "^ 15, 6. 1","reagera dom": "^ 15, 6. 1","Reaktor-router": "1. 0. 1","webpack": "^ 3. 5. 6","webpack-dev-server": "^ 2. 7. 1"},"skript": {"webpack-dev-server": "NODE_ENV = utveckling PORT = 8080 webpack-dev-server --content-base public / --hot --inline --devtool inline-source-map --historia-api-fallback""utveckling": "cp visningar / index. html public / index. html && NODE_ENV = utveckling webpack && npm kör webpack-dev-server"},"författare": "","licens": "ISC","devDependencies": {"reagerad varmlastare": "^ 1. 3. 0"}}    

I den här filen märker du att vi har lagt till följande:

  1. Babel för att paketera våra CommonJS-moduler och konvertera vår ES6 och React JSX till webbläsarkompatibel JavaScript
  2. Den kosmiska JS officiella noden. js klient för att enkelt tjäna vårt blogginnehåll från Cosmic JS Cloud Hosted Content API
  3. Flux för app-datahantering (vilket är ett mycket viktigt inslag i vår React-applikation). js fil.

Vi ​​har också lagt till ett skript i vårt paket. json fil. När vi kör npm kör utveckling kopierar manuset indexet. html fil från vår visningar mapp i vår offentliga mapp. Därefter sätter den innehållsbasen för vår webpack-dev-server till public / och möjliggör hot reloading (på . Js file save). Slutligen hjälper det oss att felsöka våra komponenter på källan och ger oss en återgång till sidor som den inte kan hitta (faller tillbaka till index. Html ).

Låt oss nu konfigurera vår webpackkonfigurationsfil genom att redigera filen webpack. konfig. js :

   // webpack. konfig. jsvar webpack = kräver ('webpack')modul. export = {devtool: "eval",post: '. / App-klient. js',utgång: {sökväg: __dirname + '/ public / dist',filnamn: "bunt. js',publicPath: '/ dist /'},modul: {lastare: [{test: / \. js $ /, loaders: 'babel-loader', exkludera: / node_modules /},{test: / \. jsx $ /, loaders: 'babel-loader', utesluter: / node_modules /}]},plugins: [ny webpack. DefinePlugin ({'bearbeta. env. COSMIC_BUCKET ': JSON. stringify (process. env. COSMIC_BUCKET),'bearbeta. env. COSMIC_READ_KEY ': JSON. stringify (process. env. COSMIC_READ_KEY),'bearbeta. env. COSMIC_WRITE_KEY ': JSON. stringify (process. env. COSMIC_WRITE_KEY)})]};    

Du märker att vi har lagt till en post egenskap med ett värde av app-klient. js . Den här filen fungerar som vår appklientinmatningspunkt, vilket betyder att från denna punkt kommer webpack att paketera vår ansökan och mata ut den till / public / dist / bundle. js (som anges i egenskapen utgång ). Vi använder även lastare för att låta Babel arbeta med sin magi på vår ES6 och JSX-kod. React Hot Loader används för hot-loading (ingen siduppdatering!) Under utveckling.

Innan vi hoppar in i React-relaterade saker, låt oss se ut och se på vår blogg redo att gå. Eftersom jag skulle vilja att du fokuserar mer på funktionalitet än stil i denna handledning, använder vi här ett förbyggt temat för framsidan. Jag har valt en från Start Bootstrap som heter Semalt Blog. I din terminal kör följande kommandon:

Skapa en mapp kallad visningar och inuti den ett index. html fil. Öppna HTML-filen och lägg till följande kod:

    {{site. titel}} {{# page}} | {{sid. titel}} {{/ page}} </ title><! - Bootstrap Core CSS -><link href = "/ css / bootstrap. min. css" rel = "stylesheet"><! - Anpassad CSS -><link href = "/ css / ren blogg. min. css" rel = "stylesheet"><link href = "/ css / cosmic-custom. css" rel = "stylesheet"><! - Anpassade teckensnitt -><link href = "// maxcdn. bootstrapcdn. com / font-awesome / 4. 1. 0 / css / font-awesome. min. css" rel = "stylesheet" type = "text / css"><link href = "// teckensnitt. googleapis. com / css? family = Lora: 400,700,400italic, 700italic" rel = "stylesheet" type = "text / css"><link href = "// fonter. googleapis. com / css? family = Öppna + Sans: 300italic, 400italic, 600italic, 700italic, 800italic, 400,300,600,700,800" rel = "stylesheet" type = "text / css"><! - HTML5 Shim och svara. js IE8-stöd för HTML5-element och mediefrågor -><! - VARNING: Svara. js fungerar inte om du visar sidan via fil: // -><! - [om lt IE 9]><script src = "https: // oss. maxcdn. com / libs / html5shiv / 3. 7. 0 / html5shiv. js"> </ script><script src = "https: // oss. maxcdn. com / libs / svara. js / 1. 4. 2 / svara. min. js"> </ script><! [Endif] -></ Head><body class = "hidden"><div id = "app"> {{{reactMarkup}}}  </div> <script src = "/ js / jquery. min. js"> </ script><script src = "/ js / bootstrap. min. js"> </ script><script src = "/ js / ren blogg. min. js"> </ script><script src = "/ dist / bunt. Klicka här för att ladda ner filerna.  </p>  <p>  Generellt skulle jag använda det fantastiska React Bootstrap-paketet och avstå från att använda jSemalt. Men för korthetens skull behåller vi tematets pre-built jSemalt-funktionalitet.  </p>  <p>  I vårt  <code>  index. html  </code>  fil, har vi vår React mount-punkt uppställd på  <code>  div  </code>  där  <code>  id = "app"  </code> . Mallvariabeln  <code>  {{{reactMarkup}}}  </code>  kommer att omvandlas till vår servergjorda markup och sedan när webbläsaren har kommit in, tar vår React-applikation över och monteras till  <code>  div  </code>  med  <code>  id = "app"  </code> . För att förbättra användarupplevelsen medan vår JavaScript laddar allt lägger vi till  <code>  class = "hidden"  </code>  i vår kropp. Sedan tar vi bort den här klassen när React har monterats. Det kanske låter lite komplicerat, men jag ska visa dig hur vi ska göra det på en minut.  </p>  <p>  På den här tiden borde din app ha följande struktur:  </p>  <pre>  <code class="text language-text"> paketet. jsonoffentlig| -css| -bootstrap. min. css| -cosmic-custom. css| -js| -jquery. min. js| -bootstrap. min. js| -clean-blogg. min. jsvisningar| -index. htmlWebpack. konfig. js </code>   </pre>  <p>  Nu när vi har gjort våra statiska bitar, låt oss börja bygga några React Components.  </p> <h2 id="ourblogappcomponentsbasicexample"> Våra bloggappkomponenter (grundläggande exempel)  </h2>  <p>  Låt oss börja bygga användargränssnittet för vår app genom att skapa sidorna för vår blogg. Semalt Detta kommer att bli en portföljblogg för en kreativ professionell, vår blogg kommer att ha följande sidor:  </p>  <ol>  <li>  Hem  </li>  <li>  Om  </li>  <li>  Arbete  </li>  <li>  Kontakt  </li>  </ol>  <p>  Låt oss börja med att skapa en fil som heter  <code>  app-klient. js  </code>  och lägg till följande innehåll till det:  </p>  <pre>  <code class="jsx language-jsx"> // app-klient. jsimportera Reakt från "reagera"importera {render} från 'react-dom'importera {Router} från "re-router"importera createBrowserHistory från 'history / lib / createBrowserHistory'const history = createBrowserHistory  <span class="f-c-white l-mr3"> // Rutterimportera rutter från ". / rutterconst Routes = (<Router history = {history}>{rutter}</ Router>)const app = dokument. getElementById ( 'app')render (rutter, app) </code>   </pre>  <p>  För att bättre förstå hur React Router fungerar kan du besöka deras GitHub repo. Kärnan här är att vi har i  <code>  app-klient. js  </code>  vår  <code>  Router  </code>  -komponent som har en webbläsarhistorik för våra routersidor. Vår server-gjorda markering behöver inte webbläsarhistorik, så vi skapar en separat  <code>  rutter. js  </code>  -filen som ska delas mellan våra server- och klientinmatningspunkter.  </p>  <p>  Lägg till följande på  <code>  rutter. js  </code>  fil:  </p>  <pre>  <code class="jsx language-jsx"> // rutter. jsImportreakt, {Komponent} från "reagera"importera {Rutt, IndexRoute, Länk} från "Reaktor-router"// Huvudkomponentklass App utökar komponent {componentDidMount  <span class="f-c-white l-mr3">  {dokumentera. kropp. classname = ''}göra <span class="f-c-white l-mr3"> {lämna tillbaka (<Div><h1> React Universal Blog </ h1><Nav><Ul> <li>  <Länk till = "/"> Hem </ Link>  </li>  <li>  <Länk till = "/ om"> Om </ Link>  </li>  <li>  <Länk till = "/ arbete"> Arbete </ Link>  </li>  <li>  <Länk till = "/ contact"> Kontakt </ Link>  </li> </ Ul></ Nav>{this. rekvisita. Nu, låt oss köra vår ansökan och kolla in det! I din terminal kör följande kommandon:  </p>  <pre>   <code class="bash language-bash">  mkdir offentliganpm installeranpm kör utveckling </code>   </pre>  <p>  Navigera sedan till http: // localhost: 8080 i din webbläsare för att se din grundläggande blogg i aktion.  </p>  <p>  Det är dags att få detta att köra på servern. Skapa en fil som heter  <code>  app-server. js  </code>  och lägg till detta innehåll:  </p>  <pre>  <code class="jsx language-jsx"> // app-server. jsimportera Reakt från "reagera"importera {match, RoutingContext} från "re-router"importera ReactDOMServer från "React-Dom / Server"importera express från "express"importera hogan från "hogan-express"// Rutterimportera rutter från ". / rutter// Uttryckaconst app = express  <span class="f-c-white l-mr3"> app. motor ('html', hogan)app. set ('views', __dirname + '/ views')app. använd ('/', express. static (__ dirname + '/ public /'))app. set ("port", (process. env. port | 3000))app. få ('*', (req, res) => {matcha ({rutter, plats: req. url}, (fel, redirectLocation, renderProps) => {const reactMarkup = ReactDOMServer. renderToStaticMarkup (<RoutingContext {.renderProps} />)res. lokalbefolkningen. reageraMarkup = reageraMarkupom (fel) {res. status (500). skicka (felmeddelande)} annars om (redirectLocation) {res. omdirigering (302, omdirigeringLocation. pathname + redirectLocation. search)} annars om (renderProps) {// Framgång!res. status (200). render ('index. html')} annat {res. status (404). render ('index. html')}})})app. lyssna (app. get ('port'))trösta. info ('==> Server lyssnar i' + process. env. NODE_ENV + 'läge')trösta. info ('==> Gå till http: // localhost:% s', app. get ('port')) </code>   </pre>  <p>  i  <code>  app-server. js  </code> , laddar vi de grundläggande rutorna som vi har ställt in. Dessa konverterar den renderade markeringen till en sträng och skickar den sedan som en variabel till vår mall.  </p>  <p>  Semalt redo för att starta servern och se vår kod på den, men först, låt oss skapa ett manus för att göra det.  </p>  <p>  Öppna ditt  <code>  paket. json  </code>  fil och redigera sektionen  <code>  script  </code>  för att se ut som följande:  </p>  <pre>  <code class="jsx language-jsx"> // ."skript": {"start": "npm kör produktion","produktion": "rm -rf public / index. html && NODE_ENV = produktion webpack -p && NODE_ENV = produktion babelnoden app-server. js --presets es2015","webpack-dev-server": "NODE_ENV = utveckling PORT = 8080 webpack-dev-server --content-base public / --hot --inline --devtool inline-source-map --historia-api-fallback""utveckling": "cp visningar / index. html public / index. html && NODE_ENV = utveckling webpack && npm kör webpack-dev-server"},// . </code>   </pre>  <p>  Nu när vi har skapat vårt  <code>  production  </code>  script kan vi köra vår kod på både serverns sida och klientsidan. I din terminal kör:  </p>  <pre>   <code class="bash language-bash">  npm start </code>   </pre>  <p>  Semalt i din webbläsare till http: // localhost: 3000. Du bör se ditt enkla blogginnehåll och kunna snabbt och enkelt navigera genom sidorna i SPA-läget.  </p>  <p>  Fortsätt och slå  <code>  visa källa  </code> . Observera vår SPA-kod finns för alla robotar att hitta så bra. Vi får det bästa av båda världarna!  </p> <h2 id="conclusions"> Slutsatser  </h2>  <p>  I den här första delen har vi börjat gräva in i Reacts värld och se hur vi kan använda det, tillsammans med Node. js, för att bygga en React Universal Blog App.  </p>  <p>  Om du vill ta din blogg till nästa nivå och veta hur man lägger till och redigerar innehåll, glöm inte att läsa den andra delen, "Skapa en React Universal Blog App: Implementing Flux". Vi kommer in i det riktiga köttet om hur vi enkelt kan skala vår React Universal Blog App med React Organizational Concepts och  <strong>  Flux Pattern  </strong> .  </p>  <p>  <em> Vi har samarbetat med Open SourceCraft för att få dig  <strong>  6 Pro Tips från React Developers  </strong> . För mer open source-innehåll, kolla in Open SourceCraft. js. Han är också grundare och koncernchef för Cosmic JS. På fritiden kan du hitta honom att spela musik, binging på filmer och TV-program och hänga hemma hos sin fru och hund.  </div>  </div>  </div>  </div>  </span>  </span>  </span>  </span>  </p>  </pre>  </pre>  </code>  </html>  </head>  </meta>  </meta>  </meta>  </meta>  </meta>                                                                                 
March 1, 2018