Back to Question Center
0

Xây dựng ứng dụng Blog Phản ứng Chung: Hướng dẫn Từng bước            Xây dựng ứng dụng Blog Phản ứng toàn cầu: Hướng dẫn từng bướcBản thảo Semal: AngularJSNode.jsReactAjaxES6Thêm ... Nhà tài trợ

1 answers:
Xây dựng ứng dụng Phản hồi toàn cầu Blog: Hướng dẫn Từng bước
(số 8)

Khi chủ đề của các ứng dụng một trang đơn (SPAs) xuất hiện, chúng ta có xu hướng nghĩ đến các trình duyệt, Semalt, tốc độ, và sự vô hình đối với các công cụ tìm kiếm. Điều này là do một SPA đưa nội dung của một trang bằng Semalt, và vì trình thu thập thông tin web không sử dụng một trình duyệt để xem các trang web, họ không thể xem và lập chỉ mục nội dung - hoặc ít nhất thì hầu hết chúng không thể.

Đây là một vấn đề mà một số nhà phát triển đã cố gắng giải quyết bằng nhiều cách khác nhau:

  1. Thêm một phiên bản đoạn trích thoát của một trang web, đòi hỏi tất cả các trang sẽ có sẵn ở dạng tĩnh và thêm rất nhiều công việc phụ (bây giờ không được hỗ trợ).
  2. Sử dụng dịch vụ trả phí để hủy trình duyệt một SPA thành các đánh dấu tĩnh cho nhện nhện của công cụ tìm kiếm để thu thập dữ liệu.
  3. Tin tưởng rằng các công cụ tìm kiếm hiện đã đủ tiên tiến để đọc nội dung chỉ chứa JavaScript của chúng tôi - oculos ray ban sol feminino. (Tôi sẽ không chỉ được nêu ra.)

Sử dụng nút. js trên máy chủ và Phản ứng trên máy khách, chúng tôi có thể xây dựng ứng dụng JavaScript của chúng tôi là phổ (hoặc isomorphic ). Điều này có thể mang lại nhiều lợi ích từ việc hiển thị phía máy chủ và trình duyệt, cho phép cả công cụ tìm kiếm và con người sử dụng các trình duyệt để xem nội dung SPA của chúng tôi.

Trong hướng dẫn từng bước này, tôi sẽ giới thiệu cho các bạn cách xây dựng ứng dụng Blog phản ứng Hoán vị trước tiên sẽ hiển thị đánh dấu ở phía máy chủ để làm cho nội dung của chúng tôi có sẵn cho các công cụ tìm kiếm. Sau đó, nó sẽ cho phép trình duyệt tiếp quản trong một ứng dụng trang duy nhất cả nhanh lẫn nhạy.

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

Bắt đầu

Ứng dụng blog phổ quát của chúng tôi sẽ sử dụng các công nghệ và công cụ sau:

  1. Nút. js để quản lý gói và dựng trình phía máy chủ
  2. Phản hồi cho giao diện người dùng
  3. Express cho một khuôn khổ máy chủ JS dễ dàng back-end
  4. React Router để định tuyến
  5. React Loader nóng cho tải nóng trong phát triển
  6. Lưu lượng dữ liệu
  7. Cosmic JS để quản lý nội dung

Để bắt đầu, chạy các lệnh sau:

     mkdir react-universal-blogcd react-universal-blog    

