Back to Question Center
0

Membangun React App Universal Blog: Panduan Langkah demi Langkah            Membangun sebuah Blog Reaktik Universal App: A Step-by-Step GuideRelated Semalt: AngularJSNode.jsReactAjaxES6Lebih ... Penaja

1 answers:
Membangunkan Blog Reaktik Universal App: Panduan Langkah demi Langkah

Apabila topik aplikasi halaman tunggal (SPA) muncul, kita cenderung untuk memikirkan pelayar, Semalt, kelajuan, dan ketepatan untuk enjin carian. Ini kerana SPA membuat kandungan halaman menggunakan Semalt, dan sejak crawler web tidak menggunakan penyemak imbas untuk melihat halaman web, mereka tidak dapat melihat dan mengindeks kandungannya - atau sekurang-kurangnya kebanyakannya tidak boleh.

Ini adalah masalah yang sesetengah pemaju cuba menyelesaikan dengan pelbagai cara:

  1. Menambah versi serpihan yang melarikan diri dari sebuah laman web, yang memerlukan semua halaman tersedia dalam bentuk statik dan menambah banyak kerja tambahan (kini sudah usang).
  2. Menggunakan perkhidmatan yang dibayar untuk tidak melayari SPA menjadi markup statik untuk labah-labah enjin pencarian untuk merangkak - cassandra kpi.
  3. Memandangkan enjin carian kini cukup maju untuk membaca kandungan JavaScript kami sahaja. (Saya tidak akan hanya.)

Menggunakan Node. js di pelayan dan React pada klien, kami boleh membina aplikasi JavaScript kami untuk menjadi universal (atau isomorfik ). Ini boleh menawarkan beberapa faedah dari sisi server dan penyemak imbas sisi, membolehkan kedua-dua enjin carian dan manusia menggunakan pelayar untuk melihat kandungan SPA kami.

Dalam tutorial langkah demi langkah ini, saya akan menunjukkan kepada anda bagaimana untuk membina React Semalt Blog App yang akan menyebabkan markup di sebelah pelayan untuk membuat kandungan kami tersedia untuk enjin carian. Kemudian, ia akan membiarkan pelayar mengambil alih dalam satu aplikasi halaman yang cepat dan responsif.

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

Bermula

Aplikasi blog sejagat kami akan menggunakan teknologi dan alat berikut:

  1. Nod. js untuk pengurusan pakej dan rendering sisi pelayan
  2. React untuk paparan UI
  3. Ekspres untuk kerangka pelayan JS back-end yang mudah
  4. React Router for routing
  5. React Hot Loader untuk loading panas dalam pembangunan
  6. Fluks untuk aliran data
  7. Kosmik JS untuk pengurusan kandungan

Untuk memulakan, jalankan arahan berikut:

     mkdir bertindak balas-sejagat-blogcd react-universal-blog    

Sekarang buat pakej . json fail dan tambah kandungan berikut:

     {"nama": "respons-universal-blog","versi": "1. 0. 0","enjin": {"nod": "4. 1. 2","npm": "3. 5. 2"},"penerangan": "","utama": "app-server js","kebergantungan": {"babel-cli": "^ 6 26. 0","babel-loader": "^ 7. 1. 2","babel-preset-es2015": "^ 6. 24. 1","babel-preset-es2017": "^ 6. 24. 1","babel-preset-react": "^ 6. 24. 1","babel-register": "^ 6 26. 0","cosmicjs": "^ 2. 4. 0""fluks": "^ 3. 1. 3","sejarah": "1. 13. 0""hogan-express": "^ 0. 5. 2","html-webpack-plugin": "^ 2. 30. 1""jalan": "^ 0.12","bertindak balas": "^ 15.6.1","reaksi-dom": "^ 15.6.1","reaktor-router": "1. 0. 1","webpack": "^ 3. 5. 6","webpack-dev-server": "^ 2. 7. 1"},"skrip": {"webpack-dev-server": "NODE_ENV = development PORT = 8080 webpack-dev-server --content-base public / --hot --inline --devtool inline-source-map --history-api-fallback""pembangunan": "cp views / index. html public / index html && NODE_ENV = development webpack && npm run webpack-dev-server"},"pengarang": "","lesen": "ISC","devDependencies": {"bertindak balas-panas-loader": "^ 1. 3. 0"}}    

Dalam fail ini, anda akan melihat bahawa kami telah menambah yang berikut:

  1. Babel untuk pakej modul CommonJS kami dan menukar ES6 dan React JSX kami ke dalam JavaScript yang serasi pelayar
  2. Node rasmi JS Cosmic. js klien untuk dengan mudah menyampaikan kandungan blog kami dari API kandungan host-awan Cosmic JS
  3. Fluks untuk pengurusan data aplikasi (yang merupakan elemen yang sangat penting dalam aplikasi React kami). js fail.

