Ruby on Rails Wednesday, November 11, 2015

Hi!

For a faster initial render of my pages, I have added a script relocator initializer that scans the page and moves all script tags to the bottom of the body tag.  Order is kept, and the script tags in the `head` tag are marked with data-turbolinks-eval="false" so they are not executed again on new pages when using turbolinks.

It seems to work well and do exactly what I want.  Can anybody see anything wrong with it?  Any reason NOT to use it?  What can it break?

# cat config/initializers/rack-script_relocator.rb
require 'nokogiri'

module Rack
 
class ScriptRelocator
   
def initialize(app)
     
@app = app
   
end

   
def call(env)
      status
, headers, response = @app.call(env)
     
if headers['Content-Type'] !~ %r{^text/html}
       
return status, headers, response
     
end
      response_body
= ''
      response
.each { |part| response_body << part }
      doc
= Nokogiri::HTML(response_body)
      scripts
= doc.css('script')
     
return status, headers, response if scripts.empty?
      scripts
.each do |s|
        s
['data-turbolinks-eval'] = 'false' if s.parent.name == 'head'
        s
.remove
        doc
.at('body') << s
     
end
      transformed_body
= doc.to_html
     
if headers.key?('Content-Length') &&
          headers
['Content-Length'].to_i != transformed_body.length
        headers
['Content-Length'] = transformed_body.length.to_s
     
end
     
return status, headers, [transformed_body]
   
end
 
end
end

Rails.application.config.middleware.use Rack::ScriptRelocator



--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/349769e4-2d51-4800-9059-1520edb1e876%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment