2016-12-14 16 views
0

私はElectronアプリケーションで作業しようとしており、Chromiumブラウザウィンドウ内で実行中の別のスクリプトからモジュールを要求しようとしているときに問題が発生しています。相対パスを指定するために私が何をするにしても、モジュールを見つけることができないということについては、常に同じエラーが発生します。Chromiumスクリプトの電子要求モジュール

私のプロジェクトは、このように設定されています。本文の最後に通常のスクリプトとして起動し、負荷のcontroller.jsを電子時にデフォルトで育てページです

index.html 
    scripts 
     controllers 
      controller.js 
     models 
      game.js 
     tests 
      spec 
       gameSpec.js 

私のindex.htmlを、タグ。

<script src="scripts/controllers/controller.js"></script> 

controller.js上部に次のコードを持っている:電子クロムウィンドウを起動する際に

var Game = require("../models/game.js"); 
.... some other code ..... 
var game = new Game(); 

を、私は即座にこの問題に遭遇:

Uncaught Error: Cannot find module '../models/game.js' 

私の仮定は、ということです私はcontroller.jsファイルから、それがインポートしているgame.jsファイルへの相対パスが必要ですが、どんな種類の微調整をしても、私はいつもそのエラーを受けています。私が必要と相対パス機能がある方法についての間違った仮定を作っています

var Game = require("../../models/game.js"); 
describe("Game", function() { ... }); 

:私はテストの下でスペックを持っているので、私は正常にこのように必要を使用するすべての実行中や受け渡しをフォルダ、それは単なる構文エラーだとは思いませんChromiumブラウザから実行すると完了しますか?どんな助けもありがとう!

答えて

1

答えよりも回避策のおそらくより多くの、しかし、あなたはここからあなたのスクリプトを含めることを入れ替える場合:これに

<script src="scripts/controllers/controller.js"></script> 

<script>require('./scripts/controllers/controller.js')</script> 

その後、相対パスは、あなたが期待しているように動作するはずです。


私はあなたがsrc属性を持つスクリプトが含まれている場合、そのファイルの現在の作業ディレクトリの内部コンテキストはアプリケーションのルートであることを考える

なぜですか?正直言って100%確信しているわけではありません。スクリプトとして含まれているときにファイルをロードする方法の制限srcの場合は、src属性を使用したい場合は、技術的にはcontroller.jsで動作します。

var Game = require(__dirname + '/scripts/models/game.js'); 
// or 
var Game = require('./scripts/models/game.js'); 

私はこれらのオプションを心から提案することはできません。壊れそうだ。

正直言って、私は通常、私のindex.htmlと同じ場所に自分のアプリケーションにjavascriptの「エントリ」ポイントを含めるので、これまでに気付かなかったことがあります。

+0

返信いただきありがとうございます。残念ながらを要求していないため、同じエラーが発生します。幸いなことに、あなたの提案はvar game = require(__ dirname ....)は魅力的に機能しますが、私はそれが壊れやすく見えて、アプリをパッケージ化したいときに何が起こるか心配しています。私はノードを使わないで.Netからこのプロジェクトを変換しているので、私は移行の中で赤ちゃんのステップを取ろうとしています。 – user1433070

+1

ここで問題となるのは、 'controller.js'はCommonJS/Nodeモジュールですが、' 'はCommonJSモジュールについては何も知らず、ノードのモジュールローダを経由せずに現在のドキュメントにファイルを保存する。 @dvlsgが 'controller.js'をロードする正しい方法は' require'を使うことです。 –

関連する問題