2012-04-29 2 views
11

JSの限界は、コードの実行を分離する能力が低いことです。私はコードが実行されるコンテキストを制御できるようにしたいJavaScriptの実行を隔離する

、「Node.jsの中に何Script.createContext & Script.runInContextに同様の効果を得る何かが(ノードがV8エンジンへの結合を使用していないので、私がすることができます実装をエミュレートします)。ここで

は、私はコードの実行を分離する理由いくつかの理由である:

  1. は、グローバル名前空間(windowオブジェクトともDOM)からコードを分離、私はしかし、可能な参照機能する必要がありますコンテキスト内で公開されているオブジェクトを呼び出して同期をとる必要があります。これにより、分離のためにWebWorkerを使用することはほとんど不可能になります。
  2. コードの実行を分離することで、もはや必要でなくなったときにその定義を解放することも可能です(メモリ管理)。

私は1つのiframeにロードするスクリプトによって、部分的に分離された実行を達成することができる知っている、このアプローチは、しかし、非常に重く、私がしようとしている何のために必要とされていないDOMの2番目のインスタンスのために多くのメモリを使用していますする。

コンストラクタ定義を共有する必要があります。また、メインUIスレッド上で実行する必要がある分離されたコンテナ/コンテキスト間で共有されるオブジェクトの定義も共有する必要があります。主に私は自分自身のContext2Dオブジェクト上で描画コマンドを呼び出すことによって、それぞれが提示し、動的にビューポートを更新するプラグイン/モジュール(ミニアプリケーション)をホストするために、これらの分離されたコンテナを使用したい。

これらのコンテナは、メインUIスレッドで実行されていない場合には、ウォールドプロキシに痛いほど難しいことで画像オブジェクトがWorkerで作成することができないように、すべての役に立たないだろうなctx.measureText()ctx.drawImage()として呼び出します。

誰かがこれを可能にする将来の仕様を知っていますか?

これを達成するために使用できる現在の(隠された)ブラウザ側のAPIはありますか?

GoggleのDart VMのような仮想マシンを利用し、現在のコードベースを再実装する方が良いでしょうか? 私の現在のコードベースは20,000行をわずかに上回っています。あなたは複数を持っているしたい場合は

(function() { 
    // all your code goes here 
    // nobody outside of your code can reach your top level variables here 
    // your top level variables are not on the window object 

    // this is a protected, but top level variable 
    var x = 3; 

    // if you want anything to be global, you can assign it to the window object. 
    window.myGlobal = {}; 

    function myTopLevelFunction(x,y,z) { 
     // code here 
    } 

})(); 

それはあなたが簡単な自己実行中の関数オブジェクトとグローバル・ネームスペースからコードを分離することができます*

+4

