8

最初に少し歴史がありますが、基本的にモジュールである多くのjavascriptファイルで構成されているエンジンがあります。これらのモジュールは、指定された名前空間の下にありますが、グローバルスコープに割り当てられた単一のクラスを返します。

エンジン自体はeラーニングコンテンツを表示するために使用され、それぞれの異なるeラーニングコースはわずかに異なるニーズを必要とします。そこでは、必要な機能に基づいてjavascriptファイルをページに含めます。(エントリページは1つだけです)。

AMD、require.js、r.jsに変更する価値があるかどうか、またはページに必要なすべてのものを含み、1つのスクリプトに最小化する現在のシステムを維持する方がよいかどうかを検討してきました。

AMDに行くことに関する私の最大の問題の1つは、クラスを簡単に拡張するのが難しいように思われることです。たとえば、元のクラスの動作をわずかに調整する必要がある場合があります。そのため、元のプロトタイプをコピーして元のクラスを拡張する別のスクリプトインクルードをページに追加し、applyでオーバーライドされている元の関数を実行してから、必要な追加コードを実行します。

元のファイルを適応させずにAMDモジュールを拡張できますか?それとも私は要点を見逃していて、私たちは現在行っていることにとどまるのが最善ですか?

4

2 に答える 2

6

最近、RequireJSを使用してプロジェクトを開始しましたが、アンダースコアを拡張するために使用する方法は、次のようになります。

関連するディレクトリ構造:

  • /scripts
  • /scripts/underscore.js
  • /scripts/base/underscore.js

実際のアンダースコアライブラリは/scripts/base/underscore.jsにあります。

私の拡張機能は/scripts/underscore.jsにあります。

/scripts/underscore.jsのコードは次のようになります。

define(['./base/underscore'], function (_) {
    'use strict';

    var exports = {};

    // add new underscore methods to exports

    _.mixin(exports); // underscore's method for adding methods to itself

    return _; // return the same object as returned from the underscore module
});

通常の拡張機能の場合、次のようになります。

define(['underscore', './base/SomeClass'], function (_, SomeClass) {
    'use strict';

    _.extend(SomeClass.prototype, {
        someMethod: function (someValue) {
            return this.somethingOrOther(someValue * 5);
        }
    });

    return SomeClass;
});

アンダースコアに関する注意:他の場所では、RequireJS shim-configを使用してアンダースコアをAMDモジュールとしてロードしましたが、シムされていないAMDモジュールではこのプロセスに影響はありません。

于 2012-10-01T03:34:26.893 に答える
0

コンストラクター関数を含むモジュールを持つことができます。これらのモジュールが含まれると、使用できるようになります。その後、それらからオブジェクトを作成できます。

requireの例:

//construction.js
define(function(){

    //expose a constructor function
    return function(){
        this....
    }
});

//then in foo.js
define([construction],function(Construction){
    var newObj = new Construction;  //one object using constructor
});

//then in bar.js
define([construction],function(Construction){

    //play with Construction's prototype here then use it

    var newObj = new Construction;
});
于 2012-04-25T08:35:17.470 に答える