让Sprockets缩小CSS / JS,而不是在Rails / Rack应用程序中

时间:2014-12-20 01:15:22

标签: javascript css minify sprockets

我尝试使用Sprockets在Rails和Rack上下文之外组合和缩小我的JavaScript和CSS文件。到目前为止,我能够将它们组合成一个文件,但现在我试图在这些文件上运行JS压缩器和CSS压缩器。

我按照Sprockets README的说明(https://github.com/sstephenson/sprockets#minifying-assets),但我收到此错误:

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

这是我完整的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

我已尝试过以下内容(剧透警报:他们不能工作):

  1. env.js_compressor = :uglifier
  2. env.js_compressor = Uglifier
  3. env.js_compressor = Uglify
  4. 每个人NoMethodError仍然会获得compress

    启用JS压缩的正确方法是什么? CSS怎么样? (我在那里遇到类似的问题。)

    ====== 除了以下标记的答案外,请注意:

    对于任何好奇的人,您都要实例化您的压缩器,并确保它响应compress

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

1 个答案:

答案 0 :(得分:2)

我试了一下(下面的例子),它对我有用。我怀疑你有一个过时的Sprockets版本,因为你想要使用的速记minifier符号最近在版本2.7.0中引入。我会做一个gem upgrade,希望能解决它。


示例Rakefile (在包含未分解的non-min.js文件的目录中,在运行rake compile生成缩小的min.js文件后生成):

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

更新:为了验证我上面的答案,我安装了旧版本的Sprockets(v2.6.0)并收到了与您相同的错误消息。