😆

【Rails】「.html.erb」を一切使わず、非同期処理のみにしたら、表示速度(views)が爆速になったお話

2020/09/16に公開

どうも、へっぽこ素人エンジニアの「ゆうき」と申します。

なんか、今日Twitterで「Zenn」という新しいプログラマー向けのサービスが開始されたことを見かけたので、早速使ってみることにしました!


さてさて、今回の話題はRailsを軽く。

私が使っているサーバーのRailsのレスポンスタイムを600ms → 50ms にしたお話です。

(viewsは、400ms → 0.1ms
 

Railsを使っていると、viewレンダリングの遅さが結構気になることもありますよね。

で、その遅さの原因なんですけど……「.html.erb」ファイルを複数読み込んでいるというのがよくあります。

(こんな感じ。処理の少ないページでも平均300msになってしまっていた)

あれ、すごく遅いです。内部に何もコードを書かなくても、renderするだけで、無駄に処理時間がかかります(表記上は、1~10msと書かれていたりするけれど、viewsの数値には、レンダリングにかかった時間が上乗せされています)。
 

ということで、Controllerのメソッドの処理の一番下に、

render js: 'javascriptの文'

これを記述すると、あら不思議、レスポンスタイムが劇的に改善されました!

……いや、不思議じゃなくて、Railsに通常のレンダリングをさせなかっただけですね(汗)。
 

Webサイトを「Ajax + Jquery」で更新(非同期通信の更新)をできるようにして(一例:javascriptの文 → "$('.app_container').html('#{escape_javascript('何らかのhtmlの文章。JavaScriptも含む')}');")、JavaScript形式のレンダリング情報を、ぽいっと渡せば、Rails側は'javascriptの文'を生成するぐらいしかやることがないので、すぐに処理が終わります。

(Rails側でのレンダリングの処理が無いと、かなり速い。上記の処理は仮想マシン+developなのでやや遅いけど、基本的には、production環境だと更に速い

viewsの遅延でお困りの方は、お試しあれ。
 

※ 備考1:「escape_javascript()」でクォーテーション(引用符。「"」とか)の重複を避けることが出来ます

※ 備考2:view以外で「escape_javascript()」を使用する場合は「include ActionView::Helpers::JavaScriptHelper」の宣言が必要です

※ 備考3:「非同期通信なんかやっていないよ! 上記の方法は使えないよ!」という方は、単純に「.html.erb」の読み込みを1つでも減らす。というのでもいいと思います。読み込みファイルが1つ減るだけでも、かなりスピードアップしますよ!
 

Discussion