Tampilan baru pada pengembangan Fullstack dengan kerangka kerja Ruby on Rails

Apakah mungkin untuk serius membahas pengembangan fullstack? Jika Anda melihat kerangka besar untuk frontend dan backend, maka berbicara tentang fullstack terlihat meragukan. Saya menyarankan untuk melihat istilah fullstackdari sudut pandang Ruby on Rails dan prinsip-prinsip sederhana sebelumnya dalam menerapkan interaktivitas pada halaman web klasik. Saya menyajikan kepada Anda gambaran tentang fitur-fitur frontend yang disediakan dalam kerangka kerja Ruby on Rails atau yang terkait dengannya.

gambar


Ruby on Rails adalah kerangka kerja MVC yang berfokus pada pengembangan cepat, dan membayar banyak perhatian untuk menjaga konsistensi dalam suatu proyek (sehingga tidak berubah "bagaimanapun" "cepat"). Ini menyediakan banyak alat untuk pengembangan backend dan frontend. Dalam arah fullstack klasik, ada penghilangan sesaat karena ketidaktahuan tentang perkembangannya dan kesalahpahaman tentang keterlambatan dana yang digunakan. Tujuan artikel ini adalah untuk menyoroti bagaimana pendekatan fullstack berkembang dan berapa banyak kemungkinan menarik yang muncul di dalamnya.

Webpacker


Webpacker adalah permata yang dikirimkan bersama Ruby on Rails.

Webpacker menyediakan pembungkus di atas Webpack: perintah untuk menghubungkan dan memulai konfigurasi untuk pekerjaan. Webpacker de facto menetapkan standar untuk bekerja dengan frontend di Ruby on Rails, mempromosikan penggunaan fitur JavaScript terbaru dan prinsip-prinsip modern untuk bekerja dengan kode (struktur, modularitas, perakitan, dan banyak lagi).

Webpacker mendefinisikan konfigurasi umum yang diperlukan untuk memulai dan struktur aplikasi, yang meningkatkan kepastian dan menyederhanakan pemahaman proyek oleh pengembang yang berbeda. Untuk kode JavaScript, folder app/javascript/dengan file utama dialokasikan app/javascript/packs/application.js.

File dan folder ditambahkan oleh Webpacker
config/webpacker.yml
config/webpack/
config/webpack/development.js
config/webpack/environment.js
config/webpack/production.js
config/webpack/test.js
package.json
postcss.config.js
babel.config.js
.browserslistrc
node_modules/
bin/webpack
bin/webpack-dev-server
app/javascript/
app/javascript/packs/
app/javascript/packs/application.js


Webpacker mulai secara default selama proses pembuatan aplikasi baru dan melakukan pengaturannya. Anda dapat langsung membuat aplikasi dengan konfigurasi tambahan untuk Stimulus, Vue, Typcript atau yang lain dari daftar yang disediakan :

rails new myapp --webpack=stimulus

Atau instal konfigurasi tambahan setelah membuat aplikasi:

bundle exec rails webpacker:install:stimulus

Kembangkan Frontend dengan kerangka kerja Ruby on Rails = gunakan pendekatan pengembangan JavaScript terkini. Semua kenyamanan menggunakan standar JavaScript modern terintegrasi dengan baik dengan Ruby on Rails. Konfigurasi yang diperlukan disediakan untuk bekerja dengan Webpack, yang memungkinkan Anda untuk tidak terlalu terganggu oleh organisasi proyek yang benar dan fokus pada penyelesaian tugas-tugas populer menggunakan lingkungan yang akrab.

Turbolinks


Turbolinks adalah pustaka JavaScript yang dikirimkan bersama dengan Ruby on Rails.

Tugas prioritas Turbolinks adalah untuk meringankan beban di server dan mengurangi "jahitan" saat bernavigasi ke URL aplikasi. Fitur ini sering dibandingkan dengan SPA, karena memberikan kesan rendering ulang konten di browser alih-alih transisi polos antara halaman.

