我想使用Electron webContents API中名为executeJavaScript()的函数。由于它非常接近eval(),我将在示例中使用它。
我也理解eval()
很危险,但我对我的问题的原则感兴趣。
// Modules
const fs = require('fs');
// CONSTANTS
const EXAMPLE_1 = 'EXAMPLE_1';
const EXAMPLE_2 = 'EXAMPLE_2';
const EXAMPLE_3 = 'EXAMPLE_3';
const exampleScriptFunction = require('./exampleScriptFunction');
const exampleScriptFile = fs.readFileSync('./exampleScriptFile.js');
// using direct template string
eval(`console.log(${EXAMPLE_1})`);
// using a method from but this doesnt solve the neatness issue.
eval(exampleScriptFunction(EXAMPLE_2));
// What I want is to just use a JS file because it is neater.
eval(`${exampleScriptFile}`);
module.exports = function(fetchType) {
return `console.log(${fetchType});`;
}
console.log(${EXAMPLE_3});
也许我在这里完全错了,看错了方法。我愿意接受建议。因为我在编程方面没有兴趣,请不要标记我减1。我真的不知道怎么回答这个问题。谢谢。
答案 0 :(得分:1)
假设您的来源存储在exampleScriptFile
:
// polyfill
const fs = { readFileSync() { return 'console.log(`${EXAMPLE_3}`);'; } };
// CONSTANTS
const EXAMPLE_1 = 'EXAMPLE_1';
const EXAMPLE_2 = 'EXAMPLE_2';
const EXAMPLE_3 = 'EXAMPLE_3';
const exampleScriptFile = fs.readFileSync('./exampleScriptFile.js');
// What I want is to just use a JS file because it is neater.
eval(exampleScriptFile);

也许我不清楚。 ./exampleScriptFile.js
应为:
console.log(`${EXAMPLE_3}`);
答案 1 :(得分:0)
虽然@PatrickRoberts演示的eval
可以完成您的描述,但不会扩展到executeJavaScript
。
前者在调用者的上下文中运行,而后者使用代码的内容触发对另一个进程的IPC调用。据推测,此过程没有关于调用者上下文的任何信息,因此,模板字符串不能填充在此上下文中定义的变量。
WebContents.prototype.send = function (channel, ...args) {
// ...
return this._send(false, channel, args)
}
// ...
WebContents.prototype.executeJavaScript = function (code, hasUserGesture, callback) {
// ...
return asyncWebFrameMethods.call(this, requestId, 'executeJavaScript',
// ...
}
// ...
const asyncWebFrameMethods = function (requestId, method, callback, ...args) {
return new Promise((resolve, reject) => {
this.send('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', requestId, method, args)
// ...
})
}
//...
void WebContents::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype) {
prototype->SetClassName(mate::StringToV8(isolate, "WebContents"));
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
// ...
.SetMethod("_send", &WebContents::SendIPCMessage)
// ...
}