一、安装、编译、测试执行
在linux下安装之前,必须先安装开发包
yum -y install gcc gcc-c++
yum -y python
yum -y openssl openssl-devel
wget ....node.tar.gz
下载的包有两种,一种是编译好的直接使用
mv nodexxx /usr/local/node
ln -s /usr/local/node/bin/node
另外一种是需要编译的
./configure --prefixe=/usr/local/node
make && make install
ln -s /usr/local/node/bin/node
新增hello.js
console.log('Hello World!');
node hello.js //输出 Hello World
也可
node -e "console.log('Hello World!)"
还可以使用命令模式即:
二、建立HTTP服务器
创建一个服务脚本
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<h1>Node.js Tianhu.peng</h1>');
res.end('<p>Hello World</p>');
}).listen(3000);
console.log("HTTP server is listening at port 3000.");
node app.js
访问http://domian:3000
就可以了
在实际的开发中,我们需要在不停止服务的情况下更改,这里就需要一个插件supervisor,
supervisor就是监控你代码的更改并重启服务
npm install -g supervisor
安装完成之后,在/usr/local/node/bin下面就有一个supervisor的命令
执行
supervisor app.js
当我们修改时,它就会自动的重启
三、异步式I/O与事件式编程
node.js异步读取文件
var fs = require('fs');
fs.readFile('text.txt', 'utf-8', function(err, data) {
if (err) {
console.error(err);
} else {
console.log(data);
}
});
console.log('end.');
// 运行结果
end.
this is a io node test
在看一个同步读取
var fs = require('fs');
var data = fs.readFileSync('text.txt', 'utf-8');
console.log(data);
console.log('end.');
// 运行结果
this is a io node test
end.
Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列。
事件由EventEmitter对象提供,上面用到的fs.readFile和http.createServer的回调都是通过EventEmitter来是现实的
看一个例子
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter;
event.on('some_event', function() {
console.log('some_event occured');
});
setTimeout(function() {
event.emit('some_event');
}, 1000);
上面的原理是:
event对象注册了事件some_sevent的一个监听器
通过setTimeout在1000毫秒以后向event对象发送事件some_event,此时会调用some_event的监听器
四、模块和包
模块(Module)和包(Package)是Node.js最重要的支柱。开发一个具有一定规模的程序不可能只用一个文件,通常需要把各个功能才分、封装,然后组合起来,模块正是为了实现这种方式诞生的。Node.js提供了require函数来调用其他模块,而且模块都是基于文件的,机制十分简单。
1、什么是模块
模块是Node.js应用程序的基本组成部分,文件和模块是一一对应的。一个Node.js文件对应一个模块
如 var http = require('http')
2、创建模块和加载模块
看一个例子: modeule.js
var name;
exports.setName = funciton(thyName) {
name = thyName;
};
exports.sayHello = function() {
console.log("Hello " + name);
};
在同一目录下
var myModule = require('./module');
myModeule.setName('tianhu.peng');
myModeule.sayHello();
// 输出 Hello tianhu.peng
注意:require是单次加载模块,也就是说只加载一次
3、覆盖exports
有的时候,我们指向把一个对象封装到模块中
hello.js
function Hello() {
var name;
this.setName = function (theName) { name = theName; };
this.sayHello = funciton() { console.log('Hello ' + name); };
};
exports.Hello = Hello
按照上面的方法,我们使用的时候就必须
var hello = require('./hello').Hello
我们只需要
exports.Hello = Hello改为 module.exports = Hello;
var hello = require('./hello');
hello = new Hello(); hello.setName('tianhu.peng'); hello.sayHello();
5、创建包
包就是模块的升级,也相当于C的函数库的概念
Node.js的包是一个目录,包含各种文件和说明文件
下面,我们自己创建一个包
1)创建一个mypackage的包的文件夹
2)在mypackage下创建index.js // 内容 exports.hello = function(){ console.log('Hello okhqb'); };
3) 在同mypackage目录下创建test.js
var p = require('./mypackage'); p.hello(); //输出 Hello okhqb
4) 进一步深入,加入package.json //在mypackeage目录下
{
"main" : "./lib/interface.js" //将index.js重命名并放入lib下
}
Node.js在调用某个包时,会首先检查包中的package.json,去寻找main 如果没有再查找index.js
6、包管理器,上面我们使用了npm install -g supervisor安装,npm就是Node.js官方提供的包管理工具。
1)获取一个包
npm [install/i] package_name 例如我们需要安装express
npm install express 或者 npm i express; z只要你会yum,这个不难理解
2)本地模式和全局模式
npm install express是本地模式
npm install -g supervisor是全局模式。所有应用都可以使用
3)理解ln -s吗,这里也可以做到创建全局连接
npm link express ./node_modules/express -> /usr/local/lib/node_modules/express
7、调试Node.js;最好使用成熟的IDE调试,比如Eclipse;这里我们主要的工作环境是linux,所以介绍linux下调试
很简单
node debug debug.js就可以了,关于调试命令可以参考node.js的帮助文档,个人建议使用eclipse
上面只是简单的说了下nodejs中一般知识,后续会有更加详细的教程。