繁体   English   中英

电子:加载外部脚本并将其传递给函数

[英]Electron: loading an external script and passing it into a function

我正在构建一个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而不先执行它吗?

您尚未提供有关file.js的任何详细信息。 但我可以给你一般的想法。

您至少需要两件事来调用包模块:

  1. file.js(当然你有)和
  2. 的package.json

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;

我能够加载远程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

我想创建一个实际模块并要求它,但我没有时间进一步使用它。 如果我完成了,我会在这里添加它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM