关闭编译缩小后找不到变量

Closure compile Can't find variables after minification

我正在使用闭包编译器为我的所有代码创建单个 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 声明为一个函数,然后在其原型上附加函数,但 none 对我有用。 缩小后的代码变成这样。

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 说 Reference error Can't find variable: P

如何解决这个问题。

如果您使用 compilation_levelADVANCED_OPTIMIZATIONS 的 Closure Compiler,则必须导出您希望对外界可用的符号(var、函数等)(未编译) .

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

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

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

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

所以我在 window 对象中显式添加了我的函数。

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