Node.js

 node.js的产生、node.js与java Script的关系、node.js的特点
        Node.js产生因素:V8引擎、java Script在服务器端的空白、核心是事件驱动,Commonjs的规范化
node.js主要应用的领域:restful API、实时通信:如消息推送、高并发、I/O阻塞
生态圈:以NPM为中心、基础服务提供方
开源项目:express、pm2、jade、后期分离出I/O js
开发语言:java script、应用于web服务器端框架,node.js可以实现javascript在服务端的开发平台
node.js是通过v8引擎编译成本地语言,二进制,实现的,node.js是单线程语言,由于是单线程语言,节省了cpu进行读写操作时间(IO),多线程访问方法,发
 
送请求,再访问方法,单线程是将发送请求和响应结果都放在方法中
node.js为什么在Google Chrome浏览器运行速度快,因为Google的浏览器的引擎是V8,这也是为什么Ext在Google浏览器运行速度快的原因
列子:Ext.Ajax.request({
url:请求路径(action);
sync:false;//false 代表同步操作,true:代表异步操作
},function(response){
alert(1);
})
alert(2);
当sync为true时,那么执行结果为 2,1,当sync为false时,先执行1再执行2
2:node.js的作用:
java script是有客户端产生的,node.js是为网络而生的
具有复杂逻辑的网站
基于社交网络的大web的应用
web socket服务器
TCP/UDP套接字应用程序
命令行工具
交互式终端程序
3:异步式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();
})
程序会自动往下进行,等待出发函数
4:Hello world
打开文本编译器,在其中输入console.log("Hello world");并保存为helloworld.js打开dos窗口进入该文件的运行目录 ,命令:node helloworld.js执行可以看到
 
输出为“helloworld”
5:node.js执行命令
node -v  //检查当前的node.js的版本
node -e // 执行的是:eval script 函数,直接执行  就等同于eval("console.log('呵呵')");
node //node直接进行编译模式,console.log('1');第一行是输出结果,第二行是返回值
退出当前编译模式:ctrl+c  两次
6:Node.js异步式I/O与事件式编程
Node.js最大的特性就是异步式I/O与事件的紧密结合的编程方式,这种编程的方式与传统的同步式I/O线性发的变成呢个思想不一样,因为控制流很大程
 
度上要靠事件和回调函数来组织的,一个逻辑要拆成若干个单元格。
内容:阻塞和线程
1:同步式I/O和阻塞式I/O
线程在执行过程中遇到磁盘读写或网络通信,通常要耗费很长时间。这时操作系统要剥夺这个线程cpu控制权,使其暂停执行。同时将资源让给其他线程
 
,这种线程调度方式称为阻塞,当I/O线程工作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对cpu的控制权,令其继续执行。
2:异步式I/O或非阻塞式I/O
针对所有的I/O操作不采用阻塞策略,当线程遇到I/O操作时,不会以阻塞的方式等待I/O操作的完成或结果的返回,而只是将I/O的操作发送给系统,继续
 
执行下一条语句,当系统完成I/O操作时,以时间的形式通知执行的I/O操作的线程,线程会在特定的时间处理这个事件,为了处理异步I/O,线
 
