2012-03-26 7 views
4
  • vm.runInNewContextはevalのような黒い魔法と見なされますか?
  • requireと ファイルを読み込み、それを実行するためにvmを使用して、またはフードの下に同じである(あなたは、キャッシングなどを実施し、ちょうど コンテキストにいくつかの変数を追加したい 場合)との間に 大幅なパフォーマンスの違いがあります

答えて

3

runInNewContextは、代わりにあなたが安全に他のスクリプトを実行できるサンドボックス環境を作成する方法として、requireまたはevalの代替として使用されるものではありません。

短所(作成には10ミリ秒かかります)が短く、数メガバイトを要します。そう、いいえ、それを交換するrequireとして使用しないでください。

+0

コントローラオブジェクト( '/ controllers/blog_controller.js')をロードしてコンテキスト内にヘルパーを含める場合、パフォーマンスペナルティはほとんどありません。 (コントローラーは一度だけロードされます) –

+0

ただしないでください。それは一般的な事のための非常に悪い習慣と考えられている。自分のコントローラコードをサンドボックス化する必要があると思われるのはなぜですか? –

+0

railway-jsがそれを使ってコントローラにもっと豊かなコンテキストを提供するのと同じ理由で、 'vm'を使うよりも私が好きな良い解決策が見つかりました。ありがとう! –

7

コードimplements loading Modules in node.jsをチェックすると、vm.runInNewContextまたはvm.runInThisContextが必要です。しかし、requireは、モジュールをキャッシュするようないくつかの余分なことをします。

node documentationは、動作がvmコマンドとevalでどのように類似していて異なるかを示しています。

したがって、evalとvmはすべて少し異なりますが、すべてを使用してコードをロードできます。クライアントから来る任意のコードを読み込んでいる場合、それらはすべて同様のセキュリティ問題を抱えています。

+0

上記のnode.jsへのソースコードリンクは "古代"なので、もっと最近の7.10.0ソースコードリンクがあります:https://github.com/nodejs/node/blob/v7.10.0 /lib/module.js#L543これらは 'vm.runInThisContext'または' vm.runInDebugContext'を使います。 'eval'について'(0、eval)(....)のようなカンマ式を使うと、グローバルスコープで評価されたスクリプトを取得して、node.js docuリンクの例に示すようにローカルスコープを汚染することができますあなたはページ上で "eval"を検索します。 –

関連する問題