2013年11月7日 星期四

如何建立Node.js的Addon在Windows



方法一,使用VC++2010:
  1. 下載Node.js Source Code - http://nodejs.org/download/

  2. 下載並安裝Python 2.x - http://www.python.org/download/

  3. 將『;C:\Python27』加入path環境變數的最後(以2.7.5為例)

  4. 執行『C:\node-v0.10.21\vcbuild.bat』(以node-v0.10.21.tar.gz為例)

  5. 將『C:\node-v0.10.21\deps\uv\include』資料夾內所有檔案複製到『C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include』

  6. 將『C:\node-v0.10.21\deps\v8\include』資料夾內所有檔案複製到『C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include』

  7. 將『C:\node-v0.10.21\src\』內的『node.h』及『node_object_wrap.h』複製到『C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include』

  8. 開啟Visual Studio 2010建立Win32 Console Application的DLL專案(以newaddon名稱為例)

  9. 將『C:\node-v0.10.21\Release\node.lib』複製到專案資料夾

  10. 將範例程式碼貼上後編譯:


  11. 將編譯完的『newaddon.dll』檔名改為『newaddon.node』
    (可以在Project > Properties > Configuration Properties > General 設定 Target Extension 為 .node 即會自動命名)

  12. 在『C:\』建立一資料夾(以Node.js為例)

  13. 在『C:\Node.js\』建立一個腳本檔『hello.js』內容如下:


  14. 將『C:\node-v0.10.21\Release\node.exe』複製到『C:\Node.js\』

  15. 下達cmd命令執行腳本『node hello.js』即可

方法二,使用node-gyp:

1. 首先請先安裝Python與VC++

2. 請參考站內此篇建立有npm的Node.js可攜環境


3. 使用npm安裝node-gyp


4. 建立一程式原始碼『newaddon.cc』內容如下(原始碼同方法一):


5. 建立一配置檔『binding.gyp』內容如下:


6. 在『C:\Node.js\』執行『node_modules\.bin\node-gyp configure』會建出『build』資料夾及專案配置檔案(注意:因本教學以可攜開發平台為基礎,所以執行之語法路徑必須完整正確,並以node.exe所在目錄為根目錄。)


7. 在『C:\Node.js\』執行『node_modules\.bin\node-gyp build』會編譯node程式在『build\Release』資料夾內


8. 在『C:\Node.js\』建立一個腳本檔『hello.js』內容如下:


9. 下達cmd命令執行腳本『node hello.js』即可


附註:
plugin指那些需編譯成執行檔,用以提供瀏覽器額外功能的東西。
extension使用瀏覽器支援的程式語法,用來改變瀏覽器功能與操作的東西。
theme使用瀏覽器支援的程式語法,用來改變瀏覽器外觀介面的東西。
addonplugin +extension + theme = 總稱所有瀏覽器本體之外,用來改變瀏覽器的東西。

參考文獻:
http://wiki.gpii.net/index.php/Building_node.js_Windows_C/C%2B%2B_Addons
http://nodejs.org/api/addons.html

後記:
其實自己也搞了很久才搞定,
結果發現原因是一開始的hello.js腳本檔與hello.node插件檔,
這兩個檔名都是使用相同的hello的關係,
導致require抓不到hello.node插件的函式,
所以無論是什麼方法都一直沒有辦法成功_(:3」∠)_

另外值得一提的是,
兩種方法所編譯出來的newaddon.node,
檔案大小竟然差蠻多的,
方法一14KB而方法二卻33KB,
不曉得在更大的專案底下,
會不會也差異如此多呢OwO?