Nodejs

nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。

图解NodeJS【基于事件、回调的单线程高性能服务器】原理

轮询技术的缺点在于应用程序要主动调用,会造成占用较多CPU时间片,性能较为低下。

理想的异步I/O应该是应用程序发起异步调用,而不需要进行轮询,进而处理下一个任务,只需在I/O完成后通过信号或是回调将数据传递给应用程序即可。

Node只是表面暴露给用户的javascript代码是单线程的,底层还是多线程的。

Node.js选择的异步I/O方案:由于Windows平台和*nix平台的差异,Node.js提供了libuv来作为抽象封装层,使得所有平台兼容性的判断都由这一层次来完成,保证上层的Node.js与下层的libeio/libev及IOCP之间各自独立。Node.js在编译期间会判断平台条件,选择性编译unix目录或是win目录下的源文件到目标程序中。

每次循环中,它会调用IOCP相关的GetQueuedCompletionStatus方法检查是否线程池中有执行完的请求,如果存在,poll操作会将请求对象加入到loop的pending_reqs_tail属性上。 另一边这个循环也会不断检查loop对象上的pending_reqs_tail引用,如果有可用的请求对象,就取出请求对象的result属性作为结果传递给oncomplete_sym执行,以此达到调用JavaScript中传入的回调函数的目的。 至此,整个异步I/O的流程完成结束。其流程如下:

初探Node.js的异步I/O实现

使用Node的时候,会在javascript触发一些命令调用方法,这些方法会被包装成一个对象,放入线程池,然后前面的方法就返回了,继续执行下面的JS代码。

线程池中采用多线程的方式执行,执行完的对象放入事件循环队列。

事件循环队列采用类似while(true)这种循环的方式,不断的查看是否有事件,并且读取是否包含回调,由于前面回调函数被包装到对象中,这里直接调用执行就可以了。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

  • npm:NodeJs包管理器
  • express:服务器端比较流行的MVC框架,处理服务请求,路由转发,逻辑处理
  • mongoose:mongodb包装,更方便使用数据库
  • :实现服务端和客户端socket通信解决方案
  • backbone:客户端MVC框架,编写客户端应用(豆瓣说)
  • coffeescript:提高JavaScript的可读性,健壮性
  • zombie:浏览器子集,编写html解析器,轻形javascript客户端测试

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、进入 http://nodejs.org 下载开发环境

http://Expressjs.com 下载安装Express  npm install -g express

继续安装ejs:npm install ejs

如果要想运行Node.js程序,则现在只能够使用“node app.js”,而这样的运行方式,如果在app.js文件修改之后往往需要重新启动才可以加载新的内容,这对于开发是非常不方便的, 为此,可以使用一个supervisor组件包,它可以动态的加载修改之后的开发程序。

下载安装supervisor

npm install -g supervisor

利用supervisor方式运行程序

supervisor app.js

2、调试代码:进入npm目录安装supervisor。 -g 表示全局模式 
npm install -supervisor -g
 安装supervisor 来控制调试代码。 不需要每次停止重启node.js的服务
使用supervisor app.js启动
 
3、开发工具 WebStorm http://www.jetbrains.com    tools 下载30天试用版
 
4、回调函数:调用时所做的工作知识将异步式IO请求发送给了操作系统,然后立即返回并执行后面的语句,执行完以后进入事件循环监听事件,当fs接受到IO请求完成的事件时。事件循环会主动调用回调函数完成后续工作。同步则是阻塞等待完成后,继续执行。
 
5、事件
            a.普通事件的使用
                    //声明事件对象`
                    var EventEmitter=require('events').EventEmitter;
                    var event=new EventEmitter();
                    //注册事件
                     event.on('some_event',function(){
                        console.log('这是一个自定义的事件');
                    });
                    //触发事件
                    setTimeout(function(){
                        event.emit('some_event');
                    },1000);
            b.Node.js的事件循环机制
                (1)Node.js在什么时候进入事件循环呢?
                        Node.js程序是由事件循环开始,到事件循环结束,所有的逻辑都是事件的回调函数。
                (2)如何使用自定义事件呢?
                        事件的回调函数在执行的过程中,可能会发出IO请求或直接发射(emit)事件,执行完毕后再返回事件循环。

6、模块:Node.js提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即获取模块的exports对象。exports本身仅仅是一个普通的空对象,即{},它是专门用来声明接口

7、包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的函数库或者java的类库,它讲某个独立的功能封装起来,用于发布、更新、依赖管理的版本控制。npm解决包的发布和获取需求。

 Node.js包管理器,即npm是Node.js官方提供的包管理工具,它已经成了Node.js包的标准发布平台,用于Node.js包的发布、传播、依赖控制。
                (1)获取一个包
                        npm [install/i] [package_name]       
                       例如安装express包:
                        npm i express
                 卸载包:
                    npm uninstall 包名 [-g]
                  查看当前所有包:
                    npm list
                   ....
                    帮助链接:http://www.cnblogs.com/bluefrog/archive/2012/08/14/2639085.html
                (2)本地模式和全局模式
                        npm在默认情况下会从http://npmjs.org搜索或下载包,讲包安装到当前目录的node_modules  
                        a.默认是npm install 包名   作为本地模式
                        b.全局模式
                            npm install -g 包名
                        c.区别和用法
                                因为本地模式不会注册PATH环境变量,举例,我们安装supervisor是为了在命令行中运行它,譬如直接运行supervisor scirpt.js。
                                npm本地模式仅仅把包安装到了node_modules子目录下,其中的bin目录没有包含在PATH环境变量中,调用。不能直接在命令行中
                                使用全局模式安装的包并不能直接在javascript文件中require获得,因为require不会搜索/usr/local/lib/node_modules。
                    
                        通俗讲:当我们要把某个包作为工程运行时的一部分时,通过本地模式获取,如果在命令行下使用,则使用全局模式。
                        d.包的发布
                               首选确保具备CommonJS为基础包的规范,但与CommJS并不完全一致,其主要差别在于必填字段的不同,通过使用npm init可以根据交互式问答产生一个符合标准的package.json
                         dos进入这个目录运行 npm init得到package.json的文件,改成自己的文件等信息
                        然后进入package.json所在目录运行  npm publish  就完成了发布
                         如何更新包?
                            如果你的包内容有改动,则在版本上作改动,运行npm publish
                            访问http://search/npmjs.org/就可以找到自己刚刚发布的包了                          如何取消发布:
                               npm unpublish     

8、调试代码

                        在eclipse装插件
                                地址是 http://chromedevtools.googlecode.com/svn/update/dev/
                                 在debug中配置  端口为5858 
                        在命令行运行js文件的时候
                                node --debug-brk=5858 文件名.js
                        现在就在ecplise中启动debug就可以跟断点了
                    Google Dart
 
9、全局对象与全局变量:所有属性都可以在程序的任何地方访问,即全局变量。在JavaScript中,通常window是全局对象,而Node.js的全局对象是global,所有全局变量都是global对象的属性,如:console、process等。
 
10、
原文地址:https://www.cnblogs.com/ecollab/p/7541457.html