2016-09-07 71 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。