Prinsip operasi Turbolinks: untuk menavigasi antar halaman bukan dengan transisi standar ke alamat baru, tetapi dengan memenuhi permintaan ke alamat ini "di latar belakang" melalui ajax, memuat respons dalam JavaScript, dan mengganti konten halaman dengan yang baru. Proses ini disertai dengan acara khusus yang memungkinkan Anda untuk menambahkan fungsionalitas untuk transisi antar halaman dan untuk kembali ke halaman sebelumnya. Contohnya,
  • untuk memulai transisi ke alamat yang berbeda: turbolinks:click, turbolinks:before-visit, turbolinks:visit;
  • atau pengolahan dari permintaan untuk halaman baru: turbolinks:request-start, turbolinks:request-end;
  • atau pada proses menampilkan halaman baru turbolinks:before-render, turbolinks:render, turbolinks:load.

Selain itu, Turbolinks memiliki bilah progres, cache riwayat halaman yang dimuat dan memungkinkan Anda untuk menentukan elemen halaman yang tidak diperbarui.

Actioncable


ActionCable adalah bagian dari kerangka kerja Ruby on Rails. ActionCable membuat bekerja dengan soket web. Untuk daftar saluran di server, folder app/channels/dengan file utama channel.rbdan disediakan connection.rb. Untuk menerapkan koneksi ke saluran ini - folder app/javascript/channels/dengan file index.jsdan consumer.js.

Lebih baik berkenalan dengan kemungkinan ActionCable segera dengan sebuah contoh. Koneksi paling sederhana ke soket web dengan bantuannya dapat diimplementasikan hanya dalam beberapa langkah.

  1. Buat File Saluran

    aplikasi / saluran / hello_channel.rb
    # app/channels/hello_channel.rb
    class HelloChannel < ApplicationCable::Channel
      def subscribed
        stream_from "hello_1"
      end
    end
    

  2. Buat langganan ke saluran ini
    app / javascript / saluran / hello_channel.js
    // app/javascript/channels/hello_channel.js
    import consumer from "./consumer"
    
    consumer.subscriptions.create({ channel: "HelloChannel" }, {
      received(data) {
        console.log("Data received", data);
        document.body.innerText += `\nHello, ${data.name}!`
      }
    })
    


Dan koneksi ke soket web sudah siap.

Sekarang, untuk memeriksanya, kita perlu halaman sederhana dan tindakan untuk mengirim. Untuk melakukan ini, buat pengontrol dan tambahkan alamatnya ke rute

app / controllers / hello_controller.rb
# app/controllers/hello_controller.rb
class HelloController < ApplicationController
  def index
    render :html => "Hello page...", :layout => true
  end

  def new
    ActionCable.server.broadcast("hello_1", name: params[:name])
    head 200
  end
end


config / route.rb
# config/routes.rb
get "/hello" => "hello#index"
get "/hello/new" => "hello#new"


Kami memulai aplikasi, buka alamat 127.0.0.1haps000 / halo dan buka konsol browser, di dalamnya Anda dapat melihat pencatatan pesan yang datang dari server melalui soket web.

Selanjutnya, kami mengirim permintaan untuk surat tindakan:

curl http://127.0.0.1:3000/hello/new?name=World

Dan lihat halaman / halo dan output di konsolnya.

Formulir Pembantu dan Rel-ujs


Yang perlu diperhatikan adalah beberapa fitur yang tidak baru, tetapi sudah mapan dari kerangka kerja Ruby on Rails. Diantaranya adalah pembantu untuk representasi dan formulir. Kenyamanan awal para penolong adalah mereka memfasilitasi integrasi markup dengan model, konfigurasi, dan komponen backend lainnya. Keuntungan dari form helper daripada markup konvensional adalah kemampuan untuk dengan cepat mendaftarkan bidang form tanpa masuk ke detail pengikatannya pada atribut model - menggunakan helper, hubungan di antara mereka akan terbentuk secara otomatis. Sebuah fragmen yang menunjukkan contoh bidang formulir yang mengikat dengan parameter pengontrol dan atribut model:

app / views / articles / new.html.erb
<%# app/views/articles/new.html.erb %>
<%#      %>
<%= form_with(model: Article.new) do |f| %>
  <div>
    <%= f.label :title %>
    <%= f.text_field :title %>
  </div>
  <div>
    <%= f.label :text %>
    <%= f.text_area :text %>
  </div>
  <%= f.submit %>
