深入浅出NodeJs演讲:tomieric翼虎网前端工程师2013年5月13日目录1234NodeJS简介核心模块NodeJS入门基础web开发《简信群聊案例分析》01/nodejs基础•javascriptjavascript由于ECMAScript、DOM、BOM组成(Mozlia指CoreJavascript和ClientJavascript组成)。•nodejs是javascript?nodejs是基于ECMAScript或CoreJavascript,借助于chorme的V8引擎,使用C++编写扩展。•与其编程语言区别?nodejs不是一种独立语言。他是居于javascript语言基础开发的服务器端语言,它可以像php它们一样web编程,它是可以可以跳过apache,nginx等http服务器直接面向前端开发。什么是nodejs?01/nodejs基础•具有复杂逻辑的网站;•基于社交网络的大规模Web应用;•WebSocket服务器;•TCP/UDP套接字应用程序;•命令行工具;•交互式终端程序;•带有图形用户界面的本地应用程序;•单元测试工具;•客户端JavaScript编译器。nodejs能做什么?01/nodejs基础•异步和同步差别//同步varstr='开始了';functionloop(){vari=100000;if(i==0)console.log('哈哈,我先打印了str:'+str);while(i0)i--;}loop();console.log('我想打印str:'+str+'需要等待loop执行完');异步式I/O与事件驱动01/nodejs基础•异步和同步差别//异步varstr='开始了';$.get(url,function(data){console.log('我离开了一下回来打印str的:'+str+',顺便带来朋友data:'+data);});console.log('我是先输出str的'+str);异步式I/O与事件驱动01/nodejs基础•异步式I/ONode.js使用的是单线程模型,对于所有I/O都采用异步式的请求方式,避免了频繁的上下文切换。Node.js在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式I/O请求完成后会被推送到事件队列,等待程序进程进行处理。异步式I/O与事件驱动db.query('SELECT*fromsome_table',function(res){res.output();});01/nodejs基础•事件驱动由一个事件收集器、一个事件发送器和一个事件处理器组成。事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。事件发送器负责将收集器收集到的事件分发到目标对象中。异步式I/O与事件驱动01/nodejs基础遵循commonJS标准规范commonJS模块(module)包(packages)系统(system)二进制(binary)控制台(console)编码(encodings)文件系统(filesystems)套接字(socket)单元测试(unittesting)...01/nodejs基础nodejs性能01/nodejs基础•Snoopyxd详细对比了Node.js与PHP+Nginx组合,结果显示在3000并发连接、30秒的•测试下,输出“helloworld”请求:PHP每秒响应请求数为3624,平均每个请求响应时间为0.39秒;Node.js每秒响应请求数为7677,平均每个请求响应时间为0.13秒•而同样的测试,对MySQL查询操作:PHP每秒响应请求数为1293,平均每个请求响应时间为0.82Node.js每秒响应请求数为2999,平均每个请求响应时间为0.33秒。nodejs性能资料:《nodejs开发指南》第1.4.2章01/nodejs基础nodejs性能《nodejs在朋友网的实践》入门nodejs安装•下载安装nodejs入门nodejs安装•设置系统环境变量将node.exe所在目录加入系统环境变量PATH中,便于在任意位置执行node应用•NPM打包管理器新版nodejs已经默认安装了npm,不需另外安装。•测试安装环境windows下面按window+R,输入cmd,调用命令窗口。输入node-v输入npm-v02/nodejs入门nodejs使用•第一个程序打印helloworld在“G:\nodejs\demo”下新建一个hello.js文件输入02/nodejs入门入门基础•创建HTTP服务器02/nodejs入门异步式I/O(非阻塞I/O)02/nodejs入门回调函数02/nodejs入门事件式编程03/核心模块全局变量•nodejs的全局变量是global,而不是window•process进程对象•console.log控制台输出03/核心模块内置模块•Util工具包Util.inherits(Constructor,SuperConstructor)对象原型Util.inspect(object,[showHidden],[depth],[color])对象转换成字符串Util.isArray()Util.isRegExp()Util.isDate()Utils.isError()03/核心模块内置模块•event事件驱动EventEmitter.on(event,listener)监听事件EventEmitter.emit(event,arg1,...)发射(触发)事件EventEmitter.once(event,listener);只绑定一次事件EventRemoveListener(event,listener)解除某个监听事件EventRemoveAllListener([event])移除所有监听03/核心模块内置模块•fs文件系统fs.readFile(filename,[encode],[callback(err,data)])异步读取文件fs.readFileSync(filename,[encode],[callback(err,data)])同步读取文件fs.open(path,flags,[mode],[callback(err,fd)]fs.read(...)03/核心模块内置模块•HTTP服务器与客户端http.Server事件http.ServerRequesthttp.ServerResponse03/核心模块模块与包•创建模块03/核心模块模块与包•创建包package.json必须在包的顶层目录下;二进制文件应该在bin目录下;JavaScript代码应该在lib目录下;文档应该在doc目录下;单元测试应该在test目录下。03/web应用Nodejs建站案例03/web开发《简信群聊案例分析》Express框架(mvc)•webapplicationframeworkfornode03/web开发《简信群聊案例分析》Express框架(mvc)•创建一个Express框架app03/web开发《简信群聊案例分析》Express框架(mvc)•创建成功,安装所需包03/web开发《简信群聊案例分析》Express框架(mvc)•导入需要包03/web开发《简信群聊案例分析》ejs模板引擎•JS模板引擎jqueryTempl,artTemplate,Juicer,jade等•与jade模板区别03/web开发《简信群聊案例分析》mongoDB非关系数据库MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。《8天学通mongoDB开发《简信群聊案例分析》express搭建微博系统•创建包package.json必须在包的顶层目录下;二进制文件应该在bin目录下;JavaScript代码应该在lib目录下;文档应该在doc目录下;单元测试应该在test目录下。03/web开发《简信群聊案例分析》简信群聊案例分析express+socket.io[+mongoDB]WhatisSocket.IO?Socket.IOaimstomakerealtimeappspossibleineverybrowserandmobiledevice,blurringthedifferencesbetweenthedifferenttransportmechanisms.It'scare-freerealtime100%inJavaScript.Socket.IO旨在任何浏览器和移动终端中创建实时的app应用,弱化不同的传输机制达到统一,它是一种快速的实时的JavaScript应用。03/web开发《简信群聊案例分析》简信群聊案例分析03/web开发《简信群聊案例分析》简信群聊案例分析03/web开发《简信群聊案例分析》简信群聊案例分析03/web开发《简信群聊案例分析》简信群聊案例分析03/web开发《简信群聊案例分析》简信群聊案例分析03/web开发《简信群聊案例分析》简信群聊案例分析参考资料•《nodejs权威开发指南》•nodejs中文手册•express中文手册•jade中文手册•nodejs中文社区谢谢聆听·