Kami juga telah menambah skrip dalam pakej kami . json fail. Apabila kita menjalankan pembangunan 63 (npm) npm pembangunan , skrip menyalin indeks . html fail dari folder kami pandangan ke folder awam kami. Kemudian, ia menetapkan asas kandungan untuk webpack-dev-server kami ke awam / dan membolehkan muat semula panas (pada . Js simpan fail). Akhirnya, ia membantu kami menyebarkan komponen kami di sumber dan memberikan kami sandaran untuk halaman yang tidak dapat dijumpai (jatuh kembali ke indeks. Html ).

Sekarang, mari kita sediakan fail konfigurasi webpack kami dengan mengedit fail web . config. js :

     // webpack. config. jsvar webpack = memerlukan ('webpack')modul. eksport = {devtool: 'eval',kemasukan: '. / app-client. js ',pengeluaran: {jalan: __dirname + '/ public / dist',nama fail: 'bundle. js ',publicPath: '/ dist /'},modul: {pemuat: [{test: / \. js $ /, pemuat: 'babel-loader', tidak termasuk: / node_modules /},{test: / \. jsx $ /, pemuat: 'babel-loader', tidak termasuk: / node_modules /}]},plugin: [webpack baru. DefinePlugin ({'proses. env. COSMIC_BUCKET ': JSON. berturut-turut (proses env. COSMIC_BUCKET),'proses. env. COSMIC_READ_KEY ': JSON. bertekstur (proses env. COSMIC_READ_KEY),'proses. env. COSMIC_WRITE_KEY ': JSON. berturut-turut (proses env. COSMIC_WRITE_KEY)})]};    

Anda akan melihat bahawa kami telah menambah kemasukan harta dengan nilai aplikasi klien. js . Fail ini berfungsi sebagai titik kemasukan klien aplikasi kami, yang bermaksud bahawa dari webpack point ini akan membungkus aplikasi kami dan mengeluarkannya ke bundle / awam / dist /. js (seperti dinyatakan dalam output harta). Kami juga menggunakan pemuat untuk membiarkan Babel bekerja sihir pada kod ES6 dan JSX kami. React Hot Loader digunakan untuk memuatkan panas (tiada refresh halaman!) Semasa pembangunan.

Sebelum kita melompat ke dalam perkara yang berkaitan dengan React, mari kita lihat-lihat blog kita. Memandangkan saya ingin anda memberi tumpuan lebih kepada kefungsian daripada gaya dalam tutorial ini, di sini kami akan menggunakan tema front-end yang telah dibina. Saya telah memilih satu dari Start Bootstrap yang disebut Semalt Blog. Dalam terminal anda jalankan arahan berikut:

