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
的多个功能,您可以尝试不同的方法:

  • 序列化函数并将它们作为字符串传递给evaluate回调,在那里您可以使用
    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
    函数中的适当函数

  • 用于注入UTIL。有必要通过检查
    window
    中是否存在类似的内容来为UTIL命名名称:

    var util={…};
    如果(窗口){
    window.util=util
    }else if(模块){
    module.exports=util;
    }
    
    根据环境的不同,可能有更好的脚本来实现这一点


  • 回答得很好。感谢您参考文档并提供清晰的示例。