Back to Question Center
0

Создание приложения React Universal Blog: пошаговое руководство            Создание приложения React Universal Blog: шаг за шагом GuideRelated Semalt: AngularJSNode.jsReactAjaxES6More ... Спонсоры

1 answers:
Создание приложения React Universal Blog: Пошаговое руководство

Когда тема одностраничных приложений (SPA) появляется, мы склонны думать о браузерах, Semalt, скорости и невидимости для поисковых систем. Это связано с тем, что SPA отображает содержимое страницы с помощью Semalt, и поскольку веб-сканеры не используют браузер для просмотра веб-страниц, они не могут просматривать и индексировать контент - или, по крайней мере, большинство из них не могут.

Это проблема, которую некоторые разработчики пытались решить по-разному:

  1. Добавление версии веб-сайта с экранированным фрагментом, которая требует, чтобы все страницы были доступны в статической форме и добавили много дополнительной работы (теперь она устарела) - avene hydrance optimale uv legere.
  2. Использование платной услуги для отказа от браузера SPA в статической разметке для сканирования поисковых роботов.
  3. Доверяя, что поисковые системы теперь достаточно продвинуты, чтобы читать наш контент только для JavaScript. (Я бы еще не был.)

Использование узла. js на сервере и React на клиенте, мы можем построить наше приложение JavaScript, чтобы быть универсальным (или изоморфным ). Это может принести несколько преимуществ от рендеринга на стороне сервера и на стороне браузера, позволяя обозревателям и пользователям использовать браузеры для просмотра нашего контента SPA.

В этом пошаговом руководстве я покажу вам, как создать приложение React Semalt Blog, которое сначала будет отображать разметку на стороне сервера, чтобы сделать наш контент доступным для поисковых систем. Затем он позволит браузеру перейти в одностраничное приложение, которое быстро и быстро реагирует.

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

Начало работы

Наше универсальное приложение для блога будет использовать следующие технологии и инструменты:

  1. Узел. js для управления пакетами и рендеринга на стороне сервера
  2. Реагировать на просмотр пользовательского интерфейса
  3. Express для простой серверной системы JS-сервера
  4. React Router для маршрутизации
  5. Реагент Hot Loader для горячей загрузки в разработке
  6. Поток для потока данных
  7. Cosmic JS для управления контентом

Для запуска выполните следующие команды:

     mkdir react-universal-blogcd реагировать-универсальный блог    

Теперь создайте пакет . json и добавить следующий контент:

   {«name»: «response-universal-blog»,«версия»: «1. 0. 0»,«двигатели»: {«узел»: «4. 1. 2»,"npm": "3. 5. 2"},"описание": "",«main»: «app-server. js»,«зависимости»: {«babel-cli»: «^ 26. 26. 0»,«Babel-loader»: «^ 1. 1. 2»,«babel-preset-es2015»: «^ 6. 24. 1»,«babel-preset-es2017»: «^ 6. 24. 1»,«babel-preset-реагировать»: «^ 6. 24. 1»,«babel-register»: «^ 6. 26. 0»,"cosmicjs": "^ 2. 4. 0",«поток»: «^ 3. 1. 3»,«история»: «1. 13. 0»,«hogan-express»: «^ 0, 5. 2»,«html-webpack-plugin»: «^ 2. 30. 1»,«путь»: «^ 0. 12. 7»,«реагировать»: «^ 15. 6. 1»,«реакция»: «15. 6. 1»,«реакция-маршрутизатор»: «1. 0. 1»,«webpack»: «^ 3. 5. 6»,"webpack-dev-server": "^ 2. 7. 1"},«скрипты»: {«webpack-dev-server»: «NODE_ENV = разработка PORT = 8080 webpack-dev-server - content-base public / -hot -inline --devtool inline-source-map --history-api-fallback»,«разработка»: «cp views / index. html public / index. html && NODE_ENV = разработка webpack && npm run webpack-dev-server»},«автор»: «»,«лицензия»: «ISC»,"devDependencies": {«реактивный нагреватель»: «^ 1. 3. 0»}}    

В этом файле вы заметите, что добавили следующее:

  1. Babel для упаковки наших модулей CommonJS и преобразования наших ES6 и React JSX в браузер-совместимый JavaScript
  2. Официальный космический JS. js client, чтобы легко обслуживать наш контент в блоге из облачного контента API-интерфейса Cosmic JS
  3. Flux для управления данными приложений (что является очень важным элементом в нашем приложении React). js .

