0

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

私のプロジェクトは次のように設定されています:

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

electron の起動時にデフォルトで表示されるページである私の index.html は、body タグの末尾に通常のスクリプトとして controller.js をロードします。

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

controller.js の上部に次のコードがあります。

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

electron Chromium ウィンドウを起動すると、すぐに次の問題が発生します。

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

私の仮定では、controller.js ファイルからインポートする game.js ファイルへの相対パスが必要ですが、どのような調整を行っても、常にそのエラーが発生します。tests フォルダーの下に仕様がすべて実行されており、次のような require を正常に使用しているため、単なる構文エラーではないと思います。

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

Chromium ブラウザーから実行したときに相対パスが必要とされる方法について、間違った仮定をしていますか? どんな助けでも大歓迎です!

4

1 に答える 1

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

ただし、これらのオプションのいずれかを心から提案することはできません。壊れやすいようです。

正直なところ、私は通常、アプリケーションへの JavaScript の「エントリ」ポイントをindex.html.

于 2016-12-15T00:51:07.267 に答える