Node.js Introduction – What's Node – Technique



Node.js Introduction – What's Node – Technique

1 0


ppt


On Github claudeck / ppt

Node.js Introduction

Speaker : Claude Jiang

Agenda

  • What's Node
  • Node Web development
  • Who use Node
简单的介绍今天的议题,主要讲第一个,后面两个简单介绍。 假设大家有JavaScript和Java开发背景。

What's Node

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

这个是官网给出来的定义。 可能很多人对于这个定义出现的这个名词都不熟悉。我们这次培训主要的目的就是讲清楚这些东西。我会先从一些你们熟悉的东西慢慢把你们带入node的世界。

Node VS Java platform

  • Language
  • Platform
  • Frameworks & Tools
Node并不是简单的运行于服务器端的JS。 JS在其被发明的初段就已经有用于服务器端Livewire。Rhino. 语言方面:Java使用的是java language,Node使用的是JS。Java运行于Jvm虚拟机,node运行于v8 js引擎。 平台方面:Java运行于Java平台。而node本身称得上平台。 框架和工具:struts。express。grunt,ant,maven.
Talk is cheap. Show me the code. - Linus Torvalds

Hello, Server side javascript

//load third party module 'colors'.
var colors = require('colors');

//print out 'Hello Node.js' with colorized.
console.log("Hello Node.js".rainbow);
              
  • Chrome Javascript runtime - V8
  • API for server side
  • NPM
先跑一下例子。 我们从这个例子中可以了解到。 1.以前JS是跑在浏览器的,没有io,模块管理等机制。node在v8和commonjs之上把这些机制建立起来。 2.第一句用于引入colors模块,该模块的功能是使用控制台的一些转义字符输出带颜色的文字 3.模块机制不像namespace有命名的限制,你可以对你引入的模块任意取名。 4.第二句话用于将字符串打印出来,console.log在浏览器上也有存在,在node中它等同于输出到标准输出上。 https://github.com/marak/colors.js/

Hello, Asynchronous I/O Programming

$.ajax({
  url: 'http://www.claudejiang.com/echo',
  data: {param1: 'claude'},
  success: function(data){
    ...
  }
});
var fs = require('fs');

fs.readFile('text.txt', {encoding: 'UTF-8'}, function(err, data){
    if(err) throw err;
    console.log(data);
});
console.log('end.');
  • Asynchronous I/O APIs
  • Asynchronous Programming
  • Node style callback
1.第一段代码是我们经常在网页上看到的ajax请求,浏览器端的javascript天生对异步友好,像ajax请求使用回调的方式,browser上的dom的事件回调以及最新的jquery的ajax使用promise重写,这些都是异步编程在浏览器端的应用。 2.接下来演示一个异步IO的例子。非阻塞IO是Node的核心。node的绝大部分api都是用来处理IO和网络的,通过灵活应用可以生产出各种应用。 3.fs模块的sync和async api 4.sio和aio的区别。 5.function(err, data)。node风格的回调处理。异常处理是node异步编程的难点之一。

Hello, Buffer/Stream/Event Emitter

var fs = require('fs');

var rs = fs.createReadStream(__filename);
rs.on('data', function(data){
  // console.log(data);
  console.log(data.toString());
});
rs.on('end', function(){
  console.log('end');
});
// rs.pipe(process.stdout);
              
  • Use Event(Sub/Pub) for Async IO
  • Buffer
  • Stream/pipe
  • Unix/Linux philosophy
第一个例子使用回调来处理异步,这个例子使用了事件来处理异步。 在对Stream的操作中,我们一般会处理到data, end, error三个事件。 而data如果没有指定字符编码的话,会返回Buffer对象。Buffer是Node用于二进制处理的对象。(1.Node的内存管理,2.Buffer和ECMAScript中的ArrayBuffer). Linux符合JS哲学,Linux的哲学中,一切都是文件,让每一个程序成为过滤器。(Stream.pipe, connect.use)每一个程序之做好一件事情(npm);

Hello, TCP Programming

// load net module
var net = require('net');

// create a tcp server
var server = net.createServer(function (socket) {
  socket.on('data', function(data){
    socket.pipe(socket);
  });
});

// bind to port 7000 on localhost
server.listen(7000, "localhost");

console.log("TCP server listening on port 7000 at localhost.");
              
演示例子。把客户端的信息原样返回。 在Node中开发tcp/udp应用是非常简单的。socket是一个双工流对象。只要了解流怎么应用,就可以很简单的开发一些网络应用。

Hello, Web Programming

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');

console.log('Server running at http://127.0.0.1:1337/');
              
在Node中开发web应用也是件简单的事。 Node并不是一个Web框架,它是一个平台,可以使用它提供的http模块很简单的开发出一个http server。 Http模块是建立在net模块之上的,只是在其上对keep-alive做了一些封装,其他request,response对象都只是简单的对输入流和输出流进行了封装。