*このように修正する必要がある*既存の問題*がありますか? [IIABDFI](http://acronyms.thefreedictionary.com/IIABDFI)。 – Ryan

+0

コメントに同意しますが、downvoteは少し不要です。 – Starx

+0

@minitech私は実際に私がクライアント側のプラットフォーム用のプラグインアーキテクチャを達成しようとしているため、ブラウザランタイムでsandoxesの欠如(これは私が上で説明したもののより良い言葉です)に問題があります。 JavaScriptで書かれており、ブラウザランタイムを利用しています。プラットフォームは汎用的で、主な目的は、プラットフォームに追加機能を提供するプラグイン/モジュール/ミニアプリケーションを動的にロードして制御するための環境をホストすることです。 – Raweden

答えて

3

で再実装フレームワーク方が良いでしょうこれらの実行コンテキストのうちの1つを実行し、それらの間で共有することができれば、1つの公的に知られている場所、本当にグローバル変数か、既知のDOMオブジェクトまたはそのようなプロパティのいずれかを介してランデブーを行う必要があります。 1つのグローバル名前空間オブジェクトを宣言し、モジュール間で共有しているものへのアクセスにはそのプロパティを使用するのが比較的一般的です。私はそれが完全に完璧ではないことを知っていますが、それは機能します。ここでは、単一のグローバル名前空間のオブジェクトを使用してrendevousの例です:

// module AAA 
(function() { 
    // module AAA code goes here 

    // set up global namespace object and whatever references we want to be global 
    window.myModuleTop = window.myModuleTop || {}; 
    myModuleTop.AAA = {}; 
    myModuleTop.AAA.myFuncA = function() {}; 

})(); 


// module BBB 
(function() { 
    // module BBB code goes here 

    // set up global namespace object and whatever references we want to be global 
    window.myModuleTop = window.myModuleTop || {}; 
    myModuleTop.BBB = {}; 
    myModuleTop.BBB.myFuncB = function() {}; 

})(); 
+0

OPが尋ねている孤立のタイプなのかどうかわかりません。 _(でも私も彼も理解しているとは思えません)_ – Starx

+0

@Matt、私はOPのコードをウィンドウに戻さないようにするつもりはありません。それはいつも簡単です。私はOPのコードから他の人を守り、OPのコードを他人のコードから隔離しておくようにしています。 – jfriend00

+0

@ jfriend00ええ私は、OPが探しているものにいくつかの混乱があると思う – Matt

2

私はこのために見てきた最も近いライブラリがCajaです。

基本的に非厳密なjavascriptコードでは、グローバルオブジェクト(ブラウザではwindow)にアクセスする方法はたくさんあります。真の隔離は非常に難しい問題です。 Cajaはこれにパッチを当てるために面倒なiframingを行いますが、正直言って私はそれがどのように動作するのか正確にはわかりません。

+0

厳密なモードを強制すると、スクリプトを評価するようなことをすることによって、これははるかに簡単にできますか? –

+0

@BT 'use strict'は確かに状況を改善しましたが、まだパッチを当てなければならないことがたくさんあります。それは安全な保証からはほど遠い。たとえば、setTimeoutなどを呼び出すと、ウィンドウを暗黙的に呼び出すことができます(たとえそれをオーバーライドしたとしても)。 (<})); '< - これは、字句オーバーライドにもかかわらずグローバルウィンドウを表示します – Matt

+0

同じトークンによって、より完全な結果を得るためにウィンドウのためにやっているのと同じように、' setTimeout'を字句的にオーバーライドできます。 –

1

「標準」名前にオプションを付けることはできますか?好きなもの:

このアプローチは、私が考えることができる最も単純なものであり、多くの問題の解決策である可能性があります。実際のサンドボックスではありませんが、コードのエラーを少なくすることができます。

0

上記の他の回答のようにクロージャを使用して、シャドウドームを使用してユーザーがドミノの残りの部分にアクセスできないようにすることはできませんでしたか?このような何か:

var containerNode = someDomNode 
var root = containerNode.createShadowRoot() 
;(function(root){ 
    var window = null, document = null, history = null, 
     screen = null, navigator = null, location = null 

    // isolated code goes here 

})(root) 

警告:

  • あなたが孤立したコードのコンテキスト外、他のグローバルオブジェクトを作成した場合、あなたは私がなど、ウィンドウ、ドキュメント、で行ったように、明示的に変数をシャドウする必要があり、それ以外の場合は、孤立したコードがアクセスします。
  • これは、分離コードがdomと全くやりとりする必要がない限り、明らかにシャドードームを持たないブラウザでは機能しません。
  • あなたがいないを行うあなたはそれがへのアクセスを許可するものへの参照が含まれていないとあなたはが孤立したコードへのアクセスを与える行うオブジェクト、非常に注意する必要があります。時にはこれはスーパーエラーが発生しやすくなります。
  • 私はこの提案をしていますが、それはうまくいくと思っていますが、ウィンドウとドキュメントオブジェクトのようなものに到達する追加の方法があるかどうかはわかりません。
関連する問題