Webアプリのモックアップ作業土台を作る その2 Sprockets

前回のつづき。

前回作った作業台に Sprockets を導入して assets 提供を分離します。といっても Sprockets 使っていくかどうか自分でも確信持ててないのでリポジトリではブランチにしておきました。

Sprockets を導入するメリットとしては、このままデプロイするケースを視野に入れたときに圧縮機能を追加しやすかったりプリコンパイルできたりするところでしょうか(どちらも今回はやってません)。

というわけで、まずは Gemfilesprockets 関連の gem を追加して bundle

gem 'sprockets'
gem 'sprockets-helpers'
gem 'sprockets-sass'

ディレクトリ構成を変更

前回の最後では以下のようなディレクトリ構成でした。*.sass*.coffeeviews に入ってました。

workbench
├── config.ru
├── public
│   └── js
│       └── vendor
├── views
│   ├── _side.slim
│   ├── application.coffee
│   ├── application.sass
│   ├── index.slim
│   └── layout.slim
└── workbench.rb

今回は assets ディレクトリを作成して *.sass*.coffee をまとめ、拡張子も二重拡張子に変更。また bower で js パッケージをインストールするディレクトリも assets/js/vendor に変更してます。

workbench
├── assets
│   ├── css
│   │ └── application.css.sass
│   └── js
│       ├── application.js.coffee
│       └── vendor
├── config.ru
├── public
├── views
│   ├── _side.slim
│   ├── index.slim
│   └── layout.slim
└── workbench.rb

bower の設定を変更

.bowerrc で js パッケージ保存位置を変更。

{
  "directory": "assets/js/vendor"
}

以前の public/js/vendor は削除して改めて bower install

assets/js/application.js.coffee も新しいレイアウトに合わせる。Sprockets の //= require を使います。

//= require 'js/vendor/requirejs/require'

require.config
  paths:
    jquery: '/assets/js/vendor/jquery/jquery'

require ['jquery']

Sinatra に Sprockets 関連設定を追加

workbench.rb はけっこうたくさん変更。configure ブロックに Sprockets の設定をいろいろ書いて、/css/js へのリクエストの処理は削除。

# ...
require 'sprockets'
require 'sprockets-helpers'
require 'sprockets-sass'

class Workbench < Sinatra::Base
  set :root, File.dirname(__FILE__)
  set :sprockets, Sprockets::Environment.new(settings.root)
  set :sprockets_prefix, '/assets'
  set :digest_assets, false

  configure do
    Sprockets::Helpers.configure do |config|
      config.environment = settings.sprockets
      config.prefix      = settings.sprockets_prefix
      config.public_path = '/public'
    end

    Sprockets::Sass.add_sass_functions = true

    sprockets.append_path './assets'

    set :haml, { format: :html5 }
    set :views, './views'
  end

  configure :development do
    register Sinatra::Reloader

    Sprockets::Helpers.configure do |config|
      # Debug mode automatically sets
      # expand = true, digest = false, manifest = false
      config.debug = true
    end
  end

  get '/' do
    @title = 'Index'
    slim :index
  end
end

config.ru/assets 以下のリクエスト処理を Sprockets に任せる。

require 'bundler'
Bundler.setup

require 'rack-livereload'
use Rack::LiveReload

require File.expand_path(File.join('..','workbench'), __FILE__)

map Workbench.sprockets_prefix do
  run Workbench.sprockets
end

map '/' do
  run Workbench
end

views/layout.slimcss と js の読み込みパスを assets 下に変更。

    link href="/assets/css/application.css" rel="stylesheet"
      script src="/assets/js/application.js"

Guardfileguard-livereload 監視対象に assets 配下を追加。

guard 'livereload' do
  watch(%r{views/.+\.(erb|haml|slim|s[ac]ss|coffee)$})
  watch(%r{assets/css/.+\.css\.s[ac]ss$})
  watch(%r{assets/js/.+\.js\.coffee$})
end
</code>