nodjs如何編譯c
A. 如何運行cnodejs-ionic-master
如何運行cnodejs-ionic-master
例如:
a+=5 等價於a=a+5
x*=y+7 等價於x=x*(y+7)
r%=p 等價於r=r%p
復合賦值符這種寫法,對初學者可能不習慣,但十分有利於編譯處理,能提高編譯效率並產生質量較高的目標代碼。
3.10 逗號運算符和逗號表達式
在c語言中逗號「,」也是一種運算符,稱為逗號運算符。 其功能是把兩個表達式連接起來組成一個表達式, 稱為逗號表達式。
其一般形式為:
表達式1,表達式2
其求值過程是分別求兩個表達式的值,並以表達式2的值作為整個逗號表達式的值。
【例3.19】
B. 如何運行nodejs環境
Window 上安裝Node.js
你可以採用以下兩種方式來安裝。
1、Windows 安裝包(.msi)
32 位安裝包下載地址 :https://nodejs.org/dist/v4.4.3/node-v4.4.3-x86.msi
64 位安裝包下載地址 :https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.msi
本文實例以 v0.10.26 版本為例,其他版本類似, 安裝步驟:
步驟 1 : 雙擊下載後的安裝包v0.10.26,如下所示:
如果你獲得以上輸出結果,說明你已經成功安裝了Node.js。
C. nodejs的C/C++ addons機制是怎麼實現的
#define NODE_MODULE(modname, regfunc) \
extern "C" { \
NODE_MODULE_EXPORT node::node_mole_struct modname ## _mole = \
{ \
NODE_STANDARD_MODULE_STUFF, \
regfunc, \
NODE_STRINGIFY(modname) \
}; \
}
NODE_MODULE(name, init);展開後就是:
extern "C" {
node::node_mole_struct name_mole =
{
1,//NODE_MODULE_VERSION
NULL,
__FILE__,
init,
"name"
};
}
其實就是定義了一個結構體,編譯後為動態鏈接庫 .node 文件中的一個符號,最後使用的時候由 node.cc 調用uv_dlopen和uv_dlsym動態鏈接模塊,得到初始化函數並執行。
mod->register_func(target);
uv庫封裝了對動態鏈接文件操作的具體實現,win下實際調用 LoadLibraryExW 和 GetProcAddress,*nix下實際調用dlopen和dlsym實現上訴功能。
D. 如何安裝node.js 以及編寫運行第一個node.js程序
到nodejs網站下載適合自己電腦的安裝包
運行安裝程序
安裝好之後C:\Program Files\會多出一個nodejs文件夾,現在就可以開始寫nodejs代碼了
1.創建一個hello.js文件並輸入如下代碼
2.保存代碼文件
打開cmd命令行窗口
輸入命令「node C:\Program Files\nodejs\hello.js"
打開一個瀏覽器,輸入本地伺服器地址和nodejs監聽的埠,如圖
E. 命令模式運行nodejs文件 怎麼輸入
創建項目:
新建一個文件夾,假設我們取名為tbjnode
cd tbjnode
然後初始化項目
npm init
現在,我們需要修改 package.json 文件
1:刪除main入口
2:添加preferGlobal設為true:該選項會提示用戶全局安裝
3:添加bin對象,用於建立索引:比如執行tbjname相當於執行index.js
修改後的package.json如下:
{
"name": "tbjnode",
"version": "1.0.3",
"description": "tbj node project cli",
"preferGlobal": true,
"keywords": [
"file",
"search"
],
"bin": {
"filesearch": "index.js"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "shui",
"license": "ISC"
}
bin下的filesearch用來指定filesearch命令執行的文件為index.js
使用 npm link ,綁定全局,不用重新安裝。
好了,現在我們開始寫一個功能,用來查詢某個文件夾下是否有指定的文件。
我們新建一個 index.js
編寫如下代碼:
#!/usr/bin/env node
var exec = require('child_process').exec;
// 獲取用戶輸入內容
var userArgv = process.argv.slice(2);
var searchPath = userArgv[0];
var searchFile = userArgv[1];
var commond = "find ";
// 判斷用戶輸入是否錯誤
if(userArgv.length !=2) {
console.log("input commond link this 'filesearch filepath filename'");
} else {
commond += searchPath + ' -iname '+ searchFile;
var child = exec(commond, function(err, stdout, stderr) {
if(err) {
throw err;
}
console.log(stdout);
});
}
ok。現在開始測試一下: filesearch ./ package.json 。就可以看到結果了。
但是現在TJ大神也做了一個特別酷的工具。 commander
API地址: commander API
舉例一個example:
新建一個文件 testCommander.js
然後在bin里,添加一個索引。
bin: {
"filesearch": "index.js",
"testC": "testCommander.js"
}
在 testCommander.js 寫入以下代碼:
#!/usr/bin/env node
var program = require('commander');
program
.version('0.0.1')
.option('-C, --chdir <path>', 'change the working directory')
.option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
.option('-T, --no-tests', 'ignore test hook')
program
.command('setup')
.description('run remote setup commands')
.action(function() {
console.log("setup");
});
program.parse(process.argv);
執行 testC -h ,就可以看到命令行結果。
commander這里主要用了五個介面:
1. version: 設定版本號
2. option: 對該命令介紹以及一些參數的執行
3. command: 新增一個子命令,執行``testC setup``
4. description: 對該命令的描述
5. action: 該子命令的要執行的操作。
其他的操作請查看該文檔介面。
F. 導入 NodeJS DEMO 和配置下一步怎麼做
自打接觸程序開始,就知道程序開發分前端和後台;然後分了兩撥人它們(都是猿類)互相合作,互相鄙視,互相撕逼……很多個日夜後完成一個不那麼劃時代的產品,其中大部分是項目,產品都算不上。在這條路上我一走就是三年,中間一直在考慮:為啥做個web項目非得分前後台,還得兩撥人。能不能不區分前後台,直接開發?
然後就發現了JSF+primefaces,這個確實屌,事件驅動,前端不用寫一坨一坨的ajax,各種數據綁定,完全不用你操心,界面primeface框架當時真的美呆了,現在又有新版本,好想舔屏。以前bug好多,不知道現在咋樣。雖然可以拋棄前端的妹子自己搞,開發效率的確提升了,但是還是沒有分離前後台。
終於在一個偶然的機會,了解到了NodeJS,那句「Node.js 就是運行在服務端的 javaScript」 讓我瞬間觸電,趕緊去官網下載了Node.js,開始了第一個demo,在瀏覽器出現「Hello,Nodejs」 的那一刻真的很興奮,很久沒有這種666的感覺了,看看成果吧
3、最後在瀏覽器輸入127.0.0.1:8888即可訪問該項目,顯示文章開始的Hello,NodeJS。
G. nodejs的Buffer如何能像c語言結構體那樣方便的組織數據
上樓錯誤:在定義*pA的時候,編譯器根本就不知道還有A這個類型所以應該是這樣的typedef struct A { struct A *pA; }A;象定義鏈表的結構的時候有這樣: typedef struct Lq{ int data; struct Lq *next; }LqNode;一個道理.
H. 怎樣安裝nodejs,編寫運行第一個hello world代碼
一、到nodejs網站下載適合安裝包, 地址:https://nodejs.org/en/download/
二、安裝,狂點下一步
三、手寫第一個Hello World,學任何一門語言的基礎!
新建一個hello.js
function hello() {
console.log('Hello World!');
}
hello();
四、將hello.js放到nodejs安裝目錄,C:\Program Files\nodejs目錄下
五、運行
打開cmd命令行窗口,輸入cd C:\Program Files\nodejs
再輸入node hello.js
I. 如何在Windows下開發NodeJS的C/C++原生擴展
一、編寫Node.js原生擴展
Node.js是一個強大的平台,理想狀態下一切都都可以用javascript寫成。然而,你可能還會用到許多遺留的庫和系統,這樣的話使用c++編寫Node.JS擴展會是一個不錯的注意。
以下所有例子的源代碼可在node擴展示例中找到 。
編寫Node.js C + +擴展很大程度上就像是寫V8的擴展; Node.js增加了一些介面,但大部分時間你都是在使原始的V8數據類型和方法,為了理解以下的代碼,你必須首先閱讀V8引擎嵌入指南。
Javascript版本的Hello World
在講解C++版本的例子之前,先讓我們來看看在Node.js中用Javascript編寫的等價模塊是什麼樣子。這是一個最簡單的Hello World,也不是通過HTTP,但它展示了node模塊的結構,而其介面也和大多數C++擴展要提供的介面差不多:
HelloWorldJs = function() {
this.m_count = 0;
};
HelloWorldJs.prototype.hello = function()
{
this.m_count++;
return 「Hello World」;
};
exports.HelloWorldJs = HelloWorldJs;
正如你所看到的,它使用prototype為HelloWorldJs類創建了一個新的方法。請注意,上述代碼通過將HelloWorldJS添加到exports變數來暴露構造函數。
要在其他地方使用該模塊,請使用如下代碼:
var helloworld = require(『helloworld_js』);
var hi = new helloworld.HelloWorldJs();
console.log(hi.hello()); // prints 「Hello World」 to stdout
C++版本的Hello World
要開始編寫C++擴展,首先要能夠編譯Node.js(請注意,我們使用的是Node.js 2.0版本)。本文所講內容應該兼容所有未來的0.2.x版本。一旦編譯安裝完node,編譯模塊就不在需要額外的東西了。
完整的源代碼可以在這里找到 。在使用Node.js或V8之前,我們需要包括相關的頭文件:
#include <v8.h>
#include <node.h>
using namespace node;
using namespace v8;
在本例子中我直接使用了V8和node的命名空間,使代碼更易於閱讀。雖然這種用法和谷歌的自己的C++編程風格指南相悖,但由於你需要不停的使用V8定義的類型,所以目前為止的大多數node的擴展仍然使用了V8的命名空間。
接下來,聲明HelloWorld類。它繼承自node::ObjectWrap類 ,這個類提供了幾個如引用計數、在V8內部傳遞contex等的實用功能。一般來說,所有對象應該繼承ObjectWrap:
class HelloWorld: ObjectWrap
{
private:
int m_count;
public:
聲明類之後,我們定義了一個靜態成員函數,用來初始化對象並將其導入Node.js提供的target對象中。設個函數基本上是告訴Node.js和V8你的類是如何創建的,和它將包含什麼方法:
static Persistent<FunctionTemplate> s_ct;
static void Init(Handle<Object> target)
{
HandleScope scope;
Local<FunctionTemplate> t = FunctionTemplate::New(New);
s_ct = Persistent<FunctionTemplate>::New(t);
s_ct->InstanceTemplate()->SetInternalFieldCount(1);
s_ct->SetClassName(String::NewSymbol(「HelloWorld」));
NODE_SET_PROTOTYPE_METHOD(s_ct, 「hello」, Hello);
target->Set(String::NewSymbol(「HelloWorld」),
s_ct->GetFunction());
}
在上面這個函數中target參數將是模塊對象,即你的擴展將要載入的地方。(譯著:這個函數將你的對象及其方法連接到
這個模塊對象,以便外界可以訪問)首先我們為New方法創建一個FunctionTemplate,將於稍後解釋。我們還為該對象添加一個內部欄位,並命
名為HelloWorld。然後使用NODE_SET_PROTOTYPE_METHOD宏將hello方法綁定到該對象。最後,一旦我們建立好這個函數模板後,將他分配給target對象的HelloWorld屬性,將類暴露給用戶。
接下來的部分是一個標準的C++構造函數:
HelloWorld() :
m_count(0)
{
}
~HelloWorld()
{
}
接下來,在::New 方法中V8引擎將調用這個簡單的C++構造函數:
static Handle<Value> New(const Arguments& args)
{
HandleScope scope;
HelloWorld* hw = new HelloWorld();
hw->Wrap(args.This());
return args.This();
}
此段代碼相當於上面Javascript代碼中使用的構造函數。它調用new HelloWorld
創造了一個普通的C++對象,然後調用從ObjectWrap繼承的Wrap方法,
它將一個C++HelloWorld類的引用保存到args.This()的值中。在包裝完成後返回args.This(),整個函數的行為和
javascript中的new運算符類似,返回this指向的對象。
現在我們已經建立了對象,下面介紹在Init函數中被綁定到hello的函數:
static Handle<Value> Hello(const Arguments& args)