requirejs
Apple 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 つのケースをどのように区別できますか?