【问题标题】:Electron: loading an external script and passing it into a functionElectron:加载外部脚本并将其传递给函数
【发布时间】:2017-12-26 16:42:23
【问题描述】:

我正在构建一个 Atom Electron 应用程序。现在我在我的一个 webviews 的 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 函数一起使用。我的感觉是 require 仅适用于本地文件。如果 AJAX 是答案,我可以看一个如何获取脚本的示例,然后将其传递到我的work 而不事先执行它吗?

【问题讨论】:

  • 您的问题有解决方案吗?

标签: javascript node.js electron external require


【解决方案1】:

您尚未提供有关您的 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;

【讨论】:

  • 谢谢,这非常有帮助。但是,即使在最终打包的应用程序中,我也希望 Electron 获取外部 js 文件。这样我就可以在我的服务器上编辑文件,并且用户在重新启动应用程序时会看到更改,因此无需更新!也许这甚至是不可能的,但如果你知道如何做到这一点,请告诉我:)
  • @TMack 很抱歉地说我对这种情况不太了解。但我认为这会有所帮助。让我明确你的要求。您在某个 url 上有一个名为 x 的包。当您更新包中的文件时,如果您重新启动电子应用程序,您应该应用新的更改。如果我是对的,那么看看我的答案。这里最简单的方法是在每次运行应用程序之前运行 npm install x --save。要自动执行此过程,请将 npm install x --save 放在 package.json 文件的启动脚本中
  • @Vishal,这不是他想要的。他想启动一个可执行文件并拥有该可执行文件,然后选择最新的脚本。在启动可执行文件之前,他无法在客户端机器上运行 npm update。
  • @PredragStojadinović 我不知道这一点。如果您对这种情况有所了解,那么请对此有所了解。这对我以及其他面临同样问题的开发人员都会有所帮助。
【解决方案2】:

我能够加载一个远程 js 文件并执行其中定义的函数,希望它能为您提供足够的开始......

我的远程 dummy.js,在某处在线提供:

const dummy = () => console.log('dummy works');

我的下载.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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2013-08-21
    • 2022-01-14
    相关资源
    最近更新 更多