JS解析器只是JS代码运行的一种环境,浏览器是JS运行的一种环境,浏览器为JS提供了操作DOM对象和window对象等接口。Node.js也是JS的一种运行环境,node.js为JS提供操作文件、创建http服务、创建TCP、UDP服务等接口,所以Node.js可以完成其他后台语言能完成的工作。
总结:Node.js是一个让JavaScript运行在服务端的开发平台。- 以前JavaScript并不涉及什么逻辑代码,但是node的出现使得JavaScript能做一些负责的逻辑代码
- JavaScript为客户端而生,node为网络而生
- 异步方式,适合开发大的应用
3.Node.js为什么会出现?
以前是没有人会想到用JavaScript作为自己的web server 这是因为什么呢?因为JavaScript是比较慢和乱
- V8引擎解决了JavaScript慢的问题
- commonjs解决了乱的问题
- Node的特性是事件驱动
- 为了弥补JavaScript在服务器端的空白
所以,Node.js的产生因素:
4.交互式运行环境:PEPL
Node.js提供了一个交互式运行环境,通过这个环境,可以立即执行JS代码,使用方法类似于Chrome浏览器中Firebug插件中的Console。
在Linux环境进入终端后,输入"node"进入Node.js的交互式运行环境,Ctrl+d可以退出此环境。
查看系统中安装的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();
})
});
});