Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rails Assets LRUG

Rails Assets LRUG

Talk about http://rails-assets.org that I gave on London Ruby User Group

Avatar for Tymon Tobolski

Tymon Tobolski

December 09, 2013
Tweet

More Decks by Tymon Tobolski

Other Decks in Programming

Transcript

  1. What is the problem? • Managing assets in rails app

    is hard • Tons of incompatible javascript libraries • Unmaintainable legacy projects
  2. source 'https://rubygems.org' +source 'https://rails-assets.org' ! gem 'rails' ! group :assets

    do gem 'sass-rails' gem 'uglifier' gem 'coffee-rails' + gem 'rails-assets-bootstrap' + gem 'rails-assets-angular' + gem 'rails-assets-leaflet' end
  3. application.js ! ! ! //= require_self +//= require bootstrap +//=

    require angular +//= require leaflet //= require_tree . application.css ! ! /* *= require_self +*= require bootstrap +*= require leaflet *= require_tree . */
  4. Pros • No more vendor/assets • Proper versioning • Dependency

    resolution • No additional build step • Already used in few production apps with no big issues
  5. Gem name { "name": "bootstrap", "version": "3.0.3", "main": [ "./dist/js/bootstrap.js",

    "./dist/css/bootstrap.css" ], "dependencies": { "jquery": ">= 1.9.0" } }
  6. Manifest - sprockets # application.js //= require bootstrap Simple component

    vendor/assets/javascripts/ - bootstrap.js - bootstrap/bootstrap.js
  7. Manifest - sprockets # application.js //= require moment //= require

    moment/lang/pl More complex component vendor/assets/javascripts/ - moment.js - moment/moment.js - moment/lang/en.js - moment/lang/pl.js
  8. gemspec lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'rails-assets-bootstrap/version'

    ! Gem::Specification.new do |spec| spec.name = "rails-assets-bootstrap" spec.version = RailsAssetsBootstrap::VERSION # ... spec.add_dependency "rails-assets-jquery", ">= 1.9.0" # ... end
  9. Rails Engine require "rails-assets-bootstrap/version" ! require "rails-assets-jquery" ! if defined?(Rails)

    module RailsAssetsBootstrap class Engine < ::Rails::Engine # Rails -> use vendor directory. end end end
  10. "## lib $ "## rails-assets-bootstrap $ $ &## version.rb $

    &## rails-assets-bootstrap.rb "## vendor $ &## assets $ "## images $ $ &## bootstrap $ $ &## assets $ $ &## ico $ $ "## apple-touch-icon-114-precomposed.png $ $ "## apple-touch-icon-144-precomposed.png $ $ "## apple-touch-icon-57-precomposed.png $ $ "## apple-touch-icon-72-precomposed.png $ $ &## favicon.png $ "## javascripts $ $ "## bootstrap $ $ $ &## bootstrap.js $ $ &## bootstrap.js $ &## stylesheets $ "## bootstrap $ $ "## bootstrap-theme.scss $ $ &## bootstrap.scss $ &## bootstrap.scss "## Gemfile "## README.md "## Rakefile &## rails-assets-bootstrap.gemspec
  11. bower is a mess • just git clone • duplicates,

    momentjs vs moment, swipe vs Swipe • separate repositories, e.g angular-bower • {bower, package, component}.json - unreliable • bower info missing ”main”
  12. bower is a mess • no common structure • lib.js

    at top level • src, dist, release, etc. directories • .{js,css}.min duplicates • not compiled packages • missing dependencies
  13. Other issues • version spec differences • bundler API -

    no versions in dependencies API request • web frontend is essential • rails-assets-jquery vs jquery-rails conflicts
  14. Technical issues • Gem::Indexer bug • global bower cache -

    custom bower fork • auto updates via bower api • index locking • background jobs, blocking • weak performance • do as much as possible in memory
  15. We need your help • Spread the word • Improve

    bower.json files • Bug discovering and fixing