今回は、画面遷移の高速化を行うライブラリ「Turbolinks」について解説したいと思います。Turbolinksは非常に便利なライブラリですが、Railsではデフォルトで導入されており、概念や使い方を知らないとエラーを引き起こす原因にもなりかねません。ぜひ、この機会にTurbolinksについての理解を深めていきましょう。
Turbolinksとは
Turbolinksとは、Rails4から正式導入された画面遷移を高速化させるライブラリです。Turbolinks自体はJavaScriptのライブラリとして提供されていますが、Railsでは利用しやすいようにGemとしてデフォルトで組み込まれています。
Turbolinksの仕組み
Turbolinksはページ遷移を高速化させる仕組みであると前述しました。では、どのような仕組みで画面遷移を高速化させているのでしょうか?
Turbolinksを用いた画面遷移の仕組みを簡単に図示化したものが以下になります。

- リンクのクリックイベントが発火
- 画面遷移を阻害し、非同期でリクエストを送る
- HTMLをレスポンスとして返す
- headタグに含まれているJSとCSSが、現在のページと一致しているかチェック
- headタグはマージ、bodyタグは差し替えることで画面遷移が起きたように見せかける
①リンクのクリックイベントが発火
Turbolinksは同じドメイン内のaタグを監視しており、クリックされることでTurbolinksの仕組みが動き出します。
②画面遷移を阻害し、非同期でリクエストを送る
Turbolinks intercepts all clicks on <a href> links to the same domain. When you click an eligible link, Turbolinks prevents the browser from following it. Instead, Turbolinks changes the browser’s URL using the History API, requests the new page using XMLHttpRequest,
Turbolinksはリンクがクリックされたことによる画面遷移を阻害し、History APIを用いた非同期のリクエストを送ります。
③HTMLをレスポンスとして返す
and then renders the HTML response.
リクエストを受けたサーバーは、HTMLをレスポンスとして返します。
④headタグに含まれているJSとCSSが、現在のページと一致しているかチェック
レスポンスとして返ってきたHTML要素にある、heasタグ内のJSとCSSが現在のページと一致しているかどうかをチェックしています。これは次の動作である、置き換えを行うための準備にあたります。
⑤headタグはマージ、bodyタグは差し替えることで画面遷移が起きたように見せかける
During rendering, Turbolinks replaces the current <body> element outright and merges the contents of the <head> element.
Turbolinksは現在の<body>要素を置き換え、<head>要素の内容はマージします。そうすることで、あたかも画面遷移が起きたように見せているのです。
トラブルシューティング
ここではTurbolinksが原因で引き起こされるエラーの解決方法について紹介したいと思います。Turbolinksが原因で起きるエラーは主に以下の3つです。
- jQueryのreadyイベントが発火しない
- Windowのloadイベントが発火しない
- metaタグが更新されない
jQueryのreadyイベントが発火しない
Turbolinksでページ遷移した場合、jQueryのreadyイベントが発火しません。言い換えれば、$(function(){})に入ってる処理が実行されないということになります。
jQueryのreadyイベントとは、DOM(HTML)の読み込みが完了した際に実行されるイベントです。readyは省略が可能で、以下の2つのコードは同じ意味を表します。
readyイベントが発火しないエラーの解決方法は3つあります。
- 「turbolinks: load」を使用する
- 「jquery-turbolinks」というGemを使用する
- TurbolinksをOFFにする
①「turbolinks: load」を使用する
readyイベントが発火しない場合は「turbolinks:load」というオプションを使用することで、読み込みが正常に行われます。
参考
Turbolinks Github:
https://github.com/turbolinks/turbolinks
Turbolinks-Rails Github:
https://github.com/turbolinks/turbolinks-rails
jQuery Turbolinks:
https://github.com/kossnocorp/jquery.turbolinks/blob/master/README.md
metaタグを更新する方法:
https://github.com/turbolinks/turbolinks-classic/pull/165
Turbolinks チートシート:
https://qiita.com/morrr/items/54f4be21032a45fd4fe9
今回は画面遷移の高速化を行うライブラリ「Turbolinks」について解説しました。Turbolinksの原理までしっかり理解しようとすると正直難しいですが、大枠の仕組みをこの記事で掴んでいただけたらと思います。