0

数日前、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ローダーについて簡単な調査を行い、それらの多くは私の例のような深い依存関係では機能しない(または機能しますが醜い方法で)ことがわかりました。 、特定の依存関係の依存関係を心配することなく(あなたが今何を意味するのか)。

requireJs のようないくつかの深刻なローダーはそれを行うことができますが、私はそれらがそのような場合の b/c で少し面倒だと思います:

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

...ほんの少しの依存関係に対して、コードが多すぎます。

また、スクリプトを変更する必要があるのは好きではないので、$ を返す必要がある場合、jQuery のようなものを返します。

時間を節約し、すべてのローダーを試すのを避けるために、この質問を作成しました。

したがって、大きな問題は、どの JS ローダーが次のことを実行できるかということです。

  1. 私の例のように、すべての依存関係と依存関係のすべての依存関係 (...など) が読み込まれたときにのみ callback() が起動されるときに、「深い」依存関係を読み込みます。
  2. 依存関係リストとコールバックを備えた 1 つの reuqire 関数を持つように、小さなフットプリントを持ち、「コールバック」を返して何かを渡す必要はありません (通常、ga、gb、gc などの独自の名前空間があるため)。

私がそれを見たいと思ういくつかの例:

#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';
});

*私の英語でごめんなさい。

Ps - 実際には、私は独自のローダーを作成しました。これは、特定のことを行い、$script.js よりも小さい (580 バイト) ですが、何かが必要な場合は、現在のスクリプトのファイル名をこのように渡す必要がありますrequire('main.js', ['b.js'], function(){});- しかし、私はしません私の実現に頼りたいです。

4

2 に答える 2

0

この質問をしてからしばらく経ちました。問題の解決策は、requireJs を使用することでしたが、別の方法でモジュールを定義しました。

define(require){
  var dep1 = require("dep1"),
  dep2 = require("dep2");

  var MyModule = {//define something};

  return MyModule;
};
于 2013-10-28T13:18:01.010 に答える
0

これは、要件を で実装する方法の 1 つです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、バックボーンなどの複数の依存関係があり、すべてを分離したい場合は、2 番目のリストのようなものになります。ただし、別のアプローチとして、「グローバル」ライブラリ (jQuery など) をローダーなしでグローバルにロードし、require.js独自のクラスとコード部分のみを処理することができます。

于 2012-05-05T22:18:20.670 に答える