2016-09-07 89 views
5

典型地,在一个电子应用,可以从两个主处理和渲染过程require节点模块:需要()节点模块通过HTTP服

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'。在通过HTTP提供的Electron页面中是否有任何方法可以使用节点模块?


一点背景知识:我公司正在建设需要被托管的Web应用程序的电子壳中的能力的应用程序。为了使这两个环境更简单和一致,我的Electron应用程序启动本地Web服务器并打开托管在http://localhost:1234处的应用程序。现在,我希望能够使用electron-spell-check-provider将拼写检查/拼写建议添加到应用程序中。这个模块需要在渲染器进程中导入和初始化,所以我试图在我的网页里面require('electron-spell-check-provider'),但是这个失败并且出现Cannot find module错误。

+0

我不确定,但似乎http版本正在获取文件的一些不同的实际路径。尝试通过以下方式更改require语句:=>“require('./electron-spell-check-provider')” –

+0

您是否尝试过:require('electron')。remote.require('electron-spell-check-provider ')'? – ahwayakchih

+0

你最终搞清楚了吗? remote.require()适用于我,但这并不总是一个好的解决方案。任何其他方式来做到这一点? – logidelic

回答

-1

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

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

然后,按照docs,加载模块中使用添加远程在renderer.js的要求后,文件。

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

+0

渲染器包含什么? – Coder

1

终于明白了这一点。在主过程中,找出绝对路径node_modules目录,如:

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得到这个路径渲染过程。最后,在渲染器中,您现在可以要求使用绝对路径:

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

对电子我完美地用1.6.7。