Phantomjs 无法将模块函数传递到页面
我有一个名为Phantomjs 无法将模块函数传递到页面,phantomjs,Phantomjs,我有一个名为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
的模块,其中包含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
参数仍然是一个对象,但我无法调用任何导出的方法:
TypeError:“undefined”不是函数(正在计算“util.getMutedColor()”)
有没有办法将自包含模块传递到页面?没有,这是不可能的。如图所示: 注意:evaluate函数的参数和返回值必须是简单的原语对象。经验法则:如果可以通过JSON对其进行序列化,那么就可以了 传递给求值的函数必须是自包含的,传递的数据不能包含使用
new
创建的函数或对象。那些都脱光了
这意味着您必须将util
对象完全复制到pageExec
函数中
如果util
太大而无法复制,或者如果您使用了util
的多个功能,您可以尝试不同的方法:
newfunction(string)
实例化它们,并将它们绑定到util
对象
var funcNames=[];
for(util中的var prop){
if(util.hasOwnProperty(prop)&&typeof util[prop]=“函数”){
funcNames.push(prop);
util[prop]=util[prop].toString();
}
}
util._funcNames=funcNames;//使其成为util的属性
evaluate(pageContext.pageExec,data,meta,util);
以及pageContext.pageExec
的内部:
util.\uuuufuncnames.forEach(函数(funcName)){
util[funcName]=新函数(util[funcName]);
});
pageContext
函数,您可以使用开关盒
和一个参数,该参数每次传递到evaluate
以选择单个pageContext
函数中的适当函数window
中是否存在类似的内容来为UTIL命名名称:
var util={…};
如果(窗口){
window.util=util
}else if(模块){
module.exports=util;
}
根据环境的不同,可能有更好的脚本来实现这一点回答得很好。感谢您参考文档并提供清晰的示例。