Closure compile缩小后无法找到变量

时间:2017-09-08 10:08:09

标签: javascript phantomjs google-closure-compiler

我正在使用闭包编译器为我的所有代码创建单个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

如何解决此问题。

2 个答案:

答案 0 :(得分:0)

如果使用compilation_level ADVANCED_OPTIMIZATIONS的Closure Compiler,则必须导出您希望外部世界可用的符号(var,function等)(未编译)。 / p>

之前使用@export或在需要导出的每个符号后使用goog.exportSymbol(publicPath, object)

为此,您需要包含闭包库并将以下参数添加到闭包编译器:--generate_exports --js closure-library-path/closure/goog/base.js

答案 1 :(得分:0)

我得到了解决这个问题的方法。

在PhantomJS函数中,webpage.evaluate不仅仅是一个闭包,它存在于另一个上下文(网页)的内部,其中所有外部变量和函数都不存在,但是一个网页的DOM是相反。

所以我在window对象中明确地添加了我的函数。

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