<% end %>


config / locales / ru.yml
# config/locales/ru.yml
#       
ru:
  activerecord:
    attributes:
      article:
        title:  
        text:  


config / application.rb
# config/application.rb
#        config/application.rb
config.i18n.default_locale = :ru


app / controllers / articles_controller.rb
# app/controllers/articles_controller.rb
class ArticlesController < ApplicationController

  def new
    #  new   
    # rails -     
  end

  def create
    #        
    @article = Article.create(article_params)

    #    -    ,
    #    url  
    #   ,   
    redirect_to @article
  end

  private

  def article_params
    #      
    params.require(:article).permit(:title, :text)
  end
end


Anda dapat mempelajari lebih lanjut tentang contoh ini di sini dan di sini .

Rails-ujs


Rails-ujs adalah bagian inti dari kerangka kerja Ruby on Rails untuk JavaScript yang tidak mengganggu.
Rails-ujs menyediakan beberapa opsi tambahan untuk elemen halaman yang mengubah atau memperluas cara kerjanya.

Opsi jarak jauh - dirancang untuk elemen yang mengakses server (tautan, formulir) untuk membuat permintaan tidak sinkron. Contoh tautan:

<%= link_to " ", new_article_path, remote: true %>

Untuk menampilkan hasil query ini membutuhkan manipulasi tambahan, misalnya, menambahkan handler remote-peristiwa: ajax:success, ajax:error, ajax:complete.

Opsi konfirmasi - memungkinkan Anda untuk meminta konfirmasi tindakan sebelum dieksekusi.

<%= link_to "", article_path(article), method: :delete,
  data: { confirm: ' ,     ?' } %>


Opsi Disable_with - memungkinkan Anda untuk menonaktifkan item setelah aksi
<%= form.submit data: { disable_with: "..." } %>

Selain itu, Rails-ujs memiliki beberapa fitur praktis. Berikut adalah beberapa di antaranya:

Rails.fire(obj, name, data)- fungsi panggilan acara
Rails.ajax(options)- wrapper atas XMLHttpRequest
Rails.isCrossDomain(url)- verifikasi url milik domain lain
Rails.$(selector)- wrapper atas document.querySelectorAll Anda dapat

menghubungkan mereka ke kode Anda dengan perintah

import Rails from "@rails/ujs"

Rangsangan


Stimulus - Kerangka JavaScript dari pengembang Ruby on Rails.

Stimulus adalah salah satu kerangka kerja yang langka dan unik dengan caranya sendiri, karena menerapkan pengembangan frontend menggunakan pendekatan JavaScript baru, sementara itu tidak berusaha untuk mengendalikan semua tindakan Anda dan tidak memaksakan pemisahan frontend dari backend.

Tugas dasar Stimulus adalah untuk mengikat penangan ke acara. Menurut Stimulus, kode sumber harus ditempatkan pada kelas kontroler, dan metode mereka harus digunakan sebagai penangan. Secara default, folder app/javascript/controllers/dengan file utama dialokasikan untuk pengontrol stimulus dalam proyek index.js. Di sini kita dapat menambahkan pengontrol kita, untuk ini kita perlu membuat file dengan akhiran _controller.js, misalnya,articles_controller.js. Selanjutnya, loader Stimulus mengimpor file seperti itu dan menghubungkan controller ke blok yang sesuai di halaman kami.

Pengontrol di Stimulus memiliki peralatan tambahan: inisialisasi objek pengontrol ( initialize), pembantu untuk mengakses elemen di dalam blok ( targets, target), melampirkan objek pengontrol ke blok ( connect) dan melepaskannya ( disconnect), mengakses atribut data dari blok ( this.data.get). Berikut ini adalah contoh dari blok stateful aktif / tidak aktif yang ditulis dalam Stimulus.

app / views / home / show.html.erb
<%# app/views/home/show.html.erb %>

