2011-04-02 93 views
31

我想在我的C/C++應用程序中使用Node.js腳本。有人建議我從v8開始,libev和libeio;但它意味着從頭重寫Node.js。如何將Node.js解釋器嵌入到C/C++中?

那麼,是否有可能將Node.js嵌入到C或C++中?

+2

node.js實際上是嵌入在Web服務器中的V8。由於您的應用程序可能不是Web服務器,因此您可以將V8(或任何其他JavaScript引擎)嵌入其中。 – MAK 2011-04-02 19:01:55

+1

從技術上講,node.js不只是做web服務器。它可以完成許多不同的角色,但對於HTTP服務器(文件服務器,Web服務器等)來說非常有用。無論是哪種情況,您都只是使用V8而已。 – tjameson 2011-04-03 05:27:27

+5

@MAK node.js不是一個Web服務器。它集成了一個Web服務器模塊,但它當然不是一個Web服務器。在C++應用程序中,node.js帶來的負載只有v8才支持。 – Coyote 2012-12-10 10:01:17

回答

0

它可能是,V8是用C++,node.js中可以在V8上運行,但除非你有一個非常很好的理由,爲什麼你會通過C++,你可能是更好的運行JavaScript放送找到一個適當的C++庫並直接在C++中實現所需的功能。集成腳本語言和本地代碼的任務通常不是微不足道的。例如。 V8 documentation。 Qt在C++和javascript之間提供了非常好的集成,並且在腳本和代碼之間來回移動對象仍然不是微不足道的。

+0

有一些努力來移植QtScript庫來發揮V8的優勢 - http://developer.qt.nokia.com/wiki/V8_Port – errordeveloper 2011-10-11 22:54:37

14

你應該首先考慮它是否有足夠實現應用程序作爲節點一個C++模塊,然後膠的主要部分作爲一個節點腳本

否則,你不妨「重新實現節點」,採取核心代號爲例子, 取出部件,你並不需要(如HTTP模塊),然後把你的組件 進去。最痛苦的方式是做一個子樹合併和剝離構建系統,然後在構建腳本中添加前綴以指向它所在的目錄。 然後您可以停止構建某些零件。然而,Node的構建系統包含幾個部分,這可能是一項相當困難的工作。

您也可以嘗試使用默認加載的東西重新打包Node並更改可執行文件的名稱。然而,這僅僅是採取我剛纔所說的第一種方法更復雜的方式,你可以在/usr/bin/安裝腳本會去:

#!/usr/bin/node 
    var myAppMain = require('libmyApp'); 
    myAppMain.withConfig(filename, 
    function(err, cnf) { 
    if (err) throw err; // parser or file access error 
    cnf.evalMe(); 
    }); 

您可以使用一個JSLint的爲你的解析器,然後用grep的危險的電話,然後或只使用require(config.js),但您將需要添加exports.someMethod = function (...) {...}。但是require()通常更安全,但是您可能希望爲您的配置實施預處理器,該預處理器將替代exports.someMethod = function (...) {...}而不是您的功能,並會附加require('OnlyCallMySafeMethods')並拒絕任何 嘗試require('fs')或您可能害怕讓出的其他庫要使用的人。 這種安全只是一個可選的東西,你可能希望有,這一切都取決於你。 雖然我想你可能想用exports.someMethod = ....替代做一點,並且在頂部添加一個require('myAppConfigLib),這樣用戶就會使用你的API以及他們希望放入腳本/配置的任何東西!

UPDATE:上有line 66src/node.js的非常有用評論:

// To allow people to extend Node in different ways, this hook allows 
    // one to drop a file lib/_third_party_main.js into the build 
    // directory which will be executed instead of Node's normal loading. 

也請注意,src/內容被編譯成字節碼在構建時。

1

我已經建立的東西接近我認爲你正在尋找:

https://github.com/ZECTBynmo/tacnode

這是一個庫,允許Node.js的靜態鏈接到C++應用程序。它絕對沒有打磨,但我用它來啓動簡單的節點腳本。

+0

試過了,但構建腳本「vcbuild.bat」中的語法錯誤已經足夠糟糕了不要花更多時間在它上面。 – Lothar 2014-07-06 12:21:30

0

我剛剛檢查出js-git,它是爲Node.js製作的,也取決於其他一些Node.js模塊。

然而,同樣的開發者寫了一個工具tim-task來結束一些常見的Node.js的功能,最重要的require,並在一定的Node.js模塊打包在一起,以這樣一種方式,它不應該依賴於Node.js的了。他用它來製作git-web-platform,即將js-git打包爲一個可用於瀏覽器的JS文件。結果打包文件看起來像this。這可能也可以在純V8中稍作修改。

這可能對您有用。但請注意,這種方法將受到限制。

12

嵌入Node.JS現在正式支持Node.JS分叉JXcore。嵌入文檔可從this link獲取。

+1

這是一個很好的建議,應該是被接受的答案,正是OP之後。 – 2016-01-27 15:14:17

1

嵌入節點有很多很好的理由,包括利用npm的能力。

不幸的是JXCore正在死亡。 這個artice給出了一些選擇。 http://www.goland.org/nodeapps/