web-dev-qa-db-ja.com

Node.jsを使用してサーバー側で複数のJSファイルを管理する方法

私はNode.jsを使用してプロジェクトに取り組んでおり、サーバー側のコードは十分に大きくなっており、複数のファイルに分割したいと思っています。これは長い間クライアント側で行われたようで、開発は各ファイルにscriptタグを挿入することで行われ、配布のためだけにすべてをまとめるために使用される「Make」のようなものです。すべてのサーバー側コードを連結しても意味がないので、その方法を尋ねるつもりはありません。使用できる最も近いものはrequire()ですが、ブラウザのscriptのように振る舞わず、require'dファイルが共通の名前空間を共有しません。

Shooter のような古いNode.jsプロジェクトを見ると、これはかつてそうではなかったようです。私のrequire'dファイルは、コンパイル時または実行時にグローバル呼び出し名前空間にアクセスできません。これを回避する簡単な方法はありますか?それとも、必要なすべてのJSファイルを呼び出しスコープから完全に自律的にする必要がありますか?

40
Matt Molnar

グローバルは悪であるため、共通の名前空間は必要ありません。ノードでモジュールを定義します

// someThings.js

(function() {
    var someThings = ...;

    ...

    module.exports.getSomeThings = function() {
        return someThings();
    }

}());

// main.js

var things = require("someThings");
...
doSomething(things.getSomeThings());

モジュールを定義し、exportsに書き込むことでモジュールのパブリックAPIを公開します。

これを処理する最良の方法は、依存性注入です。モジュールはinit関数を公開し、モジュールに依存関係のオブジェクトハッシュを渡します。

グローバルスコープへのアクセスを本当に要求する場合は、globalを介してアクセスできます。すべてのファイルは、globalオブジェクトに書き込みおよび読み取りできます。繰り返しますが、グローバルを使用する必要はありません。

59
Raynos

re @ Raynos answer 、モジュールファイルがそれを含むファイルの隣にある場合、

var things = require("./someThings");

モジュールがnpmで公開およびインストールされている場合、または./node_modules/フォルダーに明示的に配置されている場合、

var things = require("someThings");

正しい。

34
michielbdejong