2016-09-07 47 views
5

Zazwyczaj w aplikacji Electron można require moduły węzłów zarówno z głównego procesu i procesu renderer:require() Moduł węzeł z procesu renderer Elektronowej podawane przez HTTP

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

Jednak nie robi wydaje się działać, jeśli strona została załadowana przez HTTP zamiast z lokalnego systemu plików. Innymi słowy, jeśli otworzyć okno jak poniżej:

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

mogę require moduł węzła bez problemów. Ale jeśli zamiast otworzyć okno jak poniżej:

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

już nie może require moduły węzłów wewnątrz mojej stronie internetowej - mam Uncaught Error: Cannot find module 'my-module' w konsoli strony internetowej. Czy jest jakiś sposób na użycie modułów węzłów na stronie Electron obsługiwanej przez HTTP?


Trochę kontekst: Moja firma jest budowanie aplikacji, która wymaga zdolności do znajdować się jako aplikacja internetowa i wewnątrz muszli Elektronowej. Aby uprościć i uprościć oba środowiska, moja aplikacja Electron uruchamia lokalny serwer internetowy i otwiera aplikację hostowaną pod numerem http://localhost:1234. Teraz chciałbym dodać do aplikacji możliwość sprawdzania pisowni/pisowni, używając electron-spell-check-provider. Ten moduł musi zostać zaimportowany i zainicjowany w procesie renderowania, więc próbuję otworzyć na mojej stronie require('electron-spell-check-provider'), ale to nie powiedzie się z błędem Cannot find module.

+0

Nie jestem pewien, ale wydaje się, że wersja http pobiera różne rzeczywiste ścieżki dla plików. Spróbuj zmienić instrukcję require przez: => "require (" ./ elektron-sprawdzanie pisowni-dostawcy ")" –

+0

Czy próbowałeś: 'require ('electron') remote.require ('dostawca sprawdzania pisowni elektronów ")'? – ahwayakchih

+0

Czy w końcu to wymyśliłeś? remote.require() działa dla mnie, ale to nie zawsze jest dobre rozwiązanie. W inny sposób to zrobić? – logidelic

Odpowiedz

-1

Wystąpił podobny problem. Spróbuj służąc renderer.js ponad HTTP w index.html jak tak,

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

Potem, jak na docs załadować moduł w użyciu pilota dodając po wymagać w swoim renderer.js plik.

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

+0

Co zawiera moduł renderowania? – Coder

1

końcu zorientowali to. W głównym procesie, dowiedzieć się bezwzględną ścieżkę do katalogu node_modules, jak w:

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); 

Teraz dostać tę drogę do procesu renderer przez jakiś IPC. Wreszcie, w rendererze można teraz wymagać użycia bezwzględnej ścieżki:

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

Działa doskonale dla mnie z elektronem 1.6.7.