19

assets:precompile の間、javascript は縮小されますが、console.logs は残されます。

コードが本番環境にプッシュされるときに、プリコンパイル時にすべての console.logs を削除する方法はありますか?

4

4 に答える 4

5

これを に追加できますapplication.js.erbconsole.log()このソリューションは、本番環境へのログ記録を防ぎます。ただし、 へのロギングは引き続き許可されconsole.error()ます。

<% if Rails.env.production? %>
  window.console = {};
  window.console.log = function(){};
<% else %>
  // the || in the code ensures IE compatability
  window.console = window.console || {};
  window.console.log = window.console.log || function(){};
<% end %>
于 2013-03-16T05:28:39.477 に答える
2

正しい方向を示すには、 UglifyJSの「コードプリプロセッサとして使用」セクションを確認してください。

--define DEVMODE=false内でフラグを渡す方法についてさらに調査する必要がありrake assets:precompileますが、上記のリンクで説明されているようにブール値でラップするようにコードを調整する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はマングルオプションの受け渡しをサポートしていません:defines。オプションで、上記のマークされた行をに変更し、"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がに設定されtrueconsole.log()が実行されます。が実行されると、コンパイル/圧縮が開始される前にrake assets:precompileUglifyJSがに設定されます。上を歩くと、条件が評価されないことがわかり、結果のソースからこのデッドコードが削除されます。DEVMODEnullif (null) {true

上記のように電話を書いconsole.log()たり、速記を書いたりする限り

DEVMODE && console.log('some log message');

呼び出しはconsole.log()本番コードから削除されます。ストリッピング以外にも、これには他の利点がconsole.log()あり、他の開発固有のコードを開発モードおよび開発モードのみで他のJavascriptと共存させることができます。

于 2012-08-01T18:24:22.403 に答える
2

bitcrowdの解決策について言及したいと思います。彼らの考えは基本的に次のとおりです。

  1. dataアプリの状態 (開発/生産/...) を表す body タグの属性を定義します。<body data-env="<%= Rails.env %>">
  2. これに応じて、console.log()何かを出力するか、何もしないでください - 例:

    if ($('body').data('env') == 'production' || typeof console == "undefined"){
        var console = { log: function() {}, debug: function() {}, info: function() {} };
    }
    
于 2013-03-05T17:32:17.080 に答える