关闭编译缩小后找不到变量
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_level
为 ADVANCED_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
}
我正在使用闭包编译器为我的所有代码创建单个 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_level
为 ADVANCED_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
}