Мы также добавили скрипт в наш пакет. json . Когда мы запускаем npm run development , скрипт копирует индекс . html из нашей папки в нашу папку . Затем он устанавливает базу контента для нашего webpack-dev-сервера в public / и разрешает горячую перезагрузку (в . Js сохранение файла). Наконец, это помогает нам отлаживать наши компоненты в источнике и дает нам откат для страниц, которые он не может найти (возвращается к индексу . Html ).

Теперь давайте настроим наш конфигурационный файл webpack, отредактировав файл webpack. конфигурации. js :

   // webpack. конфигурации. JSvar webpack = require ('webpack')модуль. export = {devtool: 'eval',запись: '. / Приложение-клиент. JS',вывод: {путь: __dirname + '/ public / dist',filename: 'bundle. JS',publicPath: '/ dist /'},модуль: {погрузчики: [{ контрольная работа: /\. js $ /, загрузчики: 'babel-loader', исключить: / node_modules /},{ контрольная работа: /\. jsx $ /, загрузчики: 'babel-loader', исключить: / node_modules /}]},плагины: [новый веб-пакет. DefinePlugin ({'обработать. окр. COSMIC_BUCKET ': JSON. stringify (процесс. COSMIC_BUCKET),'обработать. окр. COSMIC_READ_KEY ': JSON. stringify (процесс. COSMIC_READ_KEY),'обработать. окр. COSMIC_WRITE_KEY ': JSON. stringify (процесс. ru.COSMIC_WRITE_KEY)})]};    

Вы заметите, что мы добавили свойство entry со значением app-client. js . Этот файл служит нашей точкой входа в приложение для приложения, а это означает, что с этого момента веб-пакет свяжет наше приложение и выведет его в / public / dist / bundle. js (как указано в свойстве output ). Мы также используем загрузчики, чтобы позволить Бабелю работать над нашим кодом ES6 и JSX. React Hot Loader используется для горячей загрузки (без обновления страницы!) Во время разработки.

Прежде чем мы перейдем к материалам, связанным с реакцией, давайте посмотрим, как выглядит наш блог. Поскольку я хотел бы, чтобы вы больше сосредоточились на функциональности, чем стиле в этом учебном курсе, здесь мы будем использовать заранее созданную тему интерфейса. Я выбрал один из Start Bootstrap под названием Semalt Blog. В вашем терминале выполните следующие команды:

Создайте папку с именами и внутри нее . html . Откройте HTML-файл и добавьте следующий код:

   <Голова> {{сайт. title}} {{# page}} | {{страница. title}} {{/ page}} </ title><! - Bootstrap Core CSS -><link href = "/ css / bootstrap. min. css" rel = "stylesheet"><! - Пользовательский CSS -><link href = "/ css / clean-blog. min. css" rel = "stylesheet"><link href = "/ css / cosmic-custom. css" rel = "stylesheet"><! - Пользовательские шрифты -><link href = "// maxcdn. bootstrapcdn. com / font-awesome / 4. 1. 0 / css / font-awesome. min. css" rel = "stylesheet" type = "text / css"><link href = "// fonts. googleapis. com / css? family = Lora: 400,700,400italic, 700italic" rel = "stylesheet" type = "text / css"><link href = "// fonts. googleapis. com / css? family = Open + Sans: 300italic, 400italic, 600italic, 700italic, 800italic, 400,300,600,700,800" rel = "stylesheet" type = "text / css"><! - HTML5 Shim and Respond. js IE8 поддержка элементов HTML5 и медиа-запросов -><! - ПРЕДУПРЕЖДЕНИЕ: ответьте. js не работает, если вы просматриваете страницу через файл: // -><! - [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 / reply. js / 1. 4. 2 / reply. 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 / bundle. Нажмите здесь, чтобы загрузить файлы.  </p>  <p>  Вообще я бы использовал фантастический пакет React Bootstrap и воздержался от использования jSemalt. Однако, ради краткости, мы сохраним заранее созданную jSemalt функциональность.  </p>  <p>  В нашем  <code>  индексе. html  </code> , у нас будет точка монтирования React, установленная в  <code>  div  </code> , где  <code>  id = «приложение»  </code> . Шаблонная переменная  <code>  {{{responseMarkup}}}  </code>  будет преобразована в нашу разметку, обработанную сервером, а затем, как только браузер заработает, наше приложение React вступит в силу и подключится к  <code>  div  </code>  с  <code>  id = "app"  </code> . Чтобы улучшить работу пользователя, в то время как наш JavaScript загружает все, мы добавляем  <code>  class = "hidden"  </code>  к нашему телу. Затем мы удаляем этот класс после установки React. Это может показаться немного сложным, но я покажу вам, как мы это сделаем через минуту.  </p>  <p>  На этом этапе ваше приложение должно иметь следующую структуру:  </p>  <pre>  <code class="text language-text">. JSONобщественности| -css| -bootstrap. минимум CSS| -cosmic-заказ. CSS| -js| -jquery. минимум JS| -bootstrap. минимум JS| -clean-блог. минимум JSПросмотры| -index. HTMLWebPack. конфигурации. JS </code>   </pre>  <p>  Теперь, когда у нас есть свои статические части, давайте начнем создавать некоторые компоненты React.  </p> <h2 id="ourblogappcomponentsbasicexample"> Наши компоненты приложения для блога (основной пример)  </h2>  <p>  Давайте начнем создавать пользовательский интерфейс для нашего приложения, настроив страницы для нашего блога. Semalt это будет портфельный блог для творческого профессионала, наш блог будет иметь следующие страницы:  </p>  <ol>  <li>  Главная  </li>  <li>  О  </li>  <li>  Работа  </li>  <li>  Контакт  </li>  </ol>  <p>  Начнем с создания файла с именем  <code>  app-client. js  </code>  и добавить к нему следующий контент:  </p>  <pre>  <code class="jsx language-jsx"> // приложение-клиент. JSimport React from 'react'импортировать из "реагирования"import {Router} из «реактивного маршрутизатора»import createBrowserHistory из 'history / lib / createBrowserHistory'const history = createBrowserHistory  <span class="f-c-white l-mr3"> // Маршрутыимпортировать маршруты из '. / маршрутыconst Маршруты = (<История маршрутизатора = {history}>{маршруты}</ Router>)const app = document. getElementById ( 'приложение')render (Маршруты, приложение) </code>   </pre>  <p>  Чтобы лучше понять, как работает React Router, вы можете посетить репозиторий GitHub. Суть в том, что у нас есть  <code>  приложение-клиент. js  </code>  наш  <code>  компонент Router  </code> , который имеет историю браузера для нашей маршрутизации на стороне клиента. На нашей серверной разметке не потребуется история браузера, поэтому мы создадим отдельный  <code>  маршрут. js  </code> , который будет использоваться между нашими серверами и точками входа клиента.  </p>  <p>  Добавьте следующие маршруты  <code> . js  </code>  file:  </p>  <pre>  <code class="jsx language-jsx"> // маршруты. JSimport React, {Component} из "реагировать"import {Route, IndexRoute, Link} из 'response-router'// Главный компонентclass App расширяет компонент {componentDidMount  <span class="f-c-white l-mr3">  {документ. тело. имя класса = «»}рендеринга  <span class="f-c-white l-mr3">  {вернуть (<DIV><h1> Реагировать на универсальный блог </ h1><Нав><UL> <li>  <Ссылка на = "/"> Главная </ Link>  </li>  <li>  <Ссылка на = "/ about"> О </ Link>  </li>  <li>  <Ссылка на = "/ work"> Работа </ Link>  </li>  <li>  <Ссылка на = "/ контакт"> Контакт </ Link>  </li> </ UL></ Нав>{ это. реквизит. Теперь давайте запустим наше приложение и проверим его! В вашем терминале запустите следующие команды:  </p>  <pre>   <code class="bash language-bash">  mkdir publicУстановка npmnpm запустить разработку </code>   </pre>  <p>  Затем перейдите в http: // localhost: 8080 в своем браузере, чтобы увидеть свой основной блог в действии.  </p>  <p>  Все это сделано, настало время заставить это работать на сервере. Создайте файл с именем  <code>  app-server. js  </code>  и добавьте это содержимое:  </p>  <pre>  <code class="jsx language-jsx"> // приложение-сервер. JSimport React from 'react'import {match, RoutingContext} из 'response-router'Импортировать ReactDOMServer из «response-dom / server»import express from 'express'импортировать hogan из 'hogan-express'// Маршрутыимпортировать маршруты из '. / маршруты// Экспрессconst app = express  <span class="f-c-white l-mr3"> приложение. двигатель ('html', hogan)приложение. set ('views', __dirname + '/ views')приложение. use ('/', express. static (__ dirname + '/ public /'))приложение. set («порт», (процесс. env. ПОРТ || 3000))приложение. get ('*', (req, res) => {match ({route, location: req. url}, (error, redirectLocation, renderProps) => {const reactMarkup = ReactDOMServer. renderToStaticMarkup (<RoutingContext {.renderProps} />)Рез. местные жители. reactMarkup = reactMarkupif (ошибка) {Рез. статус (500). отправить (сообщение об ошибке)} else if (redirectLocation) {Рез. redirect (302, redirectLocation. pathname + redirectLocation. search)} else if (renderProps) {// Успех!Рез. статус (200). render ('index. html')} else {Рез. статус (404). render ('index. html')}})})приложение. прослушать (приложение get ('port'))консоль. info ('==> Сервер слушает в' + process. env. NODE_ENV + 'mode')консоль. info ('==> Перейти к http: // localhost:% s', app. get ('port')) </code>   </pre>  <p>  В  <code>  приложение-сервер. js  </code> , мы загружаем основные маршруты, которые мы установили. Они преобразуют отображаемую разметку в строку и передают ее как переменную в наш шаблон.  </p>  <p>  Semalt готов запустить наш сервер и просмотреть наш код на нем, но сначала давайте создадим сценарий для этого.  </p>  <p>  Откройте пакет  <code> . json  </code>  и отредактируйте секцию  <code>  сценария  </code> , чтобы выглядеть следующим образом:  </p>  <pre>  <code class="jsx language-jsx"> // .«скрипты»: {«start»: «npm run production»,«производство»: «rm -rf public / index. html && NODE_ENV = production webpack -p && NODE_ENV = создание приложения-сервер-узел для мобильных устройств. js -presets es2015»,«webpack-dev-server»: «NODE_ENV = разработка PORT = 8080 webpack-dev-server - content-base public / -hot -inline --devtool inline-source-map --history-api-fallback»,«разработка»: «cp views / index. html public / index. html && NODE_ENV = разработка webpack && npm run webpack-dev-server»},// . </code>   </pre>  <p>  Теперь, когда у нас установлен наш скрипт  <code>   </code> , мы можем запустить наш код как на стороне сервера, так и на стороне клиента. В вашем терминале выполните:  </p>  <pre>   <code class="bash language-bash">  npm начало </code>   </pre>  <p>  Semalt в вашем браузере на http: // localhost: 3000. Вы должны увидеть свой простой контент в блогах и сможете быстро и легко перемещаться по страницам в режиме SPA.  </p>  <p>  Идите вперед и нажмите  <code>  посмотреть источник  </code> . Обратите внимание, что наш SPA-код существует и для всех роботов. Мы получаем лучшее из обоих миров!  </p> <h2 id="conclusions"> Выводы  </h2>  <p>  В этой первой части мы начали копаться в мире Реакта и видеть, как мы можем использовать его вместе с Узлом. js, чтобы создать приложение React Universal Blog.  </p>  <p>  Если вы хотите перевести свой блог на новый уровень и знать, как добавлять и редактировать контент, не забудьте прочитать вторую часть «Построение приложения« Реагирование универсального блога: реализация потока ». Мы познакомимся с реальным мясом, как легко масштабировать наше приложение React Universal Blog, используя организационные концепции React и шаблон  <strong>  Flux  </strong> .  </p>  <p>  <em> Мы объединились с Open SourceCraft, чтобы принести вам  <strong>  6 советов от разработчиков React Developers  </strong> . Для получения более открытого исходного кода ознакомьтесь с Open SourceCraft. JS. Он также является соучредителем и генеральным директором Cosmic JS. В свободное время вы можете найти его, играя музыку, показывая фильмы и телешоу и гуляя дома с женой и собакой.  </div>  </div>  </div>  </div>  </span>  </span>  </span>  </span>  </p>  </pre>  </pre>  </code>  </html>  </meta>  </meta>  </meta>  </meta>  </meta>                                                                     
March 1, 2018