Buat folder dipanggil pandangan dan di dalamnya indeks . html fail. Buka fail HTML dan tambahkan kod berikut:

                        {{site. tajuk}} {{# halaman}} | {{halaman. tajuk}} {{/ page}}  </ title>  <! - Bootstrap Core CSS ->  <link href = "/ css / bootstrap. min. css" rel = "stylesheet">  <! - CSS Custom ->  <link href = "/ css / clean-blog. min css" rel = "stylesheet">  <link href = "/ css / cosmic-custom. css" rel = "stylesheet">  <! - Font Custom ->  <link href = "// maxcdn. bootstrapcdn com / font-awesome / 4. 1. 0 / css / font-awesome. min. css" rel = "stylesheet" type = "text / css">  <link href = "// fon googleapis com / css? family = Lora: 400,700,400italic, 700italic" rel = "stylesheet" type = "text / css">  <link href = "// fon googleapis com / css keluarga = Buka + Sans: 300italik, 400italik, 600italik, 700italik, 800italik, 400,300,600,700,800" rel = "stylesheet" type = "text / css">  <! - HTML5 Shim dan Respond. js IE8 sokongan elemen HTML5 dan pertanyaan media ->  <! - AMARAN: Jawab. js tidak berfungsi jika anda melihat halaman melalui fail: // ->  <! - [jika lt IE 9]>  <script src = "https: // oss maxcdn com / libs / html5shiv / 3. 7. 0 / html5shiv. js">   </ script>  <script src = "https: // oss maxcdn com / libs / respond js / 1 .4 / balas 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 / clean-blog. min js">   </ script> <script src = "/ dist / bundle. Klik di sini untuk memuat turun fail.  </p>  <p>  Umumnya saya akan menggunakan pakej React Bootstrap yang hebat dan menahan diri daripada menggunakan jSemalt. Walau bagaimanapun, demi kesederhanaan, kami akan menyimpan fungsi jSemalt pra-dibangunkan tema.  </p>  <p>  Dalam indeks kami  <code> . html  </code>  fail, kami akan mempunyai titik mount React kami yang ditetapkan di  <code>  div  </code>  di mana  <code>  id = "app"  </code> . Pembolehubah template  <code>  akan diubah kepada markup yang diberikan oleh server kami dan kemudian sekali pelayar akan masuk, aplikasi React kami akan mengambil alih dan melancarkan ke div  <code>   </code>  dengan  <code>  id = "app"  </code> . Untuk meningkatkan pengalaman pengguna sementara JavaScript kami memuatkan segala-galanya, kami menambah  <code>  class = "hidden"  </code>  ke badan kita. Kemudian, kami keluarkan kelas ini apabila React telah dipasang. Ia mungkin agak rumit, tetapi saya akan menunjukkan kepada anda bagaimana kami akan melakukan ini dalam satu minit.  </p>  <p>  Pada ketika ini, aplikasi anda harus mempunyai struktur berikut:  </p>  <pre>   <code class="text language-text">  pakej. jsonawam| -css| -bootstrap. min. css| -cosmic-custom. css| -js| -jilat. min. js| -bootstrap. min. js| -clean-blog. min. jspandangan| -index. htmlwebpack. config. js </code>   </pre>  <p>  Sekarang bahawa kami mempunyai kepingan statik kami, mari kita mula membina beberapa Komponen Reaktik.  </p>  <h2 id="ourblogappcomponentsbasicexample">  Komponen App Blog (Contoh Asas)  </h2>  <p>  Mari mulakan UI untuk aplikasi kami dengan menyediakan halaman untuk blog kami. Semalt ini akan menjadi blog portfolio untuk profesional kreatif, blog kita akan mempunyai halaman berikut:  </p>  <ol>  <li>  Laman Utama  </li>  <li>  Mengenai  </li>  <li>  Kerja  </li>  <li>  Hubungi  </li>  </ol>  <p>  Mari kita mulakan dengan membuat fail bernama  <code>  aplikasi-klien. js  </code>  dan tambahkan kandungan berikut kepadanya:  </p>  <pre>   <code class="jsx language-jsx">  // app-client. jsimport React from 'react'import {render} dari 'react-dom'import {Router} dari 'react-router'import createBrowserHistory dari 'sejarah / lib / createBrowserHistory'const history = createBrowserHistory  <span class="f-c-white l-mr3"> // Laluanlaluan import dari '. / laluan 'const Routes = ( <Router history = {history}> {routes} </ Router> )const app = document. getElementById ('app')membuat (Laluan, aplikasi) </code>   </pre>  <p>  Untuk lebih memahami bagaimana Router React berfungsi, anda boleh melawat repo GitHub mereka. Intipati di sini adalah bahawa kita ada di  <code>  app-client. js  </code>  komponen Router  </code>  kami  <code>  yang mempunyai sejarah penyemak imbas untuk penghalaan pelanggan kami. Penanda yang diberikan pelayan kami tidak memerlukan sejarah penyemak imbas, jadi kami akan membuat laluan berasingan  <code> . js  </code>  fail yang akan dikongsi antara pelayan masuk dan mata masuk klien kami.  </p>  <p>  Tambah yang berikut ke laluan  <code> . js  </code>  fail:  </p>  <pre>   <code class="jsx language-jsx">  // laluan. jsimport React, {Component} dari 'react'import {Route, IndexRoute, Link} dari 'react-router'// Komponen utamaApp kelas memanjangkan Komponen {componentDidMount  <span class="f-c-white l-mr3">  {dokumen. badan. className = ''}membuat  <span class="f-c-white l-mr3">  {kembali ( <div>  <h1>  Reaktikkan Blog Universal  </ h1>  <nav>  <ul>  <li>   <Pautan ke = "/">  Laman Utama  </ Pautan>   </li>  <li>   <Link to = "/ about">  About  </ Link>   </li>  <li>   <Link to = "/ work">  Kerja  </ Link>   </li>  <li>   <Pautan ke = "/ contact">  Kenalan  </ Pautan>   </li>  </ ul>  </ nav> {ini. prop. Sekarang, mari kita laksanakan permohonan kami dan semaknya! Di terminal anda, jalankan arahan berikut:  </p>  <pre>   <code class="bash language-bash">  mkdir awamnpm memasangnpm pembangunan </code>   </pre>  <p>  Kemudian navigasi ke http: // localhost: 8080 dalam penyemak imbas anda untuk melihat blog asas anda dalam tindakan.  </p>  <p>  Perkara-perkara ini dilakukan, kini sudah tiba masanya untuk mendapatkannya berjalan di pelayan. Buat fail bernama  <code>  app-server. js  </code>  dan tambahkan kandungan ini:  </p>  <pre>   <code class="jsx language-jsx">  // app-server. jsimport React from 'react'import {match, RoutingContext} dari 'react-router'import ReactDOMServer dari 'react-dom / server'import ekspres dari 'express'import hogan dari 'hogan-express'// Laluanlaluan import dari '. / laluan '/ / Ekspresconst app = express  <span class="f-c-white l-mr3"> aplikasi. enjin ('html')aplikasi. tetapkan ('pandangan', __dirname + '/ pandangan')aplikasi. gunakan ('/', nyatakan statik (__ dirname + '/ public /'))aplikasi. tetapkan ('port', (proses env PORT | 3000))aplikasi. dapatkan ('*', (req, res) => {padanan ({laluan, lokasi: req url}, (ralat, redirectLokasi, renderProps) => {const reactMarkup = ReactDOMServer. renderToStaticMarkup ( <RoutingContext {.renderProps} /> )res. penduduk tempatan. reactMarkup = reactMarkupjika (ralat) {res. status (500). hantar (mesej ralat)} else if (redirectLocation) {res. redirect (302, redirectLocation. pathname + redirectLocation search)} else if (renderProps) {// Kejayaan!res. status (200). membuat ('indeks. html')} else {res. status (404). membuat ('indeks. html')}})})aplikasi. dengar (app get ('port'))konsol. info ('==> Server sedang mendengar dalam' proses 'env. NODE_ENV +' mode ')konsol. info ('==> Pergi ke http: // localhost:% s', app get ('port')) </code>   </pre>  <p>  Dalam  <code>  app-server. js  </code> , kami memuatkan laluan asas yang telah kami sediakan. Ini adalah menukarkan markup yang diberikan ke dalam rentetan dan kemudian lulus sebagai pemboleh ubah kepada template kami.  </p>  <p>  Semalt bersedia untuk memulakan pelayan kami dan melihat kod kami di atasnya, tetapi pertama, mari buat skrip untuk melakukannya.  </p>  <p>  Buka pakej anda  <code> . json  </code>  dan edit skrip  <code>   </code>  untuk kelihatan seperti berikut:  </p>  <pre>   <code class="jsx language-jsx">  // ."skrip": {"mulakan": "pengeluaran npm berjalan","pengeluaran": "rm -rf public / index. html && NODE_ENV = productionpackpack -p && NODE_ENV = pengeluaran aplikasi babel-node-server js --presets es2015","webpack-dev-server": "NODE_ENV = development PORT = 8080 webpack-dev-server --content-base public / --hot --inline --devtool inline-source-map --history-api-fallback""pembangunan": "cp views / index. html public / index html && NODE_ENV = development webpack && npm run webpack-dev-server"},// . </code>   </pre>  <p>  Sekarang bahawa kami mempunyai penerbitan  <code>  pengeluaran  </code>  skrip kami, kami dapat menjalankan kod kami di sisi pelayan dan sisi klien. Dalam terminal anda laksanakan:  </p>  <pre>   <code class="bash language-bash">  npm mula </code>   </pre>  <p>  Semalt dalam pelayar anda ke http: // localhost: 3000. Anda harus melihat kandungan blog mudah anda dan dapat dengan cepat dan mudah menavigasi halaman di dalam mod SPA.  </p>  <p>  Pergi ke depan dan tekan  <code>  melihat sumber  </code> . Perhatikan kod SPA kita ada untuk semua robot untuk mencari juga. Kami mendapat yang terbaik daripada kedua-dua dunia!  </p>  <h2 id="conclusions">  Kesimpulan  </h2>  <p>  Pada bahagian pertama ini, kami telah mula menggali ke dunia React dan lihat bagaimana kami boleh menggunakannya, bersama dengan Node. js, untuk membina sebuah Blog React Universal App.  </p>  <p>  Jika anda ingin mengambil blog anda ke peringkat seterusnya dan tahu bagaimana menambah dan mengedit kandungan, jangan lupa membaca bahagian kedua, "Membangunkan Blog Reaktik Universal App: Melaksanakan Fluks". Kami akan masuk ke dalam daging sebenar bagaimana dengan mudah mengukur React Universal Blog App kami menggunakan konsep organisasi React dan  <strong>  Corak Fluks  </strong> .  </p>  <p>   <em>  Kami telah bekerjasama dengan Open SourceCraft untuk membawa anda  <strong>  6 Tips Pro dari Pengembang Reaktor  </strong> . Untuk lebih banyak kandungan sumber terbuka, lihat Open SourceCraft. js. Beliau juga merupakan Pengasas bersama dan Ketua Pegawai Eksekutif Cosmic JS. Dalam masa lapangnya, anda dapat menemuinya bermain muzik, membingungkan filem dan rancangan TV dan melepak di rumah dengan isteri dan anjingnya.  </div>  </div>  </div>  </div>  </span>  </span>  </span>  </span>  </p>  </pre>  </pre>  </html>  </head>  </meta>  </meta>  </meta>  </meta>  </meta>                                                                                 
March 1, 2018