- vm.runInNewContextは
eval
のような黒い魔法と見なされますか? require
と ファイルを読み込み、それを実行するためにvm
を使用して、またはフードの下に同じである(あなたは、キャッシングなどを実施し、ちょうど コンテキストにいくつかの変数を追加したい 場合)との間に 大幅なパフォーマンスの違いがあります
答えて
runInNewContext
は、代わりにあなたが安全に他のスクリプトを実行できるサンドボックス環境を作成する方法として、require
またはeval
の代替として使用されるものではありません。
短所(作成には10ミリ秒かかります)が短く、数メガバイトを要します。そう、いいえ、それを交換するrequire
として使用しないでください。
コードimplements loading Modules in node.jsをチェックすると、vm.runInNewContextまたはvm.runInThisContextが必要です。しかし、require
は、モジュールをキャッシュするようないくつかの余分なことをします。
node documentationは、動作がvmコマンドとevalでどのように類似していて異なるかを示しています。
したがって、evalとvmはすべて少し異なりますが、すべてを使用してコードをロードできます。クライアントから来る任意のコードを読み込んでいる場合、それらはすべて同様のセキュリティ問題を抱えています。
上記の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"を検索します。 –
- 1. Node.js require()とRequireJS? RequireJSと
- 2. RequireJs - Define vs Require
- 3. PHP require vs grails include
- 4. Node.js Express vs. Flatiron
- 5. Node.js - requireが定義されていない例外
- 6. node.jsに同じモジュールが必要な場合のrequire()の働き
- 7. php requireと空白
- 8. Eval()と式コード
- 9. ASP:LinkButtonとEval
- 10. JSON.parseとeval()
- 11. パフォーマンス/レイテンシの違い - Node.jsのダイナミックvsスタティックルート
- 12. `foo = require" foo "` foo "require" foo "`
- 13. Evalとhref属性?
- 14. require 'nokogiri'のときに "require"コマンドが見つかりません
- 15. データテーブルとrequire-jquery.jsのコンフリクト
- 16. Ldapとユーザーグループ(Require ldap-group)
- 17. Node.jsのモジュールをapp.jsにエクスポートするとvs個々のモジュールにapp.jsを含む
- 18. Node.JSでは、require( 'net')を実行することによってrequire( 'event')をしませんか?私が見てい
- 19. ループ内のevalとsetTimeout
- 20. テキストラベルプロパティASP.Netのevalとアンカータグhref
- 21. Eval()とExpression Treeの比較
- 22. Rubyのソースファイル名と `require`との衝突
- 23. socket.io.jsを含むと未定義の 'require'が返されます
- 24. eval() - eval() 'dコードの解析エラー
- 25. Eclipseノードデバッガrequire()exception
- 26. Ruby 'require'ワイルドカード式
- 27. Ruby:module、require and include
- 28. aquamacs require-final-newline
- 29. php require() - リアルパス
- 30. Browserify with require( 'fs')
コントローラオブジェクト( '/ controllers/blog_controller.js')をロードしてコンテキスト内にヘルパーを含める場合、パフォーマンスペナルティはほとんどありません。 (コントローラーは一度だけロードされます) –
ただしないでください。それは一般的な事のための非常に悪い習慣と考えられている。自分のコントローラコードをサンドボックス化する必要があると思われるのはなぜですか? –
railway-jsがそれを使ってコントローラにもっと豊かなコンテキストを提供するのと同じ理由で、 'vm'を使うよりも私が好きな良い解決策が見つかりました。ありがとう! –