【第一节 Node.js简介】

1.Node.js是什么?
  
  Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的、可扩展的网络应用。Node.js采用事件驱动和非阻塞I/O模型,使其变得轻微和高效,非常适合构建运行在分布式设备的数据密集型实时应用。
  
  它运行于浏览器的Javascript,浏览器就是Javascript代码的解析器,而Node.js则是服务器端JS的代码解析器,存于服务器端的JS代码由Node.js来解析和应用。

  

  JS解析器只是JS代码运行的一种环境,浏览器是JS运行的一种环境,浏览器为JS提供了操作DOM对象和window对象等接口。Node.js也是JS的一种运行环境,node.js为JS提供操作文件、创建http服务、创建TCP、UDP服务等接口,所以Node.js可以完成其他后台语言能完成的工作。

  总结:Node.js是一个让JavaScript运行在服务端的开发平台。
 
2.Node.js能做什么?  
  • 以前JavaScript并不涉及什么逻辑代码,但是node的出现使得JavaScript能做一些负责的逻辑代码
  • JavaScript为客户端而生,node为网络而生
  • 异步方式,适合开发大的应用
       具有复杂逻辑的网站
       基于社交网络的大Web的应用
       Web Socket服务器
       TCP/UDP套接字应用程序
       命令行工具
       交互式终端程序
       ...

3.Node.js为什么会出现?

  以前是没有人会想到用JavaScript作为自己的web server 这是因为什么呢?因为JavaScript是比较慢和乱 


  - V8引擎解决了JavaScript慢的问题 
  - commonjs解决了乱的问题 
  - Node的特性是事件驱动 
  - 为了弥补JavaScript在服务器端的空白

  所以,Node.js的产生因素:

        V8(一个字就是快)
        javaScript在服务器端空白
        事件驱动
        CommonJs的规范化

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与事件驱动

    Node.js最大的特性就是采用异步式I/O与事件驱动的架构设计。对于高并发的解决方案,传统的架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式I/O调用时的时间开销。Node.js使用的单线程模型,在执行的过程中会维护一个事件队列,程序在执行时在进入时间循环等待下一个事件到来。
普通:res=db.query("select * from user")
            res.output();
        
Node.js: res=db.query("select * from user",function(res){
          res.output();
     })
    

 

  传统的实现方法的代码执行到第一行的时候,线程就会阻塞,等待数据库返回结果,然后再继续处理。由于数据库的操作可能涉及磁盘读写和网络通信,其延时可能向当长。对于高并发的访问,一方面线程长时间 阻塞等待返回结果,另一方面为了应付新需求不断增加线程,因此浪费大量系统资源,同时线程也会占用大量的CPU来处理上下文切换,而且还容易遭受低速链接的攻击。 
  Node.js处理方法中第二个参数为一个回调函数,进程执行到db.query时,不会等待数据库返回结果,而是直接执行后面的语句,直到进入事件循环。当数据库返回查询结果时,会将事件发送到事件队列,等到线程进入事件循环后,才会调用函数执行后面的逻辑。

  程序会自动往下执行。
 
7.浏览器引擎革命
 
    Google Chrome的引擎是V8。Node.js 的是引擎引用的就是V8。所以它快,为什么ExtJs在Chrome如此的快,就因为如此。
 
8.部署node.js的环境
 
    Node.js官方:http:/nodejs.org  下载安装包。安装后。打开cmd的dos窗口
    运行node
            console.log("success")
 
9.Node.js的优点:

  ⑴不需要放在 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();

                })

             });

           });

posted @ 2017-11-01 15:43  Sugar_lzr  阅读(185)  评论(0编辑  收藏  举报