程必须有时间循环,不断的检查有没有未处理的事件,依次予以处理
3:非阻塞与阻塞的区别:
非阻塞的模式下,一个线程永远在执行计算操作,这个线程所使用的cpu核心利用率永远是100%,I/O以事件的方式通知
阻塞模式下,多线程往往能提高系统的吞吐量,因为一个线程阻塞还有其他线程在工作,多线程可以让cpu资源不被阻塞中的线程所浪费
4:同步I/O和异步I/O区别
同步式I/O(阻塞式)                                                 异步式I/O(非阻塞式)
1:利用多线程提高吞吐量                                  --   单线程即可实现提高吞吐量
2:通过事件片分割和线程调度利用多核cpu       --   通过功能划分利用多核
3:需要由操作系统调度多线程使用多核cpu       --   可以将单线程绑定到单核cpu
4:难以充分利用cpu资源                 --   可以充分利用cpu、
5:内存轨迹大,数据局部性弱                   --    内存轨迹小,数据局部性强
6:符合线性的编程思想            --    不符合传统的编程思想
                5:回调函数(异步式读取文件和同步式读取文件)
                分析:调用时所做的工作知识将异步式IO请求发送给操作系统,然后立即返回并执行后面的语句,执行完以后进入监听循环事件之                                中,当fs接收到IO请求完成事件时,事件循环会主动调用回调函数完成后续工作,同步式IO则是阻塞线程等待完成,之后                                    再继续执行后面的语句
                6:事件
                        1:普通事件的使用
                        2:Node.js事件循环机制
                                1:Node.js是什么时候进入事件循环机制?
                                       答:Node程序是由事件循环开始到事件循环结束,所有的逻辑都是事件的回调函数
                                2:如何使用自定义事件呢?
                                        答:事件的回电函数是在执行的过程中,可能会发出IO请求或直接发射(emit)事件,执行后再返回事件循环
                7:模块和包
                概念:模块(module)和包(package)是Node.js的最重要支柱,开发一个具有一定规模的程序不可能只有一个文件,通常把各个功能拆分、分装、然后再组合。模块正是实现这种方式而诞生,在浏览器java Script当中,脚本模块的拆分和组合通常使用HTML的script标签来实现的,Node.js通过require来调用其他模块,而且模块都是基于文件的,机制非常简单,模块和包的区别是透明的,经常不做区别
                        1:模块
                                1):什么是模块
                                    模块和文件是一一对应的,一个Node.js就是一个模块,这个文件可能是java scirpt也可能是JSON,还有可能是C/C++的扩展,var http = require('http') 其中http是Node.js的核心模块,通过require函数来调用这个模块,然后使用其中的对象
                                2):创建及加载模块
                                    (1):创建模块
                                            Node.js提供了exoprts和require两个对象,其中exoprts是模块的公共接口,require用于从外部获取接口,即获取模块的exoprts的对象。附件Module.js和getModule.js实现
                                     (2):单次加载
                                            上面的列子有点类似创建对象,但实际上和创建对象又有本质上的区别,因为require不会重复的加载模块,也就是说无论调用多少次require,获取的模块只有一个
                                     (3):覆盖exoprts
                                            有时候我们只是想把对象分装到模块中,列如
                                            定义模块:singleobejct.js
                                            引用模块使用:getSingleObject.js
                                            繁琐:exoprts hello = hello
                                            引入:require('/singleobject').hello
                                            简易:module.exoprts = hello
                                            exoprts本身仅仅只是一个空对象,即{},它只是用来声明接口的
                        2:创建包
                                1:包的概念
                                   概念:包是在模块的基础上深一步的抽象,Node.js的包类似于C/C++的函数库或者java的类库,它将某个独立的功能封装,用于发布、更新、依赖管理的版本控制。开发了npm来解决包的发布和获取需求
                                2:如何创建包
                                    commonJs规范的包应该具有以下特征:
    ·                                package.json必须在顶层包的目录下
                                      二进制文件应该放在bin目录下
                                      javaScirpt代码应该放在lib目录下
                                      文件应该在doc目录下
                                       单元测试应该在test目录下
                            Node.js对包的要求没有那么严格,只要package.JSON在顶层目录下即可
                                        1:作为文件夹的模块
                                                somepackage文件夹
                                                最简单的包就是作为一个文件夹的模块
                                                创建一个somepackage文件夹,里面有一个index.js,里面提供了一个sayHello();
              
 
 
 
 
 
 
 
 
 
 
 
 
 

posted on 2017-04-17 21:48  北方阿木  阅读(181)  评论(0)    收藏  举报

导航