来自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;