2012-03-19 20 views
8

グローバルな名前空間を汚染することなく、Javascript APIをスタンドアロンのライブラリとして公開したいと考えています。私はhttp://requirejs.org/docs/faq-advanced.htmlに従って自分自身の要求を汚染しないようにラッパーを作りました。私はこれまでのことを単純化しましたが、これが正しい方法であるかどうか、あるいは別の方法でやるべきかどうかはわかりません。このライブラリを使用してrequireJSモジュールをグローバル名前空間に公開する正しい方法は何ですか?

var MyApi = MyApi || {}; 
var MyApiRequireJS = (function() { 
    // require.js pasted here 
    return {requirejs: requirejs, require: require, define: define}; 
})(); 

(function(require, define, requirejs) { 
    require.config({ 
    baseUrl: 'js/scripts', 
    waitSeconds: 30, 
    }); 

    define('myapi', ['jquery', 'underscore'], 
    function($, _) { 
     $.noConflict(true); 
     _.noConflict(); 
     function api(method, args, callback) { 
     // do stuff here 
     } 
     return {api: api}; 
    } 
); 

    require(['myapi'], function(myapi) { 
    MyApi = myapi; 
    }); 
}(MyApiRequireJS.require, MyApiRequireJS.define, MyApiRequireJS.requirejs)); 

サイトでは、上記のコードを参照するスクリプトタグを含め、その後

MyApi.api('some_remote_method', {foo: 'bar'}, function(result) { 
    // handle the result 
}); 
+0

あなたは 'require'と' define'をグローバル名前空間に入れたくないと言っていますが、 'MyApi'と' MyApiRequireJS'がグローバル名前空間にあるのはうれしいですか?理由を聞いてもいいですか? –

+0

グローバル名空間で 'MyApi'よりも' require'と 'define'をすでに使用している可能性が高いです(' MyApi'は私が使うつもりのvarではなく、単純にそれを使用しています)。同様にfacebook connect apiは、グローバル名前空間を 'FB'で汚染するだけです。 –

+0

彼らは 'require'または' define'を使用していますか?あなたは知ることができますか?そうでない場合、問題はありません。グローバルな名前空間が何を使用しているのかわからない場合は、定義したグローバルがまだ使用されていないことを確認することはできません。 –

答えて

0

を使用してAPIを呼び出します私は、あなたがそれあなたの問題せることによって誰か他の人の問題を先取りしようとしていると思います私はあなたが本当にそれを合理的に行うことができるとは思わない。リンク先のページは、既にJavascriptグローバルが「require」または「define」という名前のユーザーがRequireJSグローバルの名前を異なるものに変更できるように設計されています。依存関係を独立して解決する2つの個別のRequireJSインスタンスを作成することは意図されていません。あなたが本当に名前空間の汚染を最小限に抑えようとしているのであれば、ちょうど1つの名前MyApiを公開する必要があります。 RequireJSのプライベートコピーとAPIコードを含むモンスタークロージャーを1つ作成し、APIで公開するメソッドのみを返します。

APIをrequireJSモジュールを定義するバージョンとrequireJS依存性を持たないバージョンの2つのバージョンで提供する方がはるかにやさしく/簡単です。

関連する問題