1 Node.js简介
Node.js是一个让Javascript运行为服务端的开发平台。其采用V8引擎来执行JS脚本,同时提供了基于COMMONJS规范的JS接口,使得代码开发的移植性较好。
Node下的编程采用事件的思想,将磁盘、网络、用户请求、数据库请求等进行异步处理,使得单个线程的执行效率更高。当然缺点是异步执行对于程序行为的理解不太方便。
2 Node的安装与配置
Node在各个平台上都有相关的版本,可以在官网上下载并按说明进行安装。
Node安装后,默认提供了一个npm的模块用于管理三方的扩展包,类似于PHP的pear。其基本命令与yum类似,如npm install package。
Node的安装包有两种安装模式:全局模块与本地模式。前者会将三方扩展包安装在OS的系统PATH中,使得在命令行环境中可以找到相关的工具。后者将三方包安装在命令执行的目录下的node_modules下,以做为某个项目的依赖项安装,而不导出到全局。
3 Node快速入门
3.1 运行Node
运行Node应用的基本方法为,首先写一个Js文件,然后用Node来执行。
Node也支持直接对作为其参数的JS代码进行执行,如node -e 'console.log('Hello world)'
Node类似于Pyhon,提供了REPL模式,在命令行下直接运行Node即可进行,在REPL模式下,可以逐行的进行输入和执行。
通过npm可以安装一个叫supervisor的工具到全局,用这个工具替代Node去执行JS脚本,可以在我们修改JS文件后自动重启Node实例。
Node自带了HTTP模块,因此Node可以完成类似PHP的功能,但却不需要前端WEB的支持。下面示例演示一个简单的WEB SERVER。
var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(80); console.log('Server running at http://127.0.0.1:80/');
3.2 模块与包
在Node中模块与文件相对应,包的概念更大一些可以是一个目录,目录下由多个模块组成。Node提供了required函数来加载模块和包。
为了更好的理解模块和包,最好是自己创建一个模块和包。
3.2.1 创建模块
创建模块很简单,只需要新建一个js文件,实现相应功能,最后把需要导出的接口放到exports对象中。示例如下:
//module hello.js var something; exports.sayHello = function() { console.log('hello'); } //var h = require('./hello.js') //h.sayHell();exports为模块的导出接口对象,Node的模块加载函数require()会分析所加载模块的exports对象,并将其导出。
在当前模块下,module对象引用当前模块,因此module.exports与exports指向同一对象的引用。在某些情况下,为了较快捷的取到导出对象,也可以直接覆盖exports对象为要导出的对象。如下示例:
//file hello.js var hello = function() { console.log('hello'); }; module.exports=hello; //require('hello.js')();
3.2.2 模块寻找与加载机制
Node的require函数会将加载的模块按文件名存放在require.cache中,因此模块虽然会被加载多次,但只会返回同一个模块实例。cache信息可以在node debug下进行repl下用console功能打印出来。
Node的模块分为核心模块与文件模块。
核心模块为Node API中声明的模块,其在加载时具有最高优先级,即如果有模块与其重名,则只加载核心模块。
文件模块为存储为单独文件或目录的模块。文件模块的加载分为两种方式,一种包含绝对路径或相对路径的方式,此时Node会按路径寻找并进行加载,若未能找到则抛出异常。在模块不是核心模块,也不是以路径方式加载的情况下,Node会搜索当前目录下的node_modules目录去寻找相应的模块,若无果,则向上级目录下的node_modules下寻找,重复此过程一直到根目录。
3.2.3 创建包
Node中的包是一个目录,CommonJS规范中对于包有比较严格的要求,如package.json的定义,目录中包含bin/ lib/ doc/ test/等。Node只要求根目录下存在package.json文件即可。最简单的包只是一个目录下创建index.js,在index.js中实现功能即可。Node在加载包时,会根据根目录下有package.json,搜索文件中main对应的值作为模块入口,若main字段不存在,或对应文件未找到,则尝试寻找index.js作为入口。
创建好了包之后,在外部即可require目录名来包含相应的包。
3.2.4 对外发布包
如果想将自己的包发布到Internet上,则可以借助于npm工具:
npm init 通过交互式的方式来生成package.json
npm adduser 通过交互的方式来在node repo网站生成用户
npm publish 可以将包发布出去,若需要,通过更新package.json中的版本号并重新publish即可。
npm unpublish 可以将包撤销
3.3 调试
3.3.1 node debug
node debug script.js 可以在命令行下对script.js进行调试
其支持下列命令:
断点命令:sb(line) sb('func') cb()
步进命令:next cont step out
信息查看:bt list(n) watch/unwatch(expr) repl
执行控制:run restart kill
3.3.2 打开远程调试
node --debug-brk = 8080 script 打开调度服务器基于8080端口,并暂停执行等待客户端连接
在远程即可用node debug ip:8080
3.3.2 辅助工具
三方的工具可以用来更友好的连接到debug server上,比较友好的如node-inspector,通过npm安装后启动并在浏览器中定位到
http://ip:port/debug?port=debug-port即可
参考文献:
1 《Node.js开发指南》
2 Node.js API :http://nodejs.org/api/