tag:crieit.net,2005:https://crieit.net/tags/render_async/feed
「render_async」の記事 - Crieit
Crieitでタグ「render_async」に投稿された最近の記事
2021-05-10T22:06:08+09:00
https://crieit.net/tags/render_async/feed
tag:crieit.net,2005:PublicArticle/17083
2021-05-10T22:06:08+09:00
2021-05-10T22:06:08+09:00
https://crieit.net/posts/Web-60992fc0523c1
遅延ロードさせてWebアプリを高速化する
<h1 id="遅延ロードとは"><a href="#%E9%81%85%E5%BB%B6%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A8%E3%81%AF">遅延ロードとは</a></h1>
<p>基本的にwebアプリは表示するデータを読み込んでからページを表示します。<br />
しかしそれだと重いデータを取得・表示する場合、ページの表示速度が落ちて重たい動作になります。<br />
なので先に軽い部分だけを読み込みそのページに移動してから重いデータを読み込むことで<br />
すべてを表示するまでの時間は変わらない(むしろ少し落ちる)がページの移動速度を大幅に上げることができます。<br />
体感上はかなりサクサクした動作になります。</p>
<p>↓ツイッターの遅延ロード<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480294/8197e1ec-d086-b08d-7b45-197e323945a8.png" alt="スクリーンショット 2021-05-10 192747.png" /></p>
<h1 id="実装"><a href="#%E5%AE%9F%E8%A3%85">実装</a></h1>
<pre><code class=":gemfile">gem 'render_async'
</code></pre>
<p>を書きbundle</p>
<p>次にrenderを書き直します。</p>
<p>変更前:</p>
<p>```erb:index.html<br />
<%= render "data", posts:@posts %></p>
<pre><code><br />これを
```erb:index.html
<%= render_async data_path %>
or
<%= render_async data_user_path(@user) %>
</code></pre>
<p>このようにする。</p>
<p>次にルーティング</p>
<pre><code class="ruby:routes">get "data", to: "posts#data", as: "data"
#↓パラメーターが必要な場合
get "data_user/:id", to: "posts#data_user", as: "data"
</code></pre>
<pre><code class="ruby:controller"> def index
#@posts = Post.all
end
def data
@posts = Post.all
render partial: "data", locals: {posts:@posts}
end
def data_user
@user = User.find_by(name: params[:id])
@posts = @user.posts.all
render partial: "data_user", locals: {posts:@posts}
end
</code></pre>
<p>最後はレイアウトに</p>
<p>```erb:application.html.erb<br />
<%= content_for :render_async %></p>
<pre><code><br />を追加。
これだけで遅延ロードが完成します。
![スクリーンショット 2021-05-10 192747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480294/e7e53d4b-7114-b09c-cf2e-a54ec754d08c.png)
# turbolinksを使用している場合
このままだと時々表示されない場合があります。
</code></pre>
<p><%= render_async data_path, html_options: { 'data-turbolinks-track': 'reload' } %></p>
<pre><code>html_options: { 'data-turbolinks-track': 'reload' }を追加して
config/initializersにrender_async.rbを作りましょう
```render_async.rb
RenderAsync.configure do |config|
config.turbolinks = true # Enable this option if you are using Turbolinks 5+
end
</code></pre>
<h1 id="jqueyを使う"><a href="#jquey%E3%82%92%E4%BD%BF%E3%81%86">jqueyを使う</a></h1>
<p>kaminariやjscrollで無限スクロールなどを実装している場合、これをしないと動きません。</p>
<p><code>config/initializers/render_async.rb
RenderAsync.configure do |config|
config.jquery = true
end</code></p>
<h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1>
<p>遅延ロードって大きなサービスだと結構使われているのに日本語の情報が少なくて困ったので書きました。<br />
体感上の動作速度がかなり変わるのでぜひやってみてください。</p>
<h3 id="宣伝"><a href="#%E5%AE%A3%E4%BC%9D">宣伝</a></h3>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480294/99c8f13e-2fe8-0d28-1117-338115e937a0.png" alt="453789.png" /></p>
<p><a target="_blank" rel="nofollow noopener" href="https://ammot.net/">https://ammot.net/</a></p>
<p>AmmotというSNSを作りました。<br />
文字数制限が6000字まで、画像・動画・PDF・音声は同時に10個まで投稿可能な自由なSNSです。<br />
マークダウンにも対応しているので皆さん大好きなソースコードもきれいに載せれます。<br />
ぜひ使ってみてください。</p>
<p>僕のツイッターアカ<br />
<a target="_blank" rel="nofollow noopener" href="https://twitter.com/yamada1531">https://twitter.com/yamada1531</a></p>
山田悠