user3827303
user3827303

Reputation: 429

Getting Sprockets to minify CSS/JS while not in a Rails/Rack app

I'm trying to use Sprockets to combine and minify my JavaScript and CSS files outside of the Rails and Rack context. So far, I'm able to combine them into a single file, but now I'm trying to run the JS compressor and the CSS compressor on those files.

I followed the Sprockets README's instructions (https://github.com/sstephenson/sprockets#minifying-assets), but I'm getting this error:

NoMethodError: undefined method `compress' for :uglify:Symbol

Here is my complete rakefile:

require 'rubygems'
require 'bundler'
require 'pathname'
require 'logger'
require 'fileutils'
require 'uglifier'

Bundler.require

ROOT        = Pathname(File.dirname(__FILE__))
LOGGER      = Logger.new(STDOUT)
BUNDLES     = %w( combined.css combined.js )
BUILD_DIR   = ROOT.join("dist")
SOURCE_DIR  = ROOT.join("src")

task :compile do
  sprockets = Sprockets::Environment.new(ROOT) do |env|
    env.logger = LOGGER
    env.append_path SOURCE_DIR.join('javascripts').to_s
    env.append_path SOURCE_DIR.join('stylesheets').to_s
    env.js_compressor = :uglify
  end

  BUNDLES.each do |bundle|
    assets = sprockets.find_asset(bundle)
    prefix, basename = assets.pathname.to_s.split('/')[-2..-1]
    FileUtils.mkpath BUILD_DIR.join(prefix)

    assets.write_to(BUILD_DIR.join(prefix, basename))
  end
end

I've tried the following (spoiler alert: they don't work):

  1. env.js_compressor = :uglifier
  2. env.js_compressor = Uglifier
  3. env.js_compressor = Uglify

And I get still get a NoMethodError for compress for each one.

What is the correct way to enable JS compression? What about CSS? (I am experiencing the similar issues there.)

====== In addition to the answer marked below, please note this:

For anyone who is curious, you'd have instantiate your compressor and make sure it responds to compress:

env.js_compressor = YUI::JavaScriptCompressor.new  
env.css_compressor = YUI::CssCompressor.new

Upvotes: 2

Views: 1466

Answers (1)

Alfred Xing
Alfred Xing

Reputation: 4632

I tried it out (example below), and it worked for me. I would suspect that you have an outdated version of Sprockets, since the shorthand minifier notation you want to use was introduced quite recently in version 2.7.0. I would do a gem upgrade and hopefully that fixes it.


Example Rakefile (in a directory containing an unminified non-min.js file, after running rake compile a minified min.js file was generated):

require 'sprockets'

ROOT = Pathname(File.dirname(__FILE__))

task :compile do
  sprockets = Sprockets::Environment.new(ROOT) do |env|
    env.append_path './'
    env.js_compressor = :uglify
  end

  assets = sprockets.find_asset("non-min.js")
  assets.write_to("./min.js")
end

Update: To verify my answer above, I installed an older version of Sprockets (v2.6.0) and got the same error message as you did.

Upvotes: 2

Related Questions