2017-09-08 10 views
0

私はクロージャコンパイラを使用して、すべてのマイコード用に単一のjavascriptファイルを作成しています。 PhantomJSでコードを実行しています。クローズコンパイル縮小後に変数が見つかりません

は、ここに私のコード

function process(inputParams, dataCollector) { 
    var webpage = require('webpage').create(); 
webpage.open(entityResolvedFilePath, function(status) { 
var hasnodes = webpage.evaluate(function() {      
         var nodesInfo= (document.getElementsByTagName('requirednode').length; 
         if (nodesInfo) { 
          MathJax.Hub.Register.MessageHook("Math Processing Error",function (message) { 
           throw message; 
          }); 


          MathJax.Hub.queue.Push(function() { 
           mathJaxCleaner.cleanMathJaxOutput(); 
           window.callPhantom(); 
          }); 

         } 
          return hasMathNodes; 
         }); 

         if (!hasMathTags) { 
          webpage.onCallback(); 
         } 
      } 
      else { 
       webpage.onCallback(); 
      } 
     } 
    }); 

私はMathJax.Hub.queue.Push内cleanMathJaxOutput関数を呼び出すしたかったです。 ローカライズされたコードをローカルで実行していないため、ローカルで動作します。 しかし、このコードをクロージャでコンパイルすると、コードが失敗してエラーになります。reference error could not find mathJaxCleaner Phantomjsのwebpage.evaluateがグローバル変数mathJaxCleanerと異なるクロージャスコープを作成するため、これはうまくいきません。

私はこのようにcleanMathJaxOutputを宣言しました。

var mathJaxCleaner = new Object(); 
mathJaxCleaner.cleanMathJaxOutput =function() {} 

は、私はまた、関数としてmathJaxCleanerを宣言しようとしたし、それのプロトタイプに関数を取り付けたが、事のどれも私のために働いていません。 小型化コードがこのようになりました。縮小さコードルックで

var P = { 
    A: function() { 
     function a(a) { 
      a && a.parentNode.removeChild(a) 
     } 

     function b(a) { 
      if (a) 
       for (; 0 != a.length;) this.removeNode(a[0]) 
     } 

     function d(a) { 
      var b = document.createElement("defs"); 
      a.insertBefore(b, a.childNodes[0]); 
      a = a.getElementsByTagName("use"); 
      for (var c = 0; c < a.length; ++c) { 
       var d = a[c].getAttribute("href"); 
       b.appendChild(document.getElementById(d.substr(1)).cloneNode(!0)) 
      } 
     } 
     for (var c = document.getElementsByClassName("MathJax_SVG"), e = 0; e < c.length; e++) { 
      for (var f = c[e], v = f.childNodes, w = 0; w < v.length; w++) "svg" == 
       v[w].tagName && d(v[w]); 
      f.style.fontSize = "inherit"; 
      "inline-block" === f.style.display && (f.style.display = "inline") 
     } 
     some more code here... 
    } 
}; 

関数呼び出しが(P.Aが好き) が、実行時にPhantomJSは、参照エラーが変数を見つけることができませんと言う:P

この問題を修正する方法。

+0

mathJaxCleanerについて詳しく教えてもらえますか?それはどこから来ていますか?誰がそれを作るの?それは何をするためのものか?なぜあなたはそれを呼んでいますか?あなたのコードにはどこにも定義されていないので、あなたが持っているエラーは意味があります。しかし、その名前のオブジェクトを作るだけでは、何も役に立たないことはありません。 – owler

+0

mathJaxCleaner別のファイルで定義されています。コンパイルするためにコンパイルを終了するファイルのリストを指定しました。 mathJax.jsファイルの挿入により作成された不要なノードを削除します。私はドキュメントオブジェクトへのアクセス権しか持っていないので、webpage.evaluate関数内でmathJaxCleaner関数を使用する必要があります。 –

+0

したがって、mathJaxCleanerはすでにグローバルとして存在するはずですか?その場合は、mathJaxCleanerのタイプを指定するexternsファイルを作成できます。 https://github.com/google/closure-compiler/wiki/FAQ#how-do-i-write-an-externs-fileをご覧ください。 – owler

答えて

0

私はそれがこの問題の解決策だ:あなたが閉鎖ライブラリが含まれており、閉鎖コンパイラに以下の引数を追加する必要があることについては

webpage.evaluate内のPhantomJS関数は、単にクロージャではなく、すべての外部変数と関数が存在しない代わりにWebページのDOMを使用できる別のコンテキスト(Webページ)内に存在します。

私は関数を明示的にウィンドウオブジェクトに追加しました。

window['myfunctionName'] = myfunctionName; 
function myfunctionName() 
{ 
// do something 
} 
0

compilation_levelADVANCED_OPTIMIZATIONSのクロージャコンパイラを使用する場合は、外部(コンパイルされていない)に使用するシンボル(var、関数など)をエクスポートする必要があります。

前に@exportを使用するか、エクスポートするシンボルの後にgoog.exportSymbol(publicPath, object)を使用してください。 --generate_exports --js closure-library-path/closure/goog/base.js

関連する問題