考虑这个非常简单的例子:
class MyClass {
public add(num: number): number {
return num + 2;
}
}
const result = await page.evaluate((NewInstance) => {
console.log("typeof instance", typeof NewInstance); // undefined
const d = new NewInstance();
console.log("result", d.add(10));
return d.add(10);
}, MyClass);
我已经尝试了我能想到的所有方法。我想在这里使用类的主要原因是,我不想直接将大量代码包含在evaluate
方法中。这很混乱,很难跟踪它,所以我想将所有逻辑移动到类中,这样更容易理解正在发生的事情。
这可能吗?
1条答案
按热度按时间eimct9ow1#
这是可能的,但不一定是伟大的设计,这取决于你想做什么。在不知道实际用例的情况下,很难提出最佳解决方案,所以我只提供选项,让你做决定。
一种方法是将类字符串化(手工或使用
.toString()
)或将其放在单独的文件中,然后使用addScriptTag
:有关更多示例,请参见this answer。
像
eval
这样的东西也是可行的,如果看起来很可怕,那么就安全性而言,你在page.evaluate()
或page.addScriptTag()
中放入的任何东西实际上都是一样的。许多其他模式也是可能的,例如如果逻辑是基于节点而不是基于浏览器的,则通过
exposeFunction
公开库。也就是说,在
evaluate
中定义类可能没有您想象的那么糟糕:我更愿意将这些命名为一个库:
然后配合使用: