2

要求されたモジュールの名前を受け取り、そのパスを動的に把握してロードする RequireJS プラグインを作成しようとしています。これらのパスを決定するロジックは、特定のビジネス ロジックに基づいているため、同様のことを行う既存のプラグインが役立つ可能性は低いです。

最初にプラグインの正規化メソッドを使用しようとしましたが、奇妙なことが起こっていました。正規化が 2 回呼び出された後、名前に空の文字列を指定してロード メソッドが呼び出されました。

load の構成パラメーターを使用して、正規化せずにすべてが完全に機能するようにしました。これは、隠れた副作用のない適切なソリューションですか?

define('module-loader', {
    load: function(name, req, onload, config){
        var nameParts = name.split('-'),
                langFile = nameParts.length === 3 && nameParts[2] === 'langs',
                indFiles = CR_DEBUG;

        if (nameParts.length > 3){
            //allow for helper names with a dash in them
            nameParts[2] = nameParts.slice(2).join('-');
        }
        var resolvedName = resolve.apply(null, nameParts);

        config.paths[name] = resolvedName;
        req([name], function (value) {
            onload(value);
        });
    }
});

構成オブジェクトは、追加できる現在のrequireJS構成オブジェクトにすぎないと思います。 そして、私が目にしている結果は、これが事実であることを実際に示しています。 しかし、ドキュメントには、構成オブジェクトが何をするかについてかなり異なる説明があります:

config:オブジェクト。構成オブジェクト。これは、オプティマイザーと Web アプリが構成情報をプラグインに渡す方法です。国際化!Web アプリが特定のロケールを強制したい場合、プラグインはこれを使用して現在のロケールを取得します。このプラグイン (または pluginBuilder) がオプティマイザー ビルドの一部として呼び出されている場合、オプティマイザーは構成内の isBuild プロパティを true に設定します。

その説明の一部は私が示唆したことを暗示していますが、専門家がより確実に答えてくれることを願っています.


価値があるのは、これが私の正規化メソッド用に持っていたものです。私は現在持っているソリューションに完全に満足していますが、以下の内容に明らかに問題がある場合は、何を聞いてみたいです:

normalize: function (name) {
    //weird - normalize getting called twice - hack fix for now
    if (/^\//.test(name)) return name;

    var nameParts = name.split('-'),
        langFile = nameParts.length === 3 && nameParts[2] === 'langs',
        indFiles = CR_DEBUG;

    if (nameParts.length > 3){
        //allow for helper names with a dash in them
        nameParts[2] = nameParts.slice(2).join('-');
    }
    var resolvedName = resolve.apply(null, nameParts)

    //alert('returning:' + resolvedName);
    return resolvedName;
},

//and after this there was just a regular load method loaded 
//the name it was passed, but name was coming in as ""
4

0 に答える 0