我有一个名为util
用方法getMutedColor
和其他一些。getMutedColor
依赖于另一个称为rand
在同一模块中。
page.includeJs('https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.10/d3.min.js', function() {
var util = require('./util');
var svg = page.evaluate(pageContext.pageExec, data, meta, util);
/** ... **/
}
我可以打电话util.getMutedColor()
在这个范围内就很好,但在我的pageContext.pageExec
功能,util.getMutedColor
不复存在。这util
参数仍然是一个对象,但我无法调用any导出的方法:
类型错误:“未定义”不是函数(评估“util.getMulatedColor()”)
有没有办法将独立模块传递到页面?
不,这真的不可能。正如在docs:
Note:评估函数的参数和返回值必须是一个简单的原始对象。经验法则:如果可以通过 JSON 序列化,那就没问题了。
您传递给评估的函数必须是独立的,并且您传递的数据不能包含使用创建的函数或对象new
。那些被剥夺了。
这意味着您必须复制util
物体完全进入pageExec
功能。
If util
太大而无法复制,或者如果您使用多个功能util
, 你可以试试不同的 things:
-
序列化函数并将它们作为字符串传递给评估回调,您可以在其中实例化它们new Function(string)
并将它们绑定到util
object.
var funcNames = [];
for(var prop in util) {
if (util.hasOwnProperty(prop) && typeof util[prop] === "function") {
funcNames.push(prop);
util[prop] = util[prop].toString();
}
}
util.__funcNames = funcNames; // make it a property of util
page.evaluate(pageContext.pageExec, data, meta, util);
和里面的pageContext.pageExec
:
util.__funcNames.forEach(function(funcName){
util[funcName] = new Function(util[funcName]);
});
只有一个pageContext
函数包含所有内容,您可以使用switch case
带有每次传递的参数evaluate
选择单个函数内的正确函数pageContext
功能。
-
Use page.injectJs注入实用程序。有必要通过检查是否来命名实用程序window
存在类似的东西:
var util = {...};
if (window) {
window.util = util
} else if(module) {
module.exports = util;
}
根据环境的不同,可能有更好的脚本可以做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)