0

requirejsApple TV プロジェクトで使用しようとしています。Web 用に書かれたモジュールがたくさんありrequirejsますが、それらを再利用できれば素晴らしいと思います。

Apple TV プラットフォームには特定の制限があり、requirejs を「そのまま」使用することは不可能です。常識的にDOMはありません。問題を克服するために私が見つけた1つの可能な方法は、最初にrequire.js自体をロードしてからその.load()メソッドをオーバーライドするrequire('foo')ことfoo.jsです.

 requirejs.load = (context, moduleName, moduleUrl) ->
    reqModule = new XMLHttpRequest()
    reqModule.open('GET', appRoot+moduleUrl, true)
    reqModule.send(null)
    reqModule.onreadystatechange = ->
     if reqModule.readyState is 4 and reqModule.status is 200
          fn = (new Function(reqModule.responseText))() # parse module                             
          context[moduleName] = fn
          context.completeLoad(moduleName)

したがって、これは次のような通常定義されたモジュールに対して機能します。

  define [], ->
       someField: 'empty field'

次のような自己実行機能でも機能します (shim が構成されている場合):

  (myFoo = ->
      someField:"empty field"
  )()

たとえばUndercore.js、自己実行ラッパーにそれ自体が含まれています

ただし、次のように定義されたモジュールでは機能しません。

 myFoo = ->
    someField:"empty field"

質問: 3 つのケースすべてで機能させるにはどうすればよいですか? ブラウザーで使用すると、requirejs はそれらすべてを正常にロードします。

define私が見つけた1つの解決策は、最後の例のように、ラップされていないモジュールのブロックで 関数をラップするfn = (new Function(reqModule.responseText))()ことです。

fn = define [], (new Function("return "+reqModule.responseText))()

しかし、それはload最初と2番目のケースの両方で壊れます。関数が自己実行ブロックにラップされているかどうかを確認する方法はありますか? 最初の 2 つのケースと最後の 2 つのケースをどのように区別できますか?

4

2 に答える 2

1

質問のコードを出発点として使用して、次のコードを機能させることができました。私は Apple TV を持っていないので、Apple TV でテストすることはできません。ブラウザでテストしました。2番目と3番目のモジュールに適切なシムがある場合、質問で示した3種類のモジュールすべてをロードできます。したがって、ロジックは健全です。不足している部分は、 で代用する必要があるものwindowですeval.call(window, ...)。Node.js では、 になりますglobal。Apple TV で同等のものを知りません。

  requirejs.load = function(context, moduleName, moduleUrl) {
      var reqModule = new XMLHttpRequest();
      reqModule.open('GET', moduleUrl, true);
      reqModule.send(null);
      return reqModule.onreadystatechange = function() {
          if (reqModule.readyState === 4 && reqModule.status === 200) {
              eval.call(window, reqModule.responseText);
              return context.completeLoad(moduleName);
          }
      };
  };
于 2014-02-26T18:45:03.153 に答える