assets:precompile の間、javascript は縮小されますが、console.logs は残されます。
コードが本番環境にプッシュされるときに、プリコンパイル時にすべての console.logs を削除する方法はありますか?
assets:precompile の間、javascript は縮小されますが、console.logs は残されます。
コードが本番環境にプッシュされるときに、プリコンパイル時にすべての console.logs を削除する方法はありますか?
これを に追加できますapplication.js.erb
。console.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 %>
正しい方向を示すには、 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
がに設定され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と共存させることができます。
bitcrowdの解決策について言及したいと思います。彼らの考えは基本的に次のとおりです。
data
アプリの状態 (開発/生産/...) を表す body タグの属性を定義します。<body data-env="<%= Rails.env %>">
これに応じて、console.log()
何かを出力するか、何もしないでください - 例:
if ($('body').data('env') == 'production' || typeof console == "undefined"){
var console = { log: function() {}, debug: function() {}, info: function() {} };
}