私はクロージャコンパイラを使用して、すべてのマイコード用に単一の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
この問題を修正する方法。
mathJaxCleanerについて詳しく教えてもらえますか?それはどこから来ていますか?誰がそれを作るの?それは何をするためのものか?なぜあなたはそれを呼んでいますか?あなたのコードにはどこにも定義されていないので、あなたが持っているエラーは意味があります。しかし、その名前のオブジェクトを作るだけでは、何も役に立たないことはありません。 – owler
mathJaxCleaner別のファイルで定義されています。コンパイルするためにコンパイルを終了するファイルのリストを指定しました。 mathJax.jsファイルの挿入により作成された不要なノードを削除します。私はドキュメントオブジェクトへのアクセス権しか持っていないので、webpage.evaluate関数内でmathJaxCleaner関数を使用する必要があります。 –
したがって、mathJaxCleanerはすでにグローバルとして存在するはずですか?その場合は、mathJaxCleanerのタイプを指定するexternsファイルを作成できます。 https://github.com/google/closure-compiler/wiki/FAQ#how-do-i-write-an-externs-fileをご覧ください。 – owler