Rails: render_async gemでレンダリングを高速化(翻訳)
概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Speeding Up Rendering Rails Pages with render_async 公開日: 2017/06/08 著者: Nikola Đuza — render_asyncの現在のメンテナでもあります。 サイト: Semaphore Blog Rails: render_async gemでレンダリングを高速化(翻訳) Railsのコントローラにコードを追加するときに、さまざまな問題が発生することがあります。コントローラのアクションは非常に長くなることがあり、処理も複雑になりがちです。他の問題として、データ量の増加にともなってページの読み込みが重くなることもよくあります。コントローラのアクションにコードを追加した結果、一部のアクションで実行に失敗するとレンダリングが行われず、ユーザーに悪印象を残してしまうこともあります。 私たちのSemaphoreでもこの種の問題に何度か遭遇しました。通常は、コントローラのアクションをより小さなアクションに分割し、素のJavaScriptで非同期レンダリングすることで解決しています。 しばらくやっているうちに、これをrender_asyncというRailsページ高速化gemに切り出せることに気づきました。このgemは、RailsサーバーへのAjax呼び出しを行ってコンテンツを非同期にHTMLに読み込みます。 問題1: 時間とともに重くなる 新しいコードを足すと、Railsコントローラのアクションは肥大化します。気をつけておかないと、コードの量やデータ量の増加にともなってページの読み込みがだんだん重くなります。 問題2: アクションをブロックするコードへの対処 コントローラに新しいコードを追加する際、ビュー全体のレンダリングのためにコントローラのアクション内で追加のデータも読み込まないといけなくなることがあります。 ここで、アクションのレンダリングがブロックされてしまうコードの実例を見てみましょう。 movies_controller.rbのshowアクションで、データベースから映画を1件フェッチし、それに対応するレーティングも外部のIMDBから読み込みたいとします。 class MoviesController < ApplicationController def show @movie = Movies.find_by_id(params[:id]) @movie_rating = IMDB.movie_rating(@movie) end end find_by_idで映画を読み込む部分は普通のコードです。ここでは自分たちが管理するデータベースから映画を1件検索しようとしています。 しかし映画のレーティングの読み込み部分では、外部IMDBへの追加リクエストに対して回答を受け取れることを当てにしているため、この外部サービスが不能になったりダウンしたりしたときに問題が生じます。こうなるとMoviesController#showがダウンし、本来の映画の読み込みまでできなくなってしまいます。 解決方法 render_async gemを使うことで、この2つの問題を解決できます。このgemは、Railsページのレンダリング完了後にコンテンツを非同期で読み込みます。 ページにHTMLを追加する既存のJavaScriptコードの代わりにrender_asyncを使うのはなぜでしょうか。その理由は、JavaScriptでの退屈なフェッチやリプレースをrender_asyncが代行してくれるからです。 render_asyncの動作 … Continue reading Rails: render_async gemでレンダリングを高速化(翻訳)
Copy and paste this URL into your WordPress site to embed
Copy and paste this code into your site to embed