Статьи

Используйте React Today в Ruby, отправившись на Кубу

реагировать

Вы все слышали о React. Это уже не новичок в этом блоке, и он достаточно укрепился в изменчивой экосистеме Javascript, поэтому нас не волнует изучение чего-то, что будет излишним через 6 месяцев. Реакция основана на некоторых очень хороших идеях; Он заменяет представление в шаблоне Model-View-Controller виртуальной объектной моделью документа и невероятно быстрым алгоритмом сравнения, который гарантирует, что единственные обновления на странице — это внесенные вами изменения. Единственным недостатком является необходимость писать JSX или Javascript! К счастью, мы можем обойти это с некоторыми API Ruby, разработанными для решения именно этой проблемы.

React подходит для вашего приложения?

Реакция светит при использовании с одностраничными приложениями или в любом случае, когда частичная перезагрузка страницы выгодна. Начиная с 4.0 Rails имеет Turbolinks (подумайте PJAX, если вы не знакомы), поэтому, если вы ищете скорость с помощью частичного повторного рендеринга, вам, вероятно, лучше с этим. React также не предлагает вам никаких функций AJAX, уровня данных или любых других вещей, которые мы считаем само собой разумеющимися в современной веб-разработке. Так что, если вы думаете об этом как о замене Rails, у вас будет плохое время.

Кроме того, поскольку он в основном предназначен для динамического повторного рендеринга страниц, это будет большой инвестицией при небольшой прибыли, если у вас сайт в основном статичный. Да, и если вы поддерживаете браузеры ниже IE9, то это не для вас, потому что React с ними не работает и никогда не будет. Короче говоря, и все, что угодно, если вы не используете сильные стороны используемого вами инструмента, вам, вероятно, лучше не использовать его.

С этим из пути, давайте начнем!

интеграция

Вы хотите интегрировать это в свой проект Rails? Нет проблем! В экосистеме Rails есть несколько методов интеграции, в том числе WebPack, Gulp и несколько плагинов (по видимому, на момент написания статьи реактивные рельсы лидируют в пакете), которые делают именно это. Что если вы не используете Rails? Что делать, если вы предпочитаете легкость, предоставляемую вам такими микросистемами, как Куба или Синатра? Ну, тогда у нас есть немного больше работы.

Сначала запустите новый проект скелета. Для этого мы будем использовать Кубу, но она будет одинаково хорошо работать с Синатрой (с некоторыми небольшими изменениями в вашем config.ru ). Для быстрых и грязных проектов я использую превосходную Cuba Genie , которая объединяет Bootstrap, Cuba и кучу приятных штрихов в простой проект.

Предполагая, что у вас работает простой проект, вот как вы интегрируете React:

Добавьте следующие Gems в ваш Gemfile:

gem "opal-jquery"
gem "reactive-ruby"

и запустите bundle install

Сначала создайте несколько простых шаблонов HTML. Я использую ссыпку :

 <!-- views/layout.mote -->
<!doctype html>
<html>
  <head>
    <script src="/assets/react.js"></script>
    <script>{{ app.loader }}</script>
  </head>
  <body>
    <div id="layout">
        {{ content }}
    </div>
  </body>
</html>

<!-- home.mote -->
<div id='content'></div>

Здесь есть о чем поговорить: во-первых, включение <div id="content"> Те из вас, кто заглянул в учебник по React, могут вспомнить, что React нужна точка монтирования на DOM. Это то, что.

/assets/react.js — этот файл не существует в нашей файловой системе; он переносится во время выполнения из response.rb , который мы рассмотрим чуть позже .

{{ app.loader }}

 if (typeof(Opal) !== 'undefined') {
  Opal.mark_as_loaded("opal");
  Opal.mark_as_loaded("corelib/runtime.self");
  Opal.mark_as_loaded("jquery.self");
  Opal.mark_as_loaded("sources/react.self");
  Opal.load("react");
}

Это обрабатывает загрузку сторонних библиотек, включая React и jQuery, и позволяет транспортеру обслуживать JS, сгенерированный из нашего кода Ruby. Это не работает без этой строки.

Теперь давайте создадим простой класс React. Несмотря на тип файла, он будет находиться в вашем каталоге js :

 # react.rb:
