JS解析器只是JS代码运行的一种环境,浏览器是JS运行的一种环境,浏览器为JS提供了操做DOM对象和window对象等接口。Node.js也是JS的一种运行环境,node.js为JS提供操做文件、建立http服务、建立TCP、UDP服务等接口,因此Node.js能够完成其余后台语言能完成的工做。html
总结:Node.js是一个让JavaScript运行在服务端的开发平台。3.Node.js为何会出现?java
之前是没有人会想到用JavaScript做为本身的web server 这是由于什么呢?由于JavaScript是比较慢和乱 node
- V8引擎解决了JavaScript慢的问题
- commonjs解决了乱的问题
- Node的特性是事件驱动
- 为了弥补JavaScript在服务器端的空白web
因此,Node.js的产生因素:数据库
4.交互式运行环境:PEPLnpm
Node.js提供了一个交互式运行环境,经过这个环境,能够当即执行JS代码,使用方法相似于Chrome浏览器中Firebug插件中的Console。编程
在Linux环境进入终端后,输入"node"进入Node.js的交互式运行环境,Ctrl+d能够退出此环境。json
查看系统中安装的Node.js版本:node -v浏览器
运行JS文件,eg:node file.js服务器
5.Node.js模块和包
⑴模块:
Node.js官方提供了不少模块,这些模块分别实现了一种功能,如操做文件模块fs,构建http服务模块的http等,每一个模块都是一个JS文件,固然也能够本身编写模块。
⑵包:
包能够将多个具备依赖关系的模块组织在一块儿,封装多个模块,以方便管理。Node.js采用了CommonJS规范,根据CommonJS规范规定,一个JS文件就是 一个模块,而包是一个文件夹,包内必须包含一个JSON文件,命名package.json。通常状况下,包内bin文件夹存放二进制文件,包内的lib文件夹存放JS文件,包内的doc文件夹存放文档,包内的test文件夹存放单元测试。package.json文件中须要有包含的字段及包的使用。
⑶npm包管理工具:
npm是node.js的包管理工具,npm定义了包依赖关系标准,咱们使用npm主要用来下载第三方包和管理本地下载的第三方包。
6.异步式I/O与事件驱动
传统的实现方法的代码执行到第一行的时候,线程就会阻塞,等待数据库返回结果,而后再继续处理。因为数据库的操做可能涉及磁盘读写和网络通讯,其延时可能向当长。对于高并发的访问,一方面线程长时间 阻塞等待返回结果,另外一方面为了应付新需求不断增长线程,所以浪费大量系统资源,同时线程也会占用大量的CPU来处理上下文切换,并且还容易遭受低速连接的攻击。
Node.js处理方法中第二个参数为一个回调函数,进程执行到db.query时,不会等待数据库返回结果,而是直接执行后面的语句,直到进入事件循环。当数据库返回查询结果时,会将事件发送到事件队列,等到线程进入事件循环后,才会调用函数执行后面的逻辑。
⑴不须要放在 Nginx / Apache 后,Node.js自己就内置了一个HTTP模块
NodeJS内建了一个HTTP服务器支持,能够垂手可得的实现一个网站和服务器的组合,不像PHP、Perl那样,在使用PHP的时候,必须先搭建一个Apache之类的HTTP服务器,而后经过HTTP服务的模块加载 CGI调用,才能将PHP脚本的执行结果呈现给用户。
加载http模块以后,便可建立一个http服务器:
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Hello World</p>');
}).listen(8080);
⑵Node.js 能够更精细的控制 Request 和 Response 的时间和内容
⑶能支持数万个并发链接
⑷采用事件驱动、异步编程,为网络服务而设计
10.Node.js的缺点:
⑴可靠性低,不支持故障恢复
当程序有错误发生时,整个进程就会结束,须要从新在终端中启动服务器。这一点在开发中无可厚非,但在产品环境下就是严重的问题了,由于一旦用户访问时触发了程序中某个隐含的bug,整个服务器就崩溃了,将没法继续为全部用户提供服务。在部署Node.js 应用的时候必定要考虑到故障恢复,提升系统的可靠性。 (后面讲多线程多进程支持的时候看看怎么解决的)
⑵单进程,单线程,默认支持单核CPU(支持多进程的方法)
⑶太新了,API还在成熟过程当中
由于异步的缘由, 一些完整的逻辑不可避免的会被分割成不少小块, 放在不一样的回调函数里去执行, 一旦项目巨大的话, 这种开发方式面临的风险不是一点点。不符合开发者的常规线性思路,每每须要把一个完整的逻辑拆分为一个个事件,增长了开发和调试难度。
// 传统代码 var user = db.user.get('name');
var article = db.article.get(user.id);
var comment = db.comments.get(article.id);
// 异步回调 db.user.get('name', function(err, user){
if(err) trow err; db.article.get(user.id, function(err, article){
if(err) throw err;
db.comments.get(article.id, function(){
if(err) throw err;
// doSomethingWithResults();
})
});
});