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

时间:2017-07-20 19:45:54

标签: javascript node.js electron external require

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

2 个答案:

答案 0 :(得分:1)

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

至少需要两件事来将您的包称为模块:

  1. file.js(当然你有)和
  2. 的package.json
  3. 你的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

我想创建一个实际的模块并需要它,但是我没有时间进一步研究它。如果完成该操作,则将其添加到此处。