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

PDF
NodeJS基礎教學&簡介
PDF
twMVC#43 YARP
KEY
Intro-to-SeaJS
PPTX
Maven & mongo & sring
PDF
KISSY Mechanism
PDF
twMVC#43 C#10 新功能介紹
PDF
Koa 正在等一個人
PPT
Node分享 展烨
NodeJS基礎教學&簡介
twMVC#43 YARP
Intro-to-SeaJS
Maven & mongo & sring
KISSY Mechanism
twMVC#43 C#10 新功能介紹
Koa 正在等一個人
Node分享 展烨

What's hot (20)

PDF
twMVC#42 Azure IoT Hub for Smart Factory
PPTX
Docker一期培训
PPTX
快速入坑 Node.js - 0613 SITCON 雲林定期聚
PPTX
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
PPTX
使用 Visual Studio Code 建構 JavaScript 應用程式
PPTX
RxJS 6 新手入門
PPTX
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
PDF
twMVC#44 讓我們用 k6 來進行壓測吧
PPTX
QCon - 一次 Clojure Web 编程实战
PPT
课题二:Node.js那些事儿
PDF
現代 IT 人一定要知道的 Ansible 自動化組態技巧
PDF
深入浅出NodeJS
PDF
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
PDF
Gulp.js 自動化前端任務流程
PPTX
前端自動化工具
PPTX
Docker進階探討
PPTX
lua & ngx_lua 的介绍与应用
PPT
编辑器设计U editor
PPT
Node.js在淘宝的应用实践
PDF
Automate with Ansible basic (3/e)
twMVC#42 Azure IoT Hub for Smart Factory
Docker一期培训
快速入坑 Node.js - 0613 SITCON 雲林定期聚
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 Visual Studio Code 建構 JavaScript 應用程式
RxJS 6 新手入門
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
twMVC#44 讓我們用 k6 來進行壓測吧
QCon - 一次 Clojure Web 编程实战
课题二:Node.js那些事儿
現代 IT 人一定要知道的 Ansible 自動化組態技巧
深入浅出NodeJS
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
Gulp.js 自動化前端任務流程
前端自動化工具
Docker進階探討
lua & ngx_lua 的介绍与应用
编辑器设计U editor
Node.js在淘宝的应用实践
Automate with Ansible basic (3/e)
Ad

Viewers also liked (17)

PPTX
Building The Framework For A Culture Of Security
PPT
Современные проекты и планы города Запорожья в жилищно-коммунальном хозяйстве
DOCX
Informe exploracion
PPS
Maestros afectuosos
PPTX
Los Sectores del Aula
PPTX
4 p s_success
PDF
Powerpoint management thème ii icemba 2016
PPTX
The British education system
PPTX
Варикозная болезнь
DOCX
Mapa conceptual de el docente y los programas escolares.
PPTX
1. kerjasama internasional
PDF
MAPS experiences with long-term low greenhouse gas emission development strat...
PDF
Long-term low greenhouse gas emission development strategies, Peter Janoska C...
PPTX
2016 ENV Ministerial - Michelle Harding - OECD - Taxation on gasoline - Air p...
PDF
Transparency of mitigation - Sweden, Erik Adriansson CCXG GF September 2016 B...
PPSX
Education system in the UK
PDF
Wedding march(marcha nupcial)
Building The Framework For A Culture Of Security
Современные проекты и планы города Запорожья в жилищно-коммунальном хозяйстве
Informe exploracion
Maestros afectuosos
Los Sectores del Aula
4 p s_success
Powerpoint management thème ii icemba 2016
The British education system
Варикозная болезнь
Mapa conceptual de el docente y los programas escolares.
1. kerjasama internasional
MAPS experiences with long-term low greenhouse gas emission development strat...
Long-term low greenhouse gas emission development strategies, Peter Janoska C...
2016 ENV Ministerial - Michelle Harding - OECD - Taxation on gasoline - Air p...
Transparency of mitigation - Sweden, Erik Adriansson CCXG GF September 2016 B...
Education system in the UK
Wedding march(marcha nupcial)
Ad

Similar to Node js实践 (20)

PDF
Browser vs. Node.js Jackson Tian Shanghai
KEY
D2_Node在淘宝的应用实践
PDF
D2_node在淘宝的应用实践_pdf版
PDF
JavaScript Engine
PDF
Noder eyes for frontend guys
PDF
COSCUP 2010 - node.JS 於互動式網站之應用
PPTX
Nodejs部门分享
PDF
Nodejs介绍
PDF
Nodejs & NAE
PDF
Introduction to NodeJS
PDF
Node getting-started
PDF
Node.js 進攻桌面開發
PPT
Node Web开发实战
PDF
Node.js Quick Tour
PPTX
Node.js长连接开发实践
PPT
Node Web开发实战
ODP
史前的Ssjs——从js的asp到node js
PDF
2013年京JS参会分享
PPTX
Node js feat pegasus
PPTX
深入淺出Node.JS
Browser vs. Node.js Jackson Tian Shanghai
D2_Node在淘宝的应用实践
D2_node在淘宝的应用实践_pdf版
JavaScript Engine
Noder eyes for frontend guys
COSCUP 2010 - node.JS 於互動式網站之應用
Nodejs部门分享
Nodejs介绍
Nodejs & NAE
Introduction to NodeJS
Node getting-started
Node.js 進攻桌面開發
Node Web开发实战
Node.js Quick Tour
Node.js长连接开发实践
Node Web开发实战
史前的Ssjs——从js的asp到node js
2013年京JS参会分享
Node js feat pegasus
深入淺出Node.JS

Node js实践