This file at actionpack/lib/sprockets/railtie.rb
defines the Sprockets::Railtie
, defining another Railtie for Rails. This Railtie is responsible for detecting if the application at-hand is using CoffeeScript, and if so will set config.app_generators.javascript_engine
on the application to be :coffee
.
Next, this defines an initializer called sprockets.set_configs
which sets up ActionController::Base
to either use or not use sprockets depending on the configuration option config.assets.enabled
.
Finally, this file defines an after_initialize
hook for the application which is the real meat of this Railtie. If assets are disabled (with the config.assets.enabled
config option set to false
) then this after_initialize
hook will do nothing.
If assets are enabled then, this initializer first makes a call to an asset_environment
protected method near the bottom of this file which requires the sprockets
gem, creates a new Sprockets::Environment
object, and then configures this object appropriately based off the configuration settings defined in railties/lib/rails/configuration.rb
(near the top).
If this application is configured to compress assets -- it is in production
, isn't in development
; the setting is config.assets.compress
-- then this railtie will also define a js_compressor
and css_compressor
setting for the new Sprockets::Environment
object. These are configured using the config.assets.js_compressor
and config.assets.css_compressor
settings for the application.
Currently, js_compressor
can take the symbols of :closure
(closure-compiler
gem), :uglifier
(uglifier
gem) and :yui
(yui
gem) while the css_compressor
only takes :yui
. With these settings configured, Sprockets will compress assets using the specified tool to minimise the size of the files being sent back to the client.
Once asset_environment
is done, this Railtie next includes the Sprockets::Rails::Helper
(defined in actionpack/lib/sprockets/helpers/rails_helper.rb
) into ActionView::Base
using an ActiveSupport.on_load
hook. This helper overrides the javascript_include_tag
and stylesheet_link_tag
helpers to source their files from an /assets
root path rather than simply /images
or javascripts
.
Finally, the after_initialize
hook for the Sprockets::Railtie
defines that this new Sprockets::Environment
object is prepended to the routes file:
app.routes.prepend do
mount app.assets => assets.prefix
end
The assets.prefix
variable in this setting is simply /assets
. This means that when an asset is requested using tags such as javascript_include_tag
it will be served by this Sprockets::Environment
object that is configured by this Railtie. The actual code to serving assets is within Sprockets itself, inside the Sprockets::Server
module which is included into Sprockets::Environment
.
FYI.
sprocket-rails
overwritesjavascript_include_tag
andstylesheet_link_tag
to provide debugging support only, actually it overwritescompute_asset_path
to source their files.