要为您指明正确的方向,请查看 UglifyJS 的 Use as a code pre-processor 部分。
我需要研究更多关于如何在rake assets:precompile 中传递--define DEVMODE=false 标志的信息,但是调整您的代码以将console.log 包装在上面链接中描述的DEVMODE 布尔值中应该可以得到结果你正在寻找。
更新:
在rake assets:precompile 期间将加载的某些文件中,添加以下猴子补丁。
class Uglifier
private
def mangle_options
{
"mangle" => @options[:mangle],
"toplevel" => @options[:toplevel],
"defines" => { DEVMODE: ["name", "null"] }, # This line sets DEVMODE
"except" => @options[:except],
"no_functions" => @options[:mangle] == :vars
}
end
end
正如我在下面的评论中提到的,Uglifier does not support passing a :defines mangle option。您可以选择将上面标记的行更改为 "defines" => @options[:defines] 并使用此行更新您的配置
config.assets.js_compressor = Uglifier.new(defines: { DEVMODE: ["name", "null"] })
运行 rake 任务时,DEVMODE 现在将在您的源中转换为 null。现在,在您的 Javascript 源代码中给出以下代码:
if (typeof DEVMODE === 'undefined') {
DEVMODE = true;
}
if (DEVMODE) {
console.log('some log message');
}
默认情况下(在开发模式下),DEVMODE 将被设置为true,导致console.log() 执行。当rake assets:precompile 运行时,UglifyJS 将在编译/压缩开始之前将DEVMODE 设置为null。当走过if (null) { 时,它会看到条件永远不会评估true,并将从结果源中删除这个死代码。
只要你像上面那样写你的console.log()调用或简写为
DEVMODE && console.log('some log message');
console.log() 调用将从生产代码中删除。除了剥离 console.log() 之外,我还可以看到其他好处,允许其他特定于开发的代码在开发模式下与其他 Javascript 共存并且仅开发模式。