<%#   home   %>
<%#      (  ) %>
<div data-controller="home"
    data-home-active-text="Activated" data-home-deactive-text="Deactivated">

  <%#    text  home  %>
  <p data-target="home.text"></p>

  <%#   action click  home %>
  <button data-action="home#click"></button>

</div>



app / javascript / controllers / home_controller.js
// app/javascript/controllers/home_controller.js
import { Controller } from "stimulus"

export default class extends Controller {
  //  
  static targets = [ "text" ]

  initialize() {
    //      
    this.activeText = this.data.get("active-text");
    this.deactiveText = this.data.get("deactive-text");
  }

  connect() {
    //   /
    this.active = this.data.get("active") == "true";
    //  
    this.refresh();
  }

  disconnect() {
    //     
    this.element.setAttribute("data-home-active", !!this.active);
  }

  click() {
    //  
    this.active = !this.active;
    //  
    this.refresh();
  }

  //    
  refresh(){
    //     
    this.element.style.background =   this.active ? "none" : "#EEE";
    //  
    this.textTarget.innerHTML =   this.active ? this.activeText : this.deactiveText;
    //   
    this.textTarget.style.color = this.active ? "black" : "#777";
  }
}


Meskipun mempertahankan prinsip-prinsip lama untuk mengimplementasikan fungsi interaktif pada halaman klasik, pendekatan pengembangan dengan Stimulus meningkat secara signifikan: struktur kode sumber terstruktur dengan cara baru, pengikatan penangan ke acara diubah, dan peralatan tambahan disediakan. Berkat fasilitas ini dan kesederhanaannya, kerangka kerja Stimulus memungkinkan Anda untuk dengan cepat dan kompeten menyusun bahkan bagian depan yang besar.

Selain itu, perlu ditekankan bahwa Stimulus bergabung dengan baik dengan fitur Ruby on Rails lainnya - kemunculan yang berguna muncul di hampir setiap bundel.

Stimulus dan Webpacker


Webpacker menyediakan perintah untuk membuat aplikasi dengan Stimulus yang terhubung:

rails new myapp --webpack=stimulus

Atau untuk menghubungkannya ke proyek yang sudah dibuat:

bundle exec rails webpacker:install:stimulus

Stimulus dan JavaScript


Stimulus mempromosikan penggunaan prinsip-prinsip pengembangan JavaScript modern untuk mengimplementasikan interaktivitas pada halaman Anda. Dengan Stimulus, solusi frontend dibangun dengan cara modular, OOP digunakan untuk penangan acara, dan kode terstruktur. Menggunakan alat penargetan, menggunakan pengontrol stimulus, akan lebih mudah untuk mengontrol koneksi ke elemen blok komponen grafik kompleks yang diambil dari perpustakaan pihak ketiga atau ditulis secara independen (kalender, kompiler otomatis, daftar, pohon, dan lain-lain). Berkat ini, Stimulus adalah salah satu cara termudah untuk beralih dari perangkat frontend yang ketinggalan zaman dan mendapatkan produktivitas yang diperlukan dari penggunaan JavaScript murni modern.

Stimulus dan Ruby on Rails


Dengan struktur kode yang direkomendasikan oleh Stimulus, Anda terus menulis dalam JavaScript dengan cara yang sama seperti di Ruby on Rails. Anda juga mendeklarasikan pengontrol, juga mengikat tindakan ke metode. Dengan Stimulus, pengembangan frontend menjadi mirip dengan backend, yang membuatnya lebih mudah untuk bekerja di sana dan di sana.

Stimulus dan ActionCable


Menggunakan metode inisialisasi dan sambungkan dalam pengontrol stimulus, akan lebih mudah untuk mengikat soket web tidak ke seluruh halaman, tetapi ke blok individualnya dan untuk bekerja secara tepat dengan pesan yang masuk. Menjadi lebih mudah untuk mengatur beberapa aliran paralel pada satu halaman dengan perpindahan saluran independen.

Stimulus dan Turbolinks


Stimulus diaktifkan segera setelah Turbolinks memuat halaman, tidak ada manipulasi tambahan yang diperlukan untuk menghubungkan Stimulus ke blok-blok halaman.

