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)