我有一个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:“未定义”不是函数(正在评估“ util.getMutedColor()”)
有没有办法将自包含模块传递给页面?
不,这是不可能的。如在文档中所示:
注意:参数和评估函数的返回值必须是一个简单的原始对象。经验法则:如果可以通过JSON序列化,那就很好。
您传递来评估的函数必须是独立的,并且传递的数据不能包含使用创建的函数或对象new
。那些被剥夺了。
这意味着您必须将util
对象完全复制到pageExec
函数中。
如果util
太大而无法复制,或者您使用的多个功能util
,则可以尝试其他操作:
序列化函数,并将它们作为字符串传递给评估回调,在其中您可以实例化它们new Function(string)
并将其绑定到util
对象。
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
函数内部的正确函数。
使用page.injectJs
注入工具集。有必要通过检查是否window
存在类似以下内容来为utils命名空间:
var util = {...};
if (window) {
window.util = util
} else if(module) {
module.exports = util;
}
可能存在更好的脚本,具体取决于环境。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句