SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

サンプルコードで学ぶRuby on Rails 5実践入門

Rails 5.0から5.1のバージョンアップで大きく変わるフロントエンド開発環境

サンプルコードで学ぶRuby on Rails 5実践入門 第6回


Rails 5.0までのフロントエンド開発環境

 前述の通り、Rails 5.0までのフロントエンド環境は主にアセットパイプラインによって提供されています。以下、主なアセットパイプラインの仕組みについて解説します。

  • アセットパイプライン関連のgem
  • アセットパイプライン関連の設定ファイル
  • モードによるアセットパイプラインの動作の違い

アセットパイプライン関連のgem

 アセットパイプラインの機能は、Rails本体の機能として付属するsprockets-railsというgemによって提供されています。sprocketsの機能自体は、sprockets-railsに付属するsprocketsというgemが提供します。このあたりの依存関係は、Gemfile.lockファイルを確認すると分かります。

リスト1 Gemfile.lock
…(中略)…
    rails (5.0.0.1)
…(中略)…
      sprockets-rails (>= 2.0.0)
…(中略)…
    sprockets (3.7.0)
…(中略)…
    sprockets-rails (3.2.0)
…(中略)…
      sprockets (>= 3.0.0)
…(中略)…

 Railsにおいて、sprocketsはデフォルトでONになっています。sprocketsからは以下の3つのgemを利用しています。

  • sass-rails
  • uglifier
  • coffee-rails

 Gemfileを確認すると、3つのgemが記述されていることが確認できます。

リスト2 Gemfile
…(中略)…
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
…(中略)…

 Gemfileのコメントを確認すると分かる通り、sass-railsを使うと、SCSS(Sassy CSS)形式でCSSをインデント構文によって記述することができます。具体的には、拡張子が.scssのファイルがapp/assets/stylesheets/以下に設置されている場合、sass-railsによってSCSSで記述されたファイルをCSS形式に変換することができます。

 uglifierは、JavaScriptを最小化/圧縮するためのgemです。

 coffee-railsは、CoffeeScriptで記述されたファイルをJavaScriptに変換するためのものです。CoffeeScriptは、JavaScriptの記述方法をより短く効率的に記述するためのプログラミング言語です。CoffeeScriptで記述したプログラムは、JavaScriptにコンパイルされます。拡張子が.coffeeのファイルがapp/assets/javascripts/以下に設置されている場合、coffee-railsによってCoffeeScriptのプログラムをJavaScriptに変換できます。

gem 役割
sass-rails SCSSをCSSに変換する
uglifier JavaScriptを1つにまとめて最小化/圧縮する
coffee-rails CoffeeScriptのプログラムをJavaScriptに変換する

 なお、デフォルトでONとなっているアセットパイプラインの機能ですが、OFFにすることもできます。Railsアプリケーションでアセットパイプラインの機能を無効にするには、rails newして新規プロジェクトを作成する際のオプションに--skip-sprocketsを渡します。

$ bin/rails new rails5_sample --skip-sprockets

アセットパイプライン関連の設定ファイル

 アセットパイプラインが提供する一連の設定ファイルを確認します。まずapp/assets/javascripts/application.jsを確認しましょう。

リスト3 app/assets/javascripts/application.js
+++スクリプト+++
…(中略)…
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

 この記法はコメントアウトのように見えますが、Sprocketsが定める記法で、//= requireと記述することで対象のライブラリをロードすることができます。jQuery関連のライブラリのロードする定義の後に、Turbolinksの記述があることが確認できます。なお、最後の行の//= require_tree .という記述は、app/assets/javascripts配下に配置された全てのファイルをインクルード対象とする意味です。

 次にアセットの記述をするマニフェストファイルを確認します。Rails 4までは、新しいアセットを追加する場合は以下のようにconfig/initializers/assets.rbに対象のファイルを追加する必要がありました。rails5_sampleプロジェクトではデフォルトのままなのでサンプルコードがコメントアウトされていますが、このサンプルではsearch.jsというファイルを追加する場合に、このコメントアウトを外すことで対応していました。