Turbolinks tidak hanya memfasilitasi pemuatan halaman, tetapi juga menyimpan kontennya saat transisi. Ketika Anda kembali ke halaman cache dari histori, Stimulus diaktifkan secara otomatis, seperti ketika memuat halaman baru. Jika Anda ingin menyimpan beberapa nilai sebelum melepaskan pengontrol dari unit, Anda dapat menggunakan metode disconnect- dan kemudian, saat kembali dan menghubungkan pengontrol, ia akan dapat mengembalikan status terakhirnya. Dalam kode contoh pertama bekerja dengan Stimulus, Anda dapat melihat bagaimana, saat melepaskan ( disconnect), nilainya tetap dalam atribut data blok pengontrol this.active, dan saat menghubungkan ( connect), itu diekstraksi kembali.

Kembali melalui halaman dapat menjadi cara yang berguna untuk bekerja dengan aplikasi tersebut. Misalnya, ketika bekerja dengan formulir, mungkin perlu mengisi / mengedit nilai dalam direktori di halaman lain, lalu kembali dan pilih data baru.

Contoh lain: katakanlah kita perlu mengedit atau melihat nilai pada halaman pengaturan obrolan web. Ini akan berguna bagi kita, saat melepaskan pengontrol dari unit dengan percakapan, untuk mengingat pengidentifikasi pesan terakhir, jadi ketika kembali, pertama-tama minta pesan baru yang hilang, dan kemudian buka koneksi melalui soket web.

Dengan demikian, pengembalian riwayat halaman dapat digunakan sebagai cara yang nyaman untuk bekerja dengan aplikasi web Anda.

Bentuk Stimulus dan Pembantu


Stimulus bekerja erat dengan markup, dan dengan bantuan pembantu, data mudah tertanam dalam blok html, berkat ini, bagian dari data dapat dimuat ke dalam atribut data blok dan dikirim ke pengontrol.

app / views / articles / show.html.erb
<%#       app/views/articles/show.html.erb %>

<%#      %>
<% article_data = article.attributes
      .slice("id", "created_at", "updated_at", "author", "title").to_json %>

<%#   div    content_tag %>
<%= content_tag :div,
    :data => { controller: :articles },
    "data-articles-attributes" => article_data do %>
  <%# ... %>
<% end %>


app / javascript / controllers / articles_controller.js (snippet)
//   
//   initialize  app/javascript/controllers/articles_controller.js
initialize() {
  this.attributes = JSON.parse(this.data.get("attributes"));
  //   
  // ...
}


Stimulus dan Rails-ujs


Menggunakan Stimulus dan opsi jarak jauh, Anda dapat langsung menghubungkan pengontrol ke acara ajax dan memproses hasil kueri. Deklarasikan tautan menggunakan Rails-ujs dan pasang pengendali stimulus ke sana.

tautan dengan opsi jarak jauh dan penangan stimulus
<%= link_to " ",
  article_path(article, format: :html),
  data: { remote: true, action: "ajax:success->articles#showArticle" } %>


Saat Anda mengeklik tautan ini, permintaan Ajax asinkron ke pengontrol rel articles_controller.rbuntuk tindakan show akan terjadi . Setelah menerima respons positif, suatu peristiwa akan menyala ajax:successdan metode showArticledari pengontrol akan dipanggilapp/javascript/controllers/articles_controller.js

aplikasi controller showArticle metode / javascript / controllers / articles_controller.js
showArticle(e) {

  //      
  const xhr = e.detail[2];

  //    
  this.showFormTarget.innerHTML = xhr.responseText;

  //  
  this.showFormTarget.style.display = "block";
}


Apa berikutnya?


Alat-alat ini, bersama dengan kerangka kerja Ruby on Rails, membuka cakrawala baru untuk pengembangan fullstack. Selain itu, alat yang dijelaskan relatif sederhana dan tidak memerlukan penyelaman panjang - semua yang diperlukan untuk proyek yang sukses ada di permukaan.

Bangun aplikasi web dengan alat pengembangan fullstack modern dan cepat dengan kerangka kerja Ruby on Rails dan nikmatilah!

All Articles