Node
是一个JavaScript
运行平台。特征:异步和事件驱动机制,还有它的标准库。node
Node
的动力源来自V8 JavaScript
引擎,是由服务于Google Chrome
的Chromium
项目组开发的。c++
V8
负责JavaScript
代码的解释和执行。用c++
绑定层可将libuv
和v8
结合起来。es6
node
包含v8
特性:shipping,staged,in progress
三组。web
npm
要求Node
项目所在的目录下有一个package.json
文件。建立package.json
文件的最简单方法使用npm
。ajax
node
程序主要分:数据库
web应用程序:提供单页应用的简单程序,rest微服务和全栈的
web
应用。
mkdir example-project cd example-project npm init -y
核心模块:express
node
的核心模块就至关于其余语言的标准库,它们是编写服务器端JavaScript
所需的工具。npm
事件模块是一个处理事件的小型库,node
的大多数api
都是以它为基础来作的。编程
node
有文件系统库,fs,path
,tcp
客户端和服务端库net
,http
库,域名解析库dns
,测试的断言库assert
,查询平台信息的操做系统库os
。json
发起一个Ajax
请求:
$.post('/url',{title: 'web'}, function(data){ console.log('收到响应了'); }); console.log('发送ajax结束');
收到响应是在发送ajax结束以后输出的。
Ajax
经过post
请求发送ajax
请求到服务器,服务器进行处理请求,而后返回响应数据到执行回调。
读取文件:
var fs = require('fs'); fs.readFile('/path',function(err,file){ console.log('读取文件完成') }); console.log('发起读取文件');
readFile()
经过fs.readFile()
异步调用node
处理请求,而后返回数据到执行回调。
两个文件读取任务的耗时取决于最慢的那个文件读取的耗时:
fs.readFile('/path1', function(err,file){ console.log('读取文件1完成'); }); fs.readFile('/path2',function(err, file){ console.log('读取文件2完成'); });
使用核心模块和流
const fs = require('fs'); const zlib = require('zlib'); const gzip = zlib.createGzip(); const outStream = fs.createWriteStream('output.js.gz'); fs.createReadStream('./node-stream.js') .pipe(gzip) .pipe(outStream)
对于同步而言,它们的耗时是两个任务的耗时之和。
非阻塞I/O是底层术语,表示你的程序能够在作其余事件时发起一个请求来获取网络资源,而后当网络操做完成时,将会运行一个回调函数来处理这个操做的结果。
一个典型的Node Web
应用程序,用Web
应用库Express
来处理商店的订单流程。
Node
和Express
中含,http
路由器,非阻塞网络I/O,线程等,libuv。
浏览器经过发起一个请求,经过非阻塞I/O,传到应用程序检查库存,注册用户,发送回执邮件,进行http
响应返回到非阻塞网络I/O,并返回一个JSON HTTP
响应给浏览器。同时进行发送了一封回执邮件,更新数据库。
Node
内置的http
服务器库,即核心模块http.Server
,负责用流,事件,Node的http
请求解析器的组合来处理请求。
事件轮询:三个非阻塞网络调用:
事件轮询是单向运行的先入先出队列。
ajax
异步提交的服务端处理过程:
var http = require('http'); var querystring = require('querystring'); http.createServer(function(req, res){ var postData = ''; req.setEncoding('urf8'); req.on('data',function(num) { postData += num; }); req.on('end',function(){ res.end(postData); }); }).listen(8080); console.log('服务器启动完成');
ajax
请求绑定了success
事件。
$.ajax({ 'url': '/url', 'method': 'POST', 'data': {}, 'success': function(data){ // success事件 } });
用node
的http
写hello world
示例:
const http = require('http'); const port = 8080; const server = http.createServer((req, res) => { res.end('hello'); }); server.listen(port,()=>{ console.log('server'); });
Node
保持了JavaScript
在浏览器中单线程的特色。cpu
;错误会引发整个应用退出,应用的健壮性值得考验。cpu
致使没法继续调用异步I/O。Web Workers
可以建立工做线程来进行计算,以解决JavaScript
大计算阻塞UI
渲染的问题。UI
。Node
能够从容应对单线程在健壮性和没法利用多核CPU
方面问题。Node
面向网络而且擅长并行I/O,可以有效地组织起更多的硬件资源,提供更好的服务。Node
利用事件循环的处理能力,而不是启动每个线程为每个请求服务,资源占用极少。Node
先后端编程语言环境统一;带来的高性能I/O用于实时应用。prototype
对象类的结构:
function User() { // 构造器 } User.prototype.method = function() { // 方法 };
es6
class User { constructor(){ } method(){ } }
[1,2,3].map(n=>n*2).filter(n=>n>3);
生成器能把异步I/O变成同步编程风格。Koa Web
应用库中用到了生成器。
web
应用
this.body = ` <div> <h1>web</h1> <p>jeskson</p> </div> `;
node
自带的调式器支持单步执行和REPL
,读取,计算,输出,循环。node
支持Chrome
调试协议。一个express web
应用程序:
mkdir hello_express cd hello_express npm init -y npm i express --save
在JavaScript
中,函数是一等对象,node
由有内建的事件模型,能够用它来写异步实时程序比用其余脚本语言好。
libuv
是提供快速,跨平台,非阻塞I/O的本地库。
node
自带了一个调试器和一个依赖管理器npm
。
v8
被用做JavaScript
运行时。