リスト4 config/initializers/assets.rb
…(中略)…
# Rails.application.config.assets.precompile += %w( search.js )
…(中略)…

 Rails 5.0から利用されているSprockets 3から、manifest.jsというマニフェストファイルが導入されています。ただし、Sprockets 3まではファイルが用意されているのみで、プリコンパイル対象とはなっていません。そのため、マニフェストファイルを使う場合は明示的に指定する必要があります。

リスト5 config/initializers/assets.rb
…(中略)…
Rails.application.config.assets.precompile += %w( manifest.js )
…(中略)…

 このように指定すると、追加したいアセットをconfig/initializers/assets.rbに指定せず、マニフェストファイルに//= linkの形式(sprocketsライクな記述)でアセットを指定できます。デフォルトで用意されるマニフェストファイルを確認するとapp/assets/javascriptsに存在する全てのJavaScriptファイルとapp/assets/stylesheetsに存在する全てのCSSファイルが自動的に読み込まれる設定となっています。

リスト6 app/assets/config/manifest.js
//= link_tree ../images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css

モードによるアセットパイプラインの動作の違い

 Railsには、動作環境によるモードの違いがあります。Railsのモードにはデフォルトで以下の種類があります。

モードの種類 想定される主な用途
development 開発時の動作環境
test 開発時にテストコード(※注1)を実行する際の動作環境
production 開発が完了したものを動かす本番環境

テストコードとは

 ※注1:テストコードとは、Webアプリケーションで実現したい価値を提供するために記述したソースコードを対象として、動作テストを自動化するために記述するコードのことです。Railsでは高速に開発する仕組みをサポートするために、デフォルトでMinitestというテスティングフレームワークが付属しています。その他に有名なテスティングフレームワークにはRpecがあります。

 モードにより、それぞれの設定ファイルが存在します。既に確認したデータベースの接続設定が記述されているconfig/database.ymlがその代表例です。その他にも、アセットパイプラインの動作やその他の設定が記述されているファイルがあります。config/environments配下に「モード名.rb」という命名ルールがデフォルトで用意されています。

  • config/environments/development.rb
  • config/environments/test.rb
  • config/environments/production.rb

 アセットパイプラインに関する設定は、developmentモードとproductionモードで大きく異なります。これは、開発時に高速な動作を犠牲にしてでもすぐに反映させたい場合や、アセット回りのデバッグのしやすさを優先したい一方で、本番動作時は高速化のためにアセットをまとめたい等、求められる要件が異なるからです。

 developmentモードではアセットパイプラインに関するデフォルト設定が以下のように記述されています。

リスト7 config/environments/development.rb
…(中略)…
  config.assets.debug = true
…(中略)…
  config.assets.quiet = true
…(中略)…

 config.assets.debugがtrueに設定されると、個別のアセットを動的に結合せず、元のソースを維持したままコンパイルします。config.assets.quietはログにアセット回りの出力をするかしないかの設定です。trueの場合、アセット回りのアクセスがログに出力されなくなります。

 次に、productionモードのアセット回りの設定を確認します。

リスト8 config/environments/production.rb
…(中略)…
  config.assets.js_compressor = :uglifier
…(中略)…
  config.assets.compile = false
…(中略)…

 config.assets.js_compressorはアセットを圧縮する際に使用するアダプターを指定しています。デフォルトでは、Gemfileに記述されているuglifierが指定されています。config.assets.compileはプリコンパイルを動的に行うかの設定です。デフォルトではfalseなので、前述の通りプリコンパイルコマンドを以下の通り実行する必要があります。

$ RAILS_ENV=production bin/rails assets:precompile

 productionモードで実行するために、環境変数RAILS_ENVを明示的に指定します。なお、Railsの場合、デフォルトではRAILS_ENV=developmentで動作します。

次のページ
Rails 5でバージョンアップしたTurbolinks 5

修正履歴

この記事は参考になりましたか?

サンプルコードで学ぶRuby on Rails 5実践入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 竹馬 力(チクバ ツトム)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10108 2017/05/08 11:30

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー