2012-03-20 12 views
2

我需要在vm.createScript/script中執行節點應用程序(在沙箱中)中的節點代碼/模塊.runInNewContext。主機節點應用程序在heroku上運行,所以沒有本地文件系統可言。我能夠下載並運行沒有外部依賴關係的代碼,但是要求也能夠包含其他節點模塊。 (作爲一個構建/包裝的步驟將是理想的)如何將node.js模塊/源文件合併爲一個.js文件,以在節點內部執行

有很多現有的解決方案(browserify是我花了最多時間),它接近...但他們不可避免地生成一個代碼塊(耶!),意味着在瀏覽器中執行(噓!)。例如,Browserify會在窗口上生成依賴關係。

有誰知道一個工具,它會讀取package.json依賴關係{(或查看源代碼中的所有require())並生成一個單片blob適合節點的runInNewContext?

回答

1

我不認爲你正在尋找的解決方案是正確的解決方案。基本上你想抓住一堆require('lib'),將它們拼湊成一個單獨的Javascript上下文,將該上下文序列化爲源代碼,然後將該序列化的表單傳遞給runInNewContext函數以反序列化並重新生成到Javascript上下文中,然後反序列化您的自定義,沙箱代碼,並最終運行整個事情。

只需創建一個包含所需的require('lib')的上下文對象並將該對象直接傳遞給您的虛擬機是否更有意義?基於從documentation代碼:

var vm = require('vm'), 
initSandbox = { 
    async: require('async'), 
    http: require('http') 
}, 
context = vm.createContext(initSandbox); 
vm.runInContext("async.forEach([0, 1, 2], function(element) { console.log(element); });", context); 

現在,你必須通過,而無需通過昂貴的序列化/反序列化過程中去的背景下訪問所需的庫。

+0

那麼這是我遇到我的Heroku沒有可寫文件系統問題。這個包通過S3進入應用程序,我正在走.zip文件,將主文件解壓到內存中,然後將其噴入上下文中。我可以將包含的模塊(稱爲不是核心模塊)提取到./tmp(可臨時寫入)中,並將NODE_PATH變量看作require(),但似乎容易出錯。另外,如果在稍後的代碼路徑之前沒有遇到require(),則.zip中的模塊將會很久沒有出現..這就是爲什麼編譯成單個文件看起來很理想的原因。 – 2012-03-20 22:36:17

+0

你爲什麼試圖動態安裝一個包?如果您的某個VM腳本需要它,它應該是您的應用程序的依賴項,Heroku應該爲您安裝它。如果你有10個不同的用戶都需要重疊套件,會發生什麼?你會把它們中的一些加載到內存中10次嗎?這種方法看起來非常脆弱和不可擴展。 – 2012-03-20 22:40:41

+0

這是一個非常獨特的節點應用程序。 (也許正確的答案是!heroku)(或!node ..但它是一個非常理想的平臺)它需要處理一組受控的開發人員模塊,而不是在應用程序部署時預期的。他們需要能夠從管理界面隨意來/你是對的,肯定會有內存中重複包的開銷。至少在包裝工具得到更新並且更新後的模塊列表包含在基礎段塞中之前。 – 2012-03-20 22:53:31

相關問題