来自Electron渲染器进程的require()节点模块通过HTTP提供服务

通常,在Electron应用程序中,您可以从主进程和渲染器进程中require节点模块

 var myModule = require('my-module'); 

但是,如果页面是通过HTTP加载而不是从本地文件系统加载的,这似乎不起作用。 换句话说,如果我打开一个这样的窗口:

 win.loadURL(`file://${__dirname}/index.html`); 

我可以require一个节点模块没有问题。 但是,如果我打开一个这样的窗口:

 win.loadURL(`http://localhost:1234/index.html`); 

我不再require在我的网页内的节点模块 – 我得到Uncaught Error: Cannot find module 'my-module'网页的控制台Uncaught Error: Cannot find module 'my-module' 。 有什么办法可以在通过HTTP提供的Electron页面中使用节点模块?


一点上下文:我的公司正在构build一个应用程序,需要能够作为一个Web应用程序, 在一个电子壳内。 为了使这两个环境更简单和一致,我的Electron应用程序启动本地Web服务器并打开托pipe在http://localhost:1234的应用程序。 现在,我希望能够使用electron-spell-check-provider程序将拼写检查/拼写build议添加到应用electron-spell-check-provider 。 这个模块需要在渲染器进程中被导入和初始化,所以我试图在我的网页中require('electron-spell-check-provider') ,但是这样会导致Cannot find module错误。

终于明白了这一点。 在主进程中,找出node_modules目录的绝对path,如下所示:

 var nodeModDir = require.resolve('some-valid-module'); var dirnm = 'node_modules'; var pos = nodeModDir.lastIndexOf(dirnm); if(pos != -1) nodeModDir = nodeModDir.substr(0, pos+dirnm.length+1); 

现在通过一些IPC获取到渲染器进程的path。 最后,在渲染器中,您现在可以使用绝对path:

 var mymod = require(nodeModDir+'some-valid-module'); 

用电子1.6.7完美地工作。

有一个类似的问题。 尝试在你的index.html中通过HTTP服务renderer.js像这样,

  <script src="/renderer.js"></script> </body> 

然后,根据文档 ,使用您的renderer.js文件中的require之后的加载远程程序加载您的模块。

var spellCheck = require('electron-spell-check-provider').remote;