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. Добавление версии веб-сайта с экранированным фрагментом, которая требует, чтобы все страницы были доступны в статической форме и добавили много дополнительной работы (теперь она устарела).
  2. Использование платной услуги для отказа от браузера SPA в статической разметке для сканирования поисковых роботов.
  3. Доверяя, что поисковые системы теперь достаточно продвинуты, чтобы читать наш контент только для JavaScript. (Я бы еще не был - sehr dehnbarer stoff.)

Использование узла. 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