require 'opal'
require 'jquery'
require 'opal-jquery'
require 'reactive-ruby'

class HelloWorld
  include React::Component
  def render
    h1 {"Hello, World!"}
  end
end

Это простой divh1Hello, World Это эквивалент следующего JSX:

 ReactDOM.render(<h1>Hello World</h1>, document.getElementById('content'));

Мы будем использовать событие document.ready Это требует добавления jQuery в ваш проект:

 Document.ready? do
  React.render(React.create_element(HelloWorld), Element["#content"])
end

Далее нам нужно добавить метод загрузчика в наш экземпляр Cuba. Это можно сделать, добавив этот код в свой класс Кубы:

 # app.rb
require 'opal'
def loader
  opal = Opal::Server.new {|s|
    s.append_path 'js'
    s.main = 'react'
  }
  Opal::Processor.load_asset_code(opal.sprockets, 'react')
end

Наконец, ничего из этого не будет работать без нескольких модификаций нашего config.ru : нам нужно обслуживать наши ресурсы, устанавливать некоторые переменные шаблона и готовить наше приложение для переноса. Ваш config.ru должен выглядеть так:

 # config.ru
require 'bundler'
require_relative 'app'

Bundler.require

opal = Opal::Server.new {|s|
  s.append_path 'js'
  s.main = 'app'
}

sprockets   = opal.sprockets
maps_prefix = '/__OPAL_SOURCE_MAPS__'
maps_app    = Opal::SourceMapServer.new(sprockets, maps_prefix)

# Monkeypatch sourcemap header support into sprockets
::Opal::Sprockets::SourceMapHeaderPatch.inject!(maps_prefix)

map maps_prefix do
  run maps_app
end

map '/assets' do
  run sprockets
end

run(Cuba)

Это запускает сервер Opal, устанавливает точки входа для транспилятора, внедряет поддержку заголовков в звездочки и выполняет все это из каталога активов.

Момент истины: перейдите к 127.0.0.1:9292

 `Hello, World`

Поздравляем; Теперь вы используете передовые технологии Javascript в микросхемах!

Примечания

Это удивительно большой объем работы по интеграции чего-либо в ваш проект. Нам пришлось настраивать транспортеры, устанавливать точки монтирования, определять точки входа, писать HTML. и все для «Hello World!». Я быстро устал от этого и написал Gem под названием cuba_react, чтобы сделать все это для вас. Я бы рекомендовал использовать этот драгоценный камень вместо того, чтобы тратить часы на консоль отладки Pry, пытаясь выяснить, по какой причине ваш транспортер не видит исходные файлы или не возвращает то, что вы думаете.

Что еще более важно, самоцвет автоматизирует все это и позволит вам пропустить скучные вещи и просто начать играть с React! Добавьте cuba_reactGemfile , bundle installcuba_react generate Документацию можно найти здесь .

Расширяя наш пример

Естественно, «Hello, World!» Практически бесполезен в реальном мире, поэтому вам следует немного расширить наш пример. Ознакомьтесь с превосходными документами о реакторе для некоторых примеров того, что возможно, но вот простой класс входа в систему:

 class Nav < React::Component::Base
  def render
    div do
      input(class: :handle, type: :text, placeholder: "Enter Your Handle")
      button(type: :button) { "login!" }.on(:click) do
        alert("#{Element['input.handle'].value} logs in!")
      end
    end
  end
end

Что касается следующих шагов, я бы посоветовал ознакомиться с официальным руководством по началу работы с React, которое не является лучшей документацией, которую я когда-либо видел, но, безусловно, познакомит вас с некоторыми концепциями. Все примеры приведены в JSX, так что читателю нужно перевести их на Ruby, но это должно быть довольно просто и приятное руководство для React. После этого я бы порекомендовал « Отреагировать» для начинающих. Это отличная серия видеороликов, в которых объясняются концепции, лежащие в основе фреймворка, и пошаговое руководство, в котором рассказывается, как создать относительно сложное приложение. Есть и несколько отличных egghead.io React видео тоже.

Я надеюсь, что это было полезным занятием, и теперь вы в лучшем положении, чтобы включить React в проект на Кубе. Удачного кодирования!