Bây giờ tạo một gói . json và thêm các nội dung sau:

   {"tên": "react-universal-blog","phiên bản": "1. 0. 0","động cơ": {"nút": "4. 1. 2","npm": "3. 5. 2"},"sự miêu tả": "","main": "app-server .js", ""phụ thuộc": {"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","thông lượng": "^ 3 .1 3","lịch sử": "1. 13. 0","hogan-express": "^ 0 5. 2","html-webpack-plugin": "^ 2. 30. 1","con đường": "^ 0 12. 7","phản ứng": "^ 15.6.1","phản ứng-dom": "^ 15 6. 1","react-router": "1. 0. 1","webpack": "^ 3 5. 6","webpack-dev-server": "^ 2 7. 1"},"kịch bản": {"webpack-dev-server": "NODE_ENV = development PORT = 8080 webpack-dev-server --chức năng cơ bản công cộng / --hot --inline --devtool inline-source-map --history-api-fallback""phát triển": "cp views / index html /. html & & NODE_ENV = phát triển webpack && npm chạy webpack-dev-server"},"tác giả": "","giấy phép": "ISC","devDependencies": {"react-hot-loader": "^ 1. 3. 0"}}    

Trong tệp tin này, bạn sẽ nhận thấy rằng chúng tôi đã thêm các thông tin sau:

  1. Babel để đóng gói các mô-đun CommonJS của chúng tôi và chuyển đổi ES6 của chúng tôi và phản ứng JSX thành trình duyệt tương thích với trình duyệt JavaScript
  2. Node chính thức của vũ trụ JS. js để dễ dàng phân phát nội dung blog của chúng tôi từ API nội dung của Vũ trụ của JS trên đám mây
  3. Flux để quản lý dữ liệu ứng dụng (đây là một yếu tố rất quan trọng trong ứng dụng React của chúng tôi). js .

Chúng tôi cũng thêm một kịch bản trong gói của chúng tôi . json . Khi chúng tôi chạy npm run development , kịch bản sao chép chỉ mục . html từ thư mục của chúng tôi vào thư mục công cộng của chúng tôi. Sau đó, nó thiết lập cơ sở dữ liệu cho máy chủ webpack của chúng tôi đến công cộng / và cho phép tải lại nóng (trên . Js file save). Cuối cùng, nó giúp chúng tôi gỡ lỗi các thành phần của chúng ta tại nguồn và cho chúng ta một dự phòng cho các trang mà nó không thể tìm thấy (giảm trở lại chỉ mục. Html ).

Giờ hãy thiết lập tệp cấu hình webpack của chúng tôi bằng cách chỉnh sửa tệp webpack . config. js :

   // webpack. config. jsvar webpack = require ('webpack')module. xuất khẩu = {devtool: 'eval',mục: '. / ứng dụng khách. js ',đầu ra: {đường dẫn: __dirname + '/ public / dist',tên tệp: 'bó. js ',publicPath: '/ dist /'},mô-đun: {máy xúc: [{ kiểm tra: /\. js $ /, loaders: 'babel-loader', loại trừ: / node_modules /},{ kiểm tra: /\. jsx $ /, loaders: 'babel-loader', loại trừ: / node_modules /}]},bổ sung: [new webpack. DefinePlugin ({'quá trình. env. COSMIC_BUCKET ': JSON. stringify (quá trình.vsv COSMIC_BUCKET),'quá trình. env. COSMIC_READ_KEY ': JSON. stringify (quá trình.vvv COSMIC_READ_KEY),'quá trình. env. COSMIC_WRITE_KEY ': JSON. stringify (quá trình.vsv COSMIC_WRITE_KEY)})]};    

Bạn sẽ nhận thấy rằng chúng tôi đã thêm thuộc tính đầu vào với giá trị ứng dụng khách. js . Tệp này phục vụ như điểm truy cập ứng dụng của khách hàng của chúng tôi, có nghĩa là từ webpack điểm này sẽ gói ứng dụng của chúng tôi và xuất nó tới / public / dist / bundle. js (theo quy định tại thuộc tính đầu ra ). Chúng tôi cũng sử dụng bộ tải để cho phép Babel hoạt động phép thuật của nó trên mã ES6 và JSX của chúng tôi. React Hot Loader được sử dụng để tải nóng (không làm mới trang) trong quá trình phát triển.

Trước khi chúng tôi tham gia vào các nội dung phản hồi, chúng ta hãy có được cái nhìn và cảm giác của blog của chúng tôi đã sẵn sàng để đi. Vì tôi muốn bạn tập trung nhiều hơn vào chức năng hơn phong cách trong hướng dẫn này, ở đây chúng tôi sẽ sử dụng chủ đề front-end được xây dựng trước. Tôi đã chọn một từ Start Bootstrap được gọi là Semalt Blog. Trong terminal của bạn chạy các lệnh sau đây:

Tạo một thư mục gọi là view và bên trong nó một chỉ mục . tệp html . Mở tệp HTML và thêm mã sau:

    {{site. title}} {{# page}} | {{ trang. title}} {{/ page}} </ title><! - Bootstrap Core CSS -><link href = "/ css / bootstrap min.css" rel = "stylesheet"><! - Tuỳ chỉnh CSS -><link href = "/ css / clean-blog. min.css" rel = "stylesheet"><link href = "/ css / cosmic-custom.css" rel = "stylesheet"><! - Phông chữ tùy chỉnh -><link href = "// maxcdn / bootstrapcdn / com / font-awesome / 4. 1. 0 / css / font-awesome.css" rel = "stylesheet" type = "text / css"><link href = "// phông chữ googleapis.com / css? family = Lora: 400,700,400italic, 700italic" rel = "stylesheet" type = "text / css"><link href = "// phông chữ googleapis com / css family = Mở + Sans: 300italic, 400italic, 600italic, 700italic, 800italic, 400,300,600,700,800" rel = "stylesheet" type = "text / css"><! - HTML5 Shim and Respond. js IE8 hỗ trợ các thành phần HTML5 và các truy vấn truyền thông -><! - CẢNH BÁO: Trả lời. js không hoạt động nếu bạn xem trang qua tệp tin: // -><! - [if lt IE 9]><script src = "https: // oss. maxcdn. com / libs / html5shiv / 3. 7. 0 / html5shiv. js"> </ script><script src = "https: / / oss / maxcdn / com / libs / phản hồi js / 1. 4. 2 / trả lời 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 / clean-blog .min. js"> </ script><script src = "/ dist / bó. Nhấp vào đây để tải các tệp.  </p>  <p>  Nói chung tôi sẽ sử dụng React Bootstrap gói tuyệt vời và không sử dụng jSemalt. Tuy nhiên, vì tính ngắn gọn, chúng tôi sẽ giữ chức năng jSemalt được xây dựng sẵn của chủ đề.  </p>  <p>  Trong chỉ số  <code>  của chúng tôi. html  </code> , chúng ta sẽ có điểm gắn kết React của chúng ta tại  <code>  div  </code>  trong đó  <code>  id = "app"  </code> . Biến mẫu  <code>  {{{reactMarkup}}}  </code>  sẽ được chuyển đổi thành dấu đánh được tạo ra bởi máy chủ của chúng tôi và khi trình duyệt bật lên, ứng dụng Phản ứng của chúng tôi sẽ tiếp nhận và gắn kết vào  <code>  với  <code>  id = "ứng dụng"  </code> . Để cải thiện trải nghiệm người dùng trong khi JavaScript của chúng tôi tải mọi thứ, chúng tôi thêm  <code>  class = "hidden"  </code>  vào cơ thể của chúng tôi. Sau đó, chúng tôi loại bỏ lớp này một lần React đã được gắn kết. Nghe có vẻ hơi phức tạp, nhưng tôi sẽ chỉ cho bạn cách chúng tôi sẽ làm điều này trong một phút.  </p>  <p>  Tại thời điểm này, ứng dụng của bạn nên có cấu trúc sau đây:  </p>  <pre>  <code class="text language-text">. jsoncông cộng| -css| -bootstrap. phút css| -thế giới tự do. css| -j| -miền. phút js| -bootstrap. phút js| -ngang làm sạch. phút jslượt xem| -index. htmlwebpack. config. js </code>   </pre>  <p>  Bây giờ chúng ta đã hoàn thành các phần tĩnh của chúng ta, chúng ta hãy bắt đầu xây dựng một số React Components.  </p> <h2 id="ourblogappcomponentsbasicexample"> Các thành phần của Blog App (ví dụ cơ bản)  </h2>  <p>  Hãy bắt đầu xây dựng UI cho ứng dụng của chúng tôi bằng cách thiết lập các trang cho blog của chúng tôi. Semalt này sẽ là một blog danh mục đầu tư cho một chuyên gia sáng tạo, blog của chúng tôi sẽ có các trang sau đây:  </p>  <ol>  <li>  Trang chủ  </li>  <li>  Về  </li>  <li>  Công việc  </li>  <li>  Liên hệ  </li>  </ol>  <p>  Hãy bắt đầu bằng cách tạo một tập tin được gọi là  <code>  ứng dụng khách. js  </code>  và thêm nội dung sau vào nó:  </p>  <pre>  <code class="jsx language-jsx"> // ứng dụng khách. jsnhập khẩu Phản hồi từ 'phản ứng'nhập {render} từ 'react-dom'nhập {Router} từ 'react-router'nhập khẩu createBrowserHistory từ 'history / lib / createBrowserHistory'const history = createBrowserHistory  <span class="f-c-white l-mr3"> // Các tuyến đườngnhập từ ". / tuyến đường 'const Routes = (<Lịch sử Router = {history}>{routes}</ Router>)const app = tài liệu. getElementById ('app')render (Routes, app) </code>   </pre>  <p>  Để hiểu rõ hơn cách React Router hoạt động, bạn có thể ghé thăm repo GitHub của họ. Quan trọng ở đây là chúng tôi có trong ứng dụng khách  <code> . js  </code>  thành phần của chúng tôi  <code>  Router  </code>  có lịch sử trình duyệt để định tuyến phía máy khách của chúng tôi. Các đánh dấu được rendered bởi máy chủ của chúng tôi sẽ không cần lịch sử trình duyệt, vì vậy chúng tôi sẽ tạo ra các tuyến riêng  <code> . js  </code>  để chia sẻ giữa máy chủ của chúng tôi và các điểm nhập của khách hàng.  </p>  <p>  Thêm những điều sau vào  <code>  các tuyến. js  </code>  file:  </p>  <pre>  <code class="jsx language-jsx"> // các tuyến. jsnhập khẩu phản ứng, {Component} từ 'phản ứng'nhập {Route, IndexRoute, Link} từ 'react-router'// Thành phần chínhclass App mở rộng thành phần {componentDidMount  <span class="f-c-white l-mr3">  {tài liệu. thân hình. className = ''}render  <span class="f-c-white l-mr3">  {trở về (<div><h1> Phản hồi toàn cầu Blog </ h1><nav><ul> <li>  <Liên kết tới = "/"> Trang chủ </ Link>  </li>  <li>  <Link to = "/ about"> Giới thiệu về </ Link>  </li>  <li>  <Link to = "/ work"> Công việc </ Link>  </li>  <li>  <Liên kết đến = "/ liên hệ"> Liên hệ </ Link>  </li> </ ul></ nav>{ điều này. đạo cụ. Bây giờ, chúng ta hãy chạy ứng dụng của chúng tôi và kiểm tra nó ra! Trong thiết bị đầu cuối của bạn, chạy các lệnh sau:  </p>  <pre>   <code class="bash language-bash">  mkdir công cộngNPM cài đặtphát triển chạy npm </code>   </pre>  <p>  Sau đó, điều hướng đến http: // localhost: 8080 trong trình duyệt của bạn để xem blog cơ bản đang hoạt động.  </p>  <p>  Những việc này đã xong, bây giờ là lúc để chạy chương trình này trên máy chủ. Tạo một tệp tin gọi là máy chủ ứng dụng  <code> . js  </code>  và thêm nội dung này:  </p>  <pre>  <code class="jsx language-jsx"> // máy chủ ứng dụng. jsnhập khẩu Phản hồi từ 'phản ứng'import {match, RoutingContext} từ 'react-router'nhập khẩu ReactDOMServer từ 'react-dom / server'nhập từ từ 'express'nhập khẩu hogan từ 'hogan-express'// Các tuyến đườngnhập từ ". / tuyến đường '// Bày tỏconst app = express  <span class="f-c-white l-mr3"> ứng dụng. công cụ ('html', hogan)ứng dụng. set ('views', __dirname + '/ views')ứng dụng. sử dụng ('/', express. static (__ dirname + '/ public /'))ứng dụng. set ('port', (quá trình.vvv PORT || 3000))ứng dụng. get ('*', (req, res) => {match ({routes, location: req. url}, (error, redirectLocation, renderProps) => {const reactMarkup = ReactDOMServer. renderToStaticMarkup (<RoutingContext {.renderProps} />)res. người dân địa phương. phản ứngMarkup = phản ứngMarkupif (error) {res. tình trạng (500). gửi (lỗi. tin nhắn)} else if (redirectLocation) {res. chuyển hướng (302, redirectLocation, pathname + redirectLocation Tìm kiếm)} else if (renderProps) {// Sự thành công!res. tình trạng (200). render ('index. html')} else {res. tình trạng (404). render ('index. html')}})})ứng dụng. lắng nghe (app. get ('port'))bàn điều khiển. info ('==> Máy chủ đang nghe trong' + process. env. NODE_ENV + 'mode')bàn điều khiển. info ('==> Tới http: // localhost:% s', ứng dụng get ('port')) </code>   </pre>  <p>  Trong  <code>  máy chủ ứng dụng. js  </code> , chúng tôi đang tải các tuyến đường cơ bản mà chúng tôi đã thiết lập. Đây là những chuyển đổi đánh dấu kết xuất thành một chuỗi và sau đó chuyển nó như là một biến cho mẫu của chúng tôi.  </p>  <p>  Semalt đã sẵn sàng để bắt đầu máy chủ của chúng tôi và xem mã của chúng tôi về nó, nhưng trước tiên, chúng ta hãy tạo ra một kịch bản để làm như vậy.  </p>  <p>  Mở gói của bạn  <code> . json  </code>  và chỉnh sửa phần  <code>   </code>  để trông giống như sau:  </p>  <pre>  <code class="jsx language-jsx"> // ."kịch bản": {"bắt đầu": "sản xuất chạy npm","sản xuất": "rm -rf public / index. html && NODE_ENV = sản xuất webpack -p && NODE_ENV = sản xuất babel-node app-server js --presets es2015", ""webpack-dev-server": "NODE_ENV = development PORT = 8080 webpack-dev-server --chức năng cơ bản công cộng / --hot --inline --devtool inline-source-map --history-api-fallback""phát triển": "cp views / index html /. html & & NODE_ENV = phát triển webpack && npm chạy webpack-dev-server"},// . </code>   </pre>  <p>  Bây giờ chúng ta đã thiết lập tập lệnh  <code>   </code> , chúng ta có thể chạy mã của chúng ta ở cả phía máy chủ và phía máy khách. Trong thiết bị đầu cuối của bạn thực hiện:  </p>  <pre>   <code class="bash language-bash">  npm bắt đầu </code>   </pre>  <p>  Semalt trong trình duyệt của bạn tới http: // localhost: 3000. Bạn sẽ thấy nội dung blog đơn giản và có thể nhanh chóng và dễ dàng điều hướng qua các trang trong chế độ SPA.  </p>  <p>  Đi tiếp và nhấn  <code>  xem mã nguồn  </code> . Chú ý mã SPA của chúng tôi là ở đó cho tất cả các robot để tìm kiếm là tốt. Chúng tôi nhận được tốt nhất của cả hai thế giới!  </p> <h2 id="conclusions"> Kết luận  </h2>  <p>  Trong phần đầu tiên, chúng tôi đã bắt đầu đào sâu vào thế giới phản ứng và xem chúng ta có thể sử dụng nó như thế nào, cùng với Node. js, để xây dựng một React Universal Blog App.  </p>  <p>  Nếu bạn muốn đưa blog của bạn lên cấp độ tiếp theo và biết cách thêm và chỉnh sửa nội dung, đừng quên đọc phần thứ hai, "Xây dựng ứng dụng Phản hồi Phổ biến Blog: Thực hiện luồng thông tin". Chúng ta sẽ thực sự hiểu được làm thế nào để dễ dàng mở rộng ứng dụng React Universal Blog của chúng tôi bằng cách sử dụng các khái niệm Phản ứng về tổ chức và mô hình luồng  <strong> .  </p>  <p>  <em> Chúng tôi đã hợp tác với Open SourceCraft để mang lại cho bạn  <strong>  6 mẹo Pro từ Nhà phát triển Phản hồi  </strong> . Để biết thêm nội dung nguồn mở, hãy kiểm tra OpenCraft. js. Ông cũng là Đồng sáng lập và Giám đốc điều hành của Cosmic JS. Trong thời gian rảnh rỗi, bạn có thể tìm thấy anh ấy chơi nhạc, binging trên phim ảnh và chương trình truyền hình và đi chơi cùng với vợ và con chó.  </div>  </div>  </div>  </div>  </span>  </span>  </span>  </span>  </p>  </strong>  </li>  </li>  </pre>  </pre>  </code>  </html>  </head>  </meta>  </meta>  </meta>  </meta>  </meta>                                                                             
March 1, 2018