2012-05-05 7 views
0

数日前、私はJSローダーが必要だったという問題に遭遇しました。最小のコードフットプリントを持つJSローダー

私は、次のファイルを持っている:

#c.js 
var c = {//something}; 

#b.js 
var b = Object.create(c); 

#main.js 
var a = Object.create(b); 
a.foo = 'bar'; 

は、私は、これは "c.js" から始まる、順次ファイルをロードする必要があります。

私はjsローダーに関するいくつかの素早い研究を行い、それらの多くが私の例のような深い依存関係で動作しない(または動作しますが醜い方法で)ことを発見し、すぐにコールバック関数を起動します。与えられた依存関係の依存関係を心配することなく、与えられた依存関係をロードします(今あなたが意味するものなら)。

define([ 
    'jQuery', 
    'Underscore', 
    'Backbone', 
    'views/projects/list', 
    'views/users/list' 
], function($, _, Backbone, Session, projectListView, userListView){ 

...コードのあまりを、わずか数の依存関係のために:requireJsのようないくつかの深刻なローダーはそれを行うことができますが、私はB/Cこのようなケースの彼らは少し迷惑見つける

Althought。

また、私はいくつかのスクリプトを修正すべきではないので、$を返すべきときにjQueryのようなものを返します。

時間がかかりすぎてすべてのローダーを試してみるのを避けるために、私はこの質問を作成しました。

ので、大きな問題は、JSローダーは次の操作を行う可能性があり、次のとおりです。コールバックは()場合にのみ、すべての依存関係と、すべてを起動されるとき、私の例のように

  1. ロード「深い」依存関係を、依存関係の依存関係(...など)が読み込まれます。
  2. reuqire関数が1つしかなく、dependencyListとコールバックを持つようなもので、何かを返すためにコールバックを持たなくても構いません(g.a、g.b、g.cのような独自の名前空間があります)。

私はそれを見たいのですがどのようにいくつかの例:

#c.js 
require([], function(){ 
var c = {//something}; 
}); 

#b.js 
require(['c.js'], function(){ 
var b = Object.create(c); 
}); 

#main.js 
require(['b.js'], function(){ 
var a = Object.create(b); 
a.foo = 'bar'; 
}); 

*私の英語のため申し訳ありません。

p.s. - 実際に私は自分のローダーを書いていますが、これは$ script.jsでも小さく(580バイト)ですが、何かが必要なときには現在のスクリプトのファイル名を渡すべきです。require('main.js', ['b.js'], function(){}); - しかし私はしません私の実現に頼りたい。

答えて

0

私はこの質問をして以来、しばらくしています。 問題を解決するには、requireJsを使用していましたが、代わりの方法でモジュールを定義していました。

0

これはrequire.jsであなたの要件を実装するためにどのように一つの方法です:

// c.js 
define(
    {/*something*/} 
); 

// b.js 
define(['c.js'], function(c) { 
    return Object.create(c); 
}); 

// main.js 
require(['b.js'], function(b) { 
    var a = Object.create(b); 
    a.foo = 'bar'; 
}); 

私には、これはあなたが見たいと思ったものにかなり近いようで、そうではありませんか?

jQuery、Backboneなどのような複数の依存関係があり、すべてを切り離したい場合は、2番目のリストのようになります。しかし、グローバルなライブラリ(jQueryなど)をローダーなしでグローバルにロードし、require.jsが自分のクラスとコードパーツだけを扱えるようにすることもできます。

関連する問題