我正在构建一个Atom Electron应用程序。现在我在我的一个webview的preload.js中有这个:
var { requireTaskPool } = require('electron-remote');
var work = '';
var _ = require('lodash');
work = requireTaskPool(require.resolve('./local/path/to/js/file.js'));
function scriptRun() {
console.log('Preload: Script Started');
// `work` will get executed concurrently in separate background processes
// and resolve with a promise
_.times(1, () => {
work(currentTab).then(result => {
console.log(`Script stopped. Total time running was ${result} ms`);
});
});
}
module.exports = scriptRun;
scriptRun();
它获得本地脚本,然后在后台进程中执行它。
我想做同样的事情,除了我想从外部来源检索脚本,如此
work = requireTaskPool(require.resolve('https://ex.com/path/to/js/file.js'));
当我这样做时,我会收到如下错误:
Uncaught Error: Cannot find module 'https://ex.com/path/to/js/file.js'
如何加载外部脚本?然后使用我的work
函数加载脚本。我的感觉是只需要使用本地文件。如果AJAX是答案,我是否可以看到如何获取脚本的示例,然后将其传递到我的work
而不先执行它?
答案 0 :(得分:1)
您尚未提供有关file.js的任何详细信息。但我可以给你一般的想法。
至少需要两件事来将您的包称为模块:
你的file.js的结构应该是这样的:
//load your dependencies here
var something = require("something");
//module.exports is necessary to export your code,
//so that you can fetch this code in another file by using require.
module.exports = function() {
abc: function(){
//code for abc function
},
xyz: function(){
//code for xyz function
}
}
现在,如果您将包裹放在任何网站上,您可以按以下方式访问:
npm install https://ex.com/path/to/js/file.js
现在,您的包的副本将被放入node-modules文件夹。
所以,现在您可以访问它:
var x = require('name-of-your-package-in-node-modules');
现在,你也可以这样做:
var abc = require('name-of-your-package-in-node-modules').abc;
或
var xyz = require('name-of-your-package-in-node-modules').xyz;
答案 1 :(得分:0)
我能够加载一个远程js文件并执行其中定义的功能,希望它将为您提供足够的起点...
我的远程dummy.js,可以在线访问某个地方:
const dummy = () => console.log('dummy works');
我的download.js:
const vm = require("vm");
const rp = require('request-promise');
module.exports = {
downloadModule: async () => {
try {
let body = await rp('http://somewhere.online/dummy.js');
let script = vm.createScript(body);
script.runInThisContext();
// this is the actual dummy method loaded from remote dummy.js
// now available in this context:
return dummy;
} catch (err) {
console.log('err', err);
}
return null;
}
};
您需要添加request-promise软件包。
然后在main.js中,我像这样使用它:
const {downloadModule} = require('./download');
downloadModule().then((dummy) => {
if (dummy) dummy();
else console.log('no dummy');
});
当我运行它时,这就是我得到的:
$ electron .
dummy works
我想创建一个实际的模块并需要它,但是我没有时间进一步研究它。如果完成该操作,则将其添加到此处。