簡體   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