首页 > 代码库 > node.js入门
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 = http://www.mamicode.com/fs.readFileSync(‘file.txt‘, ‘utf-8‘);console.log(data);console.log(‘end.‘);//运行结果nimaend.
异步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。
exports
是module.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
node.js入门