Hello DIRTy, Socket.io Programming

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});
              
<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>
              
  • data-intensive real-time applications
  • chat/communication/stream/mongodb/proxy
Node最适合的应用场景介绍 进一步演示一些node in action中简单的chat应用。

Technique

  • JavaScript
  • Asynchronous I/O Programming
  • NPM

JavaScript

  • Performance - V8
  • CommonJS
  • Multi-paradigm programming
  • Asynchronize friendly
  • Atwood's law
1. v8的性能是脚本语言中最好的之一,加上原生c++模块可以处理一些性能要求比较高的场景。 2. nodejs没有完全按照commonjs的标准,是commonjs的一种实践,其中主要实现了包管理和一些io api。 3.函数式编程 A.高阶函数 B.闭包 4.基于原型链继承的面向对象 5.异步友好(broswer上的事件循环和ajax) 6.libray可以服务端和客户端共用

Atwood's law

Any application that can be written in JavaScript, will eventually be written in JavaScript.

Asynchronize I/O Programming

  • Why non-blocking io
  • Event Loop
  • Asynchronize Programming

Why non-blocking io

  • Synchronize block: M+N
  • Asynchronize non-block: Max(M,N)
上图为系统各个环节中所需要的CPU时钟。 在阻塞模式下,由于IO和网络的工作的过程中,CPU需要等待IO。(M+N) 在非阻塞模式下,可以从分利用IO,减少CPU等待。Max(N,N)。 举个例子:ajax,client段的多线程处理UI。

Synchronize block

var fs = require('fs');
var path = require('path');

var files = fs.readdirSync('.'); // cpu wait
files.forEach(function(file){
  var stat = fs.statSync(file); // cpu wait
  if(stat.isFile()){
    var str = fs.readFileSync(file, {encoding: 'utf8'}); // cpu wait
    console.log(file + ":" + str.length);
  }
});
              
  • CPU浪费在等待IO上(M+N)

Asynchronize non-block

var fs = require('fs');
var path = require('path');

fs.readdir('.', function(err, files){
    if(err) return console.log(err);
    files.forEach(function(file){
        fs.stat(file, function(err, stat){
            if(stat.isFile()){
                fs.readFile(file, {encoding: 'utf8'}, function(err, str){
                    console.log(file + ":" + str.length);
                });
            }
        });
    });
});
              
  • CPU不需要等待IO完成,通过回调或者事件通知完成(Max(M,N))
  • Pyramid of doom(Callback hell)
回调函数嵌套

Event Loop

  • Single Javascript thread
  • Lower memory cost
  • High bound selects
Node使用时间循环来处理异步。 与单线程事件模型相对应的是多进程,单进程多线程。 当一个request在处理过程中,所有的IO和网络操作都是异步的,异步处理会将回调绑定到事件循环中,作为时间循环的观察者,当事件处理完毕后,通过事件循环出发回调函数。 一个运行时间很长的方法会阻塞其他请求。

Asynchronize Programming

  • Callback
  • Event(Sub/Pub) - Event Emitter
  • Promise/Deferred
  • Library(Async/Step/When/Q/wind)
如何处理回调地狱 写过朴灵的《深入浅出node.js》。自称可以“一个能搞定回调函数嵌套的男人”

NPM

  • Sharing is encouraged

NPM

  • npm install <module name>
  • npm install -g <module name>
  • Module lookup
  • Private NPM

Node.js Web Development

  • Web Development History
  • Full stack JS Web Dev

Web Development History

Static HTML content

dynamic HTML

Ajax

no refresh reduce requests better ue send html/xml

Server side MVC

large project architecture layered send html segment/json

Client side MVC

1 page = html + css + js 1 page = 10 - 100+ pv 1.丰富的js library 2. html 5 3. mobile web 4. send json 5. restful api 6. web page - web app

Front-ends/Back-ends

前端处理UI和跟服务交互。 后端可以采用其他语言开发,使用关系型数据的应用最好还是采用Java等语言开发。

Web App

Isomorphic JavaScript

Full stack JS Web Dev

  • MEAN(Mongo + Express + Angular + Node)
Mongo + express + angular + node.js grunt + mocha + jscover better for object db or restful server proxy

Who use Node

  • Linkedin
  • Microsoft
  • Groupon
  • Paypal
  • Yahoo
  • eHealth ;-)
  • Taobao
  • ...

Thank you

I hear and I forget. I see and I remember. I do and I understand. 不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之;学至于行之而止矣。- 荀子《儒效篇》 实践是最好的学习方式。按照自己的思路,查阅node的api,实现自己的设想。 因为node更加底层,所以可以让我们学习到更多系统底层的东西