6

クライアント側では、次のように、SystemJS を使用してモジュールへのパスをスタブ化します。

var systemJsConfig = {
    baseURL: "./",
    defaultJSExtensions: true,
    map: {
        'root-components': 'applicationRoot/rootComponents'
    }
};

require('root-components/foo');マップされapplicationRoot/rootComponents/fooます。

require('root-components/foo');問題は、 Mocha でモジュールを実行すると、ノードがそのパスの意味がわからないことです。ノードでこのパス マッピングを実現する適切な方法はありますか?

Proxyquire はこれに対応していますか? 私は彼らのドキュメントを読みましたが、それを示すものは何も見つかりませんでした.

これは単体テストのためだけなので、あらゆる種類のパーティー ユーティリティを使用したソリューションに満足しています。

4

3 に答える 3

5

唯一の要件が非常に単純な場合は、をオーバーライドするユーティリティ関数を作成できますrequire

新しい require は、パス引数にマッピングを適用し、新しいパスでモジュールを探します。オプションで、マップされたパスに存在しないモジュールをフォールバックできます。コードは次のようになります

const oldRequire = require;
require = (path) => {
    try {
        const mapped = oldRequire(path.replace('root-components/foo', 'applicationRoot/rootComponents/foo'));
        if (!mapped) {
            throw new Error('module not found in mapped directory');
        }
        console.log('module resolved with mapping', path);
        return mapped;
    } catch (e) {
        console.log('using old require without mapped path', path);
        return oldRequire(path);
    }
};
于 2016-06-14T09:40:24.650 に答える
2

オプション 1 - 変更NODE_PATH(非推奨):

node.jsNODE_PATHを起動する前に、モジュール パスをシェルに含めるように変更します。

exports NODE_PATH=./path/to/module:$NODE_PATH

これは、起動前の手順が必要なため、優れたオプションではありません。また、 にNODE_PATHは多くのパスが含まれているため、モジュールのロード元が常に明確であるとは限らず、名前の競合が発生する可能性があります。

オプション 2 - モジュールを外部リポジトリに移動する

コンポーネントを、GitHub プロファイルで利用可能な別の「rootcomponents」リポジトリに移動するとします。

次に、次の方法で直接インストールできます。

npm install --save github:arackaf/rootcomponents

次に、プロジェクト ソースを System.js エイリアスにマップできるはずです。

var systemJsConfig = {
    baseURL: "./",
    defaultJSExtensions: true,
    map: {
        'root-components': 'github:arackaf/rootcomponents'
    }
};

そこから、期待どおりに動作するはずです。

require('root-components/foo');

オプション 3 - 相対パスを介してモジュールをロードします。

このconfig.mapオプションは、外部依存関係をエイリアスにマッピングするためだけのものです。

簡単な代替方法の 1 つは、相対パスを指定することです。相対パスは baseURL に基づいています。

たとえば、ロードしようとしている場合:

src/rootComponents/foo.js

必要なものは次のとおりです。

require('./src/rootComponents/foo')

注: これはすべて、require()ステートメントが System.js のパターン/ルールに従っていることを前提としています。

もう 1 つの可能なオプションはSystem.paths[]、ローカル パスへのエイリアスを作成するオプションを提供することです。これがどのように機能するか、または機能するかどうかは確認できませんが (つまり、試したことはありません)、詳細はここで見つけることができます

于 2016-06-10T17:07:21.590 に答える
1

この gist で説明されているように、さまざまな方法でモジュールのエイリアスを作成できますが、より簡単な方法は、開始ルート パスを で設定し、NODE_PATHそこから移動することです。

NODE_PATH環境変数を使用すると、次のようになります。

NODE_PATH=./src node src/server/index.js

次に、すべてのファイルで、階層内のどこにあるかに関係なく、./srcディレクトリから解決されます。これにより、説明したようなエイリアスが不要になりますが、あなたの場合、多くのファイルの移動/名前変更が必要になる場合があることに気付きました。

例: require('root-components/foo');=>./src/root-components/foo.js

于 2016-06-10T15:10:11.207 に答える