Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Node.js 实践
拔赤 bachi@taobao.com
 http://jayli.github.com
       2010-10-28
NodeJS 初体验:瘦身,速度,灵活,帅!
•   JavaScript之初
•   WebServer之初
•   NodeJS
•   JavaScript的优异表现
•   更进一步:DOM&YUI3
• JavaScript之初
•   WebServer之初
•   NodeJS
•   JavaScript的优异表现
•   更进一步:DOM&YUI3
JavaScript诞生离不开
NetscapeNavigator
ECMAScript一统江湖

     JavaScript
    ActionScript
     ScriptEase
         …
我们熟悉的JavaScript

        ECMAScript


          DOM


          BOM


JS库(jQuery,YUI,prototype…)
JS在客户端表现优异,但是…
浏览器弱小的权限限制了JS的表现
• JavaScript之初
• WebServer之初
• NodeJS
• JavaScript的优异表现
• 更进一步:DOM&YUI3
WebServer

• Web服务(Apache/IIS/JBoss)
  – 处理请求、线程、IO…


• 语言引擎(php/Asp/Java)
  – 面向开发者
WebServer

• Web服务(Apache/IIS/JBoss)
  – 处理请求、线程、IO…


• 语言引擎
 (php/Asp/Java/JavaScript)
  – 面向开发者
http://jaxer.org/
https://developer.mozilla.org/En/JavaScript/Server-
           Side_JavaScript/Walkthrough


WebServer+SpiderMonkey
浏览器渲染DOM的部分工作分担到服务器
• JavaScript之初
• WebServer之初
• NodeJS
• JavaScript的优异表现
• 更进一步:DOM&YUI3
http://nodejs.org/




http://github.com/ry/node
RyanDahl
  http://github.com/ry




Video:
http://www.yuiblog.com/blog/2010/05/20/video-dahl/
Why?
Node'sgoalistoprovideaneasyway
tobuildscalablenetworkprograms.

                         -- RyanDahl
NodeJS的实现

•   单线程    (single-thread)
•   非阻塞式IO (non-blocking)
•   V8
•   事件驱动   (event-based)
• 单线程:多个请求占用一个线程
• 多线程:一个请求占用一个线程


(Web服务的)单线程 vs多线程
单线程的性能优势




Nginx(单线程)vsApache(多线程)
/* 阻塞 */
get_a_request(); //从队列中得到一个请求
handle_request(); //处理这个请求
feedback(); //返回处理结果
get_another_request(); //从队列中获得下一个请求
...

/* 非阻塞 */
get_a_request(); //得到一个请求
handle_request(function(){ //处理这个请求
     feedback(); //等到处理完成后,返回处理结果
});
get_another_request(); //从队列中获得下一个请求
...

           阻塞 vs非阻塞
非阻塞的性能优势




Nginx(非阻塞)vsApache(阻塞)
“瘦身”带来的性能优势




  高并发数的响应时间
“瘦身”带来的性能优势 续




   大尺寸文件的响应时间
让人垂涎的长连接




 过去/现在/将来
完美的单线程?
单线程的先天不足

• 操控多CPU的短板
 – 单线程程序只能在一个CPU上运行


• 可靠性!?
 – 一个异常影响整个线程
NodeJS的取舍

单线程,可靠性低,性能高
 多线程,可靠性高,性能低
JavaScript语言解释器
•   V8(Google)C++
•   SpiderMonkey(Mozilla)C++
•   Rhino(Mozilla)Java
•   JavaScriptCore(Apple)C++
•   …
NodeJS的选择




http://code.google.com/p/v8/
NodeJS的事件驱动
回调函数,等待“事件”发生
/* NodeJS中的事件驱动 */

var s = require("tcp").createServer();
s.addListener("connection",function(c){
     c.send('hello jayli!');
     c.close();
});
s.listen(8080);


         NodeJS中的事件驱动
关键词
•   SSJS(Server-sideJavaScript)
•   单线程 (Single-thread)
•   非阻塞 (non-blocking)
•   长连接 (persistentconnection)
•   V8
•   事件驱动 (Event-based)
• JavaScript之初
• WebServer之初
• NodeJS
• JavaScript的优异表现
• 更进一步:DOM&YUI3
NodeJS 优秀的基础架构
给了 JavaScript更多表现空间
NodeJS带来了…
•   SSJS没有“夸浏览器”的烦恼
•   DOM、BOM的完整支持
•   jQuery和YUI3完全成为“中间件”
•   js程序可以无缝移植到服务器端
•   …
NodeJS的运行环境
“Helloworld”
/* example.js*/

