我尝试使用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
我已尝试过以下内容(剧透警报:他们不能工作):
env.js_compressor = :uglifier
env.js_compressor = Uglifier
env.js_compressor = Uglify
每个人NoMethodError
仍然会获得compress
。
启用JS压缩的正确方法是什么? CSS怎么样? (我在那里遇到类似的问题。)
====== 除了以下标记的答案外,请注意:
对于任何好奇的人,您都要实例化您的压缩器,并确保它响应compress
:
env.js_compressor = YUI::JavaScriptCompressor.new
env.css_compressor = YUI::CssCompressor.new
答案 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)并收到了与您相同的错误消息。