8

Nicholas ZakasAddy Osmaniによるこれらの講演では、大規模な Javascript アプリケーションを構築する際に、基礎となるベース ライブラリからアプリケーションを切り離すために、ファサード パターンをサンドボックスとして使用するというアイデアについて議論しています。

この分離により、理論的には、アプリケーション モジュールを書き直さなくても基本ライブラリを切り替えることができます。しかし、実際には、これを実装するのはもっと難しいようです。

AuraJSなど、この提案されたアーキテクチャの具体的な実装があります。ただし、ソースを見ると、サンドボックスには、そのメソッドの一部から jQuery オブジェクトを返すことによって、依然として漏れのある抽象化が含まれているようです。

特に AuraJS には関心がありませんが、多くの機能を失わずに jQuery のようなライブラリを抽象化しようとする一般的な概念の方が重要です。

例として、私のファサード/サンドボックスに dom method があるとし.find(selector)ます。返される可能性のあるものについて、3 つのオプションを考えることができます。

  1. jQuery オブジェクト- これにより、jQuery が消費モジュールに漏れ出します。

  2. 生の DOM 要素- 機能が失われます。誰もこれを操作したくありません! 連鎖なし。

  3. カスタム jQuery ライク ラッパー- 非常に複雑になる可能性がありますが、理想的なソリューションのようです。

私の質問は、jQuery のようなライブラリを機能をあまり失わずに抽象化して、将来のある時点で最小限の労力で置き換えることができるようにするにはどうすればよいでしょうか?

4

2 に答える 2

0

モジュールをアーキテクチャとして使用する非常に簡単な例を次に示します。

<!DOCTYPE html>
<title>Module play</title>
<body>
<script>

// myCore provides all functionality required by modules
// Could use a library in here
var myCore = {

  getContainer: function() {
    // code in here to find a suitable container in which to put widgets
    // This is where different client capabilities will be tested to ensure the
    // widget behaves in it's user agent context - desktop, phone, tablet, pad, etc.

    // very simple shortcut
    return {
            element: document.body,

            // This function could use a general purpose library
            add: function(widget) {
              this.element.appendChild(widget.getElement());
            }
    };

  },

  // This function could use a general purpose library
  getNewWidget: function() {
    var element = document.createElement('div');

    return {

      getElement: function() {
        return element;
      },

      display: function(text) { 

        // Tightly couple to itself or not? 
        this.getElement().innerHTML = '<em>' + text + '</em>';

        // or
        element.innerHTML = '<em>' + text + '</em>';
      }
    }
  }
};

// Missing sandbox layer...

// Add a module - only uses myCore API (access should be controlled by
// the sandbox), does not deal with underlying library or host objects
(function() {

  // Get a container to add a widget too
  var container = myCore.getContainer();

  // Create a widget
  var widget = myCore.getNewWidget();

  // Add the widget to the container
  container.add(widget);

  // Give something to the widget to display
  widget.display('Hello World');

}());

</script>
</body>

したがって、モジュール レベルでは、ホスト環境や基盤となるライブラリは気にせず、単純な ECMAScript を記述しているだけであることがわかります。あなたは本当に防御的になり、次のようなことをすることができます:

(function() {
    var container, widget;

    if (!myCore) return;

    if (myCore.getContainer) { // Some would include an isCallable test too

      container = myCore.getContainer();
    }

    // getWidget could be a method of container instead so that
    // everything you need is either a method or property of container
    // or widget
    if (myCore.getWidget) {
      widget = myCore.getWidget();
    }

    ...
}

など、すべてがテストされ、チェックされます。エラー処理は省略しましたが、この例で十分であることを願っています。

于 2013-04-17T03:53:14.590 に答える
-1

よりモジュラーなコードを書くことについて質問されていると思いますが、jquery は適切なケースではありません。

非同期モジュールの定義 http://addyosmani.com/writing-modular-js/

于 2013-04-16T09:14:05.123 に答える