node.js入门

console是node.js提供的控制台对象,包含了向标准输出写入的操作,如console.log、console.error等。

console.log是最常用的输出指令,可以接受任意个参数,支持%d、%s变量引用。

 

REPL模式

运行无参数的node会启动,出现  >  输入指令。

 

建立HTTP服务器

运行 node 文件名.js ,访问http://127.0.0.1:3000

 

调用http模块,对所有HTTP请求答复同样的内容并监听3000端口。listen函数中创建了事件监听器,Node.js不会退出事件循环,直到按下Ctrl+C才会结束。

var http = require(‘http‘);

http.createServer(function(req, res) {
    res.writeHead(200, {‘Content-tyle‘: ‘text/html‘});
    res.write(‘<h1>Node.js</h1>‘);
    res.end(‘<p>Hello world</p>‘);
}).listen(3000);

console.log("HTTP server is listening at port 3000");

 

 同步I/O  阻塞式I/O

线程在执行中如果遇到磁盘读写或网络通信(统称I/O操作),操作系统会剥夺这个线程的CPU控制权,使其暂停执行,同时将资源让给其他的工作线程。

当I/O操作完毕,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。

 

var  fs  = require(‘fs‘);
var data = fs.readFileSync(‘file.txt‘, ‘utf-8‘);
console.log(data);
console.log(‘end.‘);

//运行结果
nima
end.

 

异步I/O  非阻塞式I/O

当线程遇到I/O操作时,将I/O请求发给操作系统,继续执行下一条语句。操作系统完成I/O操作时,以事件的形式通知执行I/O操作的线程,线程会在特定时候处理这个事件。为了处理异步I/O,线程必须有事件循环,不断地检查有没有未处理得事件,依次予以处理。

var  fs  = require(‘fs‘);
fs.readFile(‘file.txt‘,‘utf-8‘,function(err,data){
    if(err){
        console.error(err);
    } else {
        console.log(data);
    }
});
console.log(‘end.‘);

//运行结果
end.
nima

fs.readFile调用时所做的工作知识将异步式I/O请求发送给操作系统,然后立即返回并执行后面的语句,执行完以后进入事件循环监听事件。当fs接收到I/O请求完成的事件时,事件循环会主动调用回调函数以完成后续工作。 

 

并不是所有API都有同步和异步版本,Node.js不鼓励使用同步I/O。

 

事件

事件是由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);

//一秒后输出 some_event occured.

 

event对象注册了事件some_event的一个监听器,通过setTimeout在1000毫秒以后向event对象发送事件some_event,此时会调用some_event的监听器。

 

模块和包

exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象。 

 

覆盖exports

function Hello() {

};

exports.Hello = Hello;

在其他文件需要通过     require(‘./文件名‘).hello来获取Hello对象。

 

module.exports = Hello;

可以直接获得这个对象   require(‘./文件名‘)。

 

在外部引用该模块时,其接口对象就是要输出的Hello对象本身,而不是原先的exports。

exportsmodule.exports的一个引用,只是为了用起来方便。当你想输出的是例如构造函数这样的单个项目,那么需要使用module.exports

不可以通过对exports直接赋值代替对module.exports赋值。exports实际上只是一个和module.exports指向同一个对象的变量,它本身在模块指向结束后释放,但module不会,因此只能通过module.exports来改变访问接口。

 

创建包

node.js在调用某个包时,会先检查包中package.json文件的main字段,将其作为包的接口模块,如果package.json字段不存在,会尝试寻找index.js或index.node作为包的接口。

 

npm

 获取一个包

npm i/install package_name

 

默认使用install命令是采用本地模式,安装后放置在当前目录的node_modules子目录下。node.js的require在加载模块时尝试搜寻node_modules子目录,因此使用npm本地模式安装的包可以直接被引用。

 

全局模式

npm i/install package_name  -g

多数时候并不是因为许多程序都有可能用到它,为了减少多重副本而使用全局模式,而是因为本地模式不会注册path环境变量。npm本地模式仅仅是把包安装到node_modules子目录下,其中的bin目录没有包含在path环境变量,不能直接在命令行中调用。全局模式安装时npm将包安装到系统目录,package.json文件中bin字段包含的文件会被链接到/usr/local/bin/。/usr/local/bin/是在path环境变量默认定义的。

模式 可通过require使用 注册path
本地模式
全局模式

 

 

 

 我们要把某个包作为工程运行时的一部分通过本地模式获取,要在命令行使用则通过全局模式安装。

 

发布包

使用npm init根据交互式会打生成package.json

创建index.js作为包的接口。

使用npm adduser创建账号,完成后可使用npm whoami 测试是否取得了账号。

发布:在package.json所在目录运行npm publish,访问http://search.npmjs.org/能找到发布的包。

更新:在package.json文件中修改version,重新使用npm publish命令。

取消:npm unpublish

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。