【Rails】「.html.erb」を一切使わず、非同期処理のみにしたら、表示速度(views)が爆速になったお話
どうも、へっぽこ素人エンジニアの「ゆうき」と申します。
なんか、今日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