2016-09-07 4 views
5

通常、HTTP上で役立った、あなたはメインプロセスとレンダラープロセスの両方からrequireノードモジュールができます。しかしが必要()ノードモジュールは、電子アプリで、

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

、これはそうではありませんページがローカルのファイルシステムからではなくHTTP経由で読み込まれた場合に動作するようです。言い換えれば、私はこのようなウィンドウを開く場合:

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

私ができるrequireノードモジュールを問題なく。しかし、私が代わりにこのようなウィンドウ開く場合:

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

を私はもはや私のWebページ内のrequireノードモジュールすることができます - 私は、Webページのコンソールで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( './電子スペルチェックプロバイダ)" –

+0

あなたは試しましたか? 'require(' electron ')。remote.require(' electron-spell-check-provider ') '? – ahwayakchih

+0

あなたはこれを理解することになりましたか? remote.require()は私にとってはうまくいくが、それは必ずしも良い解決策ではない。他の方法でそれを行うには? – logidelic

答えて

-1

同様の問題がありました。あなたのrenderer.jsに必要とした後docsごとに、追加のリモートを使用して、あなたのモジュールをロードし、その後、そのようなあなたのindex.htmlをにHTTP経由renderer.jsを提供

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

をお試しくださいファイル。

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で完全に動作します。

関連する問題