var http = require('http');
http.createServer(function (req, res) {
     res.writeHead(200,
          {'Content-Type': 'text/plain'});
     res.end('Hello Worldn');
}).listen(8124, "127.0.0.1");


 命令行运行
$ node example.js
NodeJS的安装
wget http://nodejs.org/dist/node-v0.3.0.tar.gz
tar xzvf node-v0.3.0.tar.gz
cd node-v0.3.0
./configure
make
make install


                              查看版本

                                   运行程序
NodeJS程序/软件包




   http://npmjs.org/
和Python、Ruby一样
NodeJS也需要库的支持
Ryan对http的初级封装
//引入库
var fu = require("./fu");
//打开监听
fu.listen(PORT,HOST);
//响应对path_to_file的请求
fu.get('path_to_file',callback);
//请求静态文件
fu.staticHandler('filename');
//返回404
notFound(req,res);

 http://github.com/ry/node_chat/blob/master/fu.js
NodeJSDemos




http://github.com/ry/node/wiki
•   JavaScript之初
•   WebServer之初
•   NodeJS
•   JavaScript的优异表现
• 更进一步:DOM & YUI3
NodeJS如何渲染HTML




http://github.com/tmpvar/jsdom   http://github.com/tautologistics/node-
                                                htmlparser
NodeJS运行 jQuery
var jsdom = require("jsdom"),
    window = jsdom.jsdom().createWindow();

jsdom.jQueryify(window, "http://cdn/jquery.js" ,
      function() {
          window.jQuery('body').append(<div
               class='testing'>Hello World, It
               works</div>");
          console.log(window.jQuery(".testing")
               .text());
     }
);
nodejs-dom提供了

 • DOM常规操作
 • 选择器
 • YUINodeAPI
YUI3
•   高粒度的模块
•   沙箱
•   组件异步加载
•   core+widgets
•   不只为DOM而设计
               -- RyanDahl
YUI3forNodeJS




http://github.com/yui/nodejs-yui3
DavGlass
nodejs-yui3项目发起人


      UsingNode.jsandYUI3
 http://www.yuiblog.com/blog/2010/09/29/video-
                  glass-node/
启动你的YUI程序
var YUI = require("yui3").YUI,
    Y = YUI();
Y.log('hello world');



   运行
熟悉的沙箱
var YUI = require("yui3").YUI;
YUI().use('*',function(Y){
     Y.log('hello jayli!');
});


 运行
移植YUI3程序 – 后端渲染UI




• SourceCode
  – http://jayli.github.com/gallery/node/calendar-server.js

• 前端Demo
  – http://cubee.github.com/src/calendar/demo/calendar.html
移植YUI3程序 – 后端渲染UI&交互



 • SourceCode
   – http://jayli.github.com/gallery/node/pagination-server.js

 • 前端Demo
   – http://cubee.github.com/src/pagination/demo/pagination.html
YUI2Calendar
   后端渲染UI&交互




http://express.davglass.com/calendar
WhyYUI3?
• YUI3的设计使其很方便的移植到NodeJS
• YUI3在NodeJS中同样提供完整的core
• 一次编写,前/后端运行,cool!
WhataboutKISSY?
•   和YUI3极为相似的沙箱
•   核心模块更充分的解耦
•   更粗粒度的组件
•   …
KISSYforNodeJS




http://github.com/jayli/nodejs-kissy
启动你的KISSY程序
require("yui3").YUI;
Var S = KISSY;
S.use("ks-core",function(S){
     S.log("hello world");
}).


   运行
相关链接
• NodeJS
  – http://nodejs.org
• YUI3
  – http://developer.yahoo.com/yui/3/
• Nodejs-yui
  – http://github.com/yui/nodejs-yui3
• Npm
  – http://npmjs.org
• Nodejs-kissy
  – http://github.com/jayli/nodejs-kiss
Q&A

More Related Content

Node js实践