node.js只在第一次运行时会读取文件内容,之后都会直接访问内存,也就是当文件实时改动时,不会触发从新编译文件内容,因此须要使用supervisor、pm2等工具,对node服务进行实时管理php
什么是阻塞(block)呢?线程在执行中若是遇到磁盘读写或网络通讯(统称为 I/O 操做), 一般要耗费较长的时间,这时操做系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同 时将资源让给其余的工做线程,这种线程调度方式称为 阻塞。当 I/O 操做完毕时,操做系统 将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种 I/O 模式就是通 常的同步式 I/O(Synchronous I/O)或阻塞式 I/O (Blocking I/O)node
异步式 I/O (Asynchronous I/O)或非阻塞式 I/O (Non-blocking I/O)则针对 全部 I/O 操做不采用阻塞的策略。当线程遇到 I/O 操做时,不会以阻塞的方式等待 I/O 操做 的完成或数据的返回,而只是将 I/O 请求发送给操做系统,继续执行下一条语句。当操做 系统完成 I/O 操做时,以事件的形式通知执行 I/O 操做的线程,线程会在特定时候处理这个 事件。为了处理异步 I/O,线程必须有事件循环,不断地检查有没有未处理的事件,依次予 以处理。c++
对于须要长时间计算的I/O处理操做web
多线程模式:若是想实现高并发,就必须开启多个线程 shell
单线程模式:I/O异步,经过事件方式通知线程,便可完成高并发 express
单线程事件驱动的异步式 I/O 比传统的多线程阻塞式 I/O 究竟好在哪里呢?npm
Node.js 程序由事件循环开始,到事件循环结束,全部的逻辑都是事件的回调函数,因此 Node.js 始终在事件循环中,程序入口就是 事件循环第一个事件的回调函数。事件的回调函数在执行的过程当中,可能会发出 I/O 请求或 直接发射(emit)事件,执行完毕后再返回事件循环,事件循环会检查事件队列中有没有未 处理的事件,直到程序结束.编程
与其余语言不一样的是,Node.js 没有显式的事件循环,相似 Ruby 的 EventMachine::run() 的函数在 Node.js中是不存在的。Node.js的事件循环对开发者不可见,由libev库实现。libev支持多种类型的事件,如 ev_io、ev_timer、ev_signal、ev_idle 等,在 Node.js 中均被 EventEmitter 封装。libev 事件循环的每一次迭代,在 Node.js 中就是一次 Tick,libev 不 断检查是否有活动的、可供检测的事件监听器,直到检测不到时才退出事件循环,进程结束json
Node.js 根 据 CommonJS 规范实现了包机制,开发了 npm来解决包的发布和获取需求。 使用以下命令初始化建立npm包数组
npm init
复制代码
Node.js 的包是一个目录,其中包含一个 JSON 格式的包说明文件 package.json。严格符 合 CommonJS 规范的包应该具有如下特征:
全局模式的安装:
npm [install/i] -g [package_name]
为何要使用全局模式呢?多数时候并非由于许多程序都有可能用到它,为了减小多 重副本而使用全局模式,而是由于本地模式不会注册 PATH 环境变量。举例说明,咱们安装 supervisor 是为了在命令行中运行它,譬如直接运行 supervisor script.js,这时就须要在 PATH 环境变量中注册 supervisor。npm 本地模式仅仅是把包安装到 node_modules 子目录下,其中 的 bin 目录没有包含在 PATH 环境变量中,不能直接在命令行中调用。而当咱们使用全局模 式安装时,npm 会将包安装到系统目录,譬如 /usr/local/lib/node_modules/,同时 package.json 文 件中 bin 字段包含的文件会被连接到 /usr/local/bin/。/usr/local/bin/ 是在PATH 环境变量中默认 定义的,所以就能够直接在命令行中运行 supervisor script.js命令了
使用全局模式安装的包并不能直接在 JavaScript 文件中用 require 获 得,由于 require 不会搜索 /usr/local/lib/node_modules/
npm 提供了一个有趣的命令 npm link,它的功能是在本地包和全局包之间建立符号链 接。咱们说过使用全局模式安装的包不能直接经过 require 使用,但经过 npm link命令 能够打破这一限制。举个例子,咱们已经经过 npm install -g express 安装了 express, 5 这时在工程的目录下运行命令: npm link express ./node_modules/express -> /usr/local/lib/node_modules/express 咱们能够在 node_modules 子目录中发现一个指向安装到全局的包的符号连接。经过这种方法,咱们就能够把全局包当本地包来使用了
除了将全局的包连接到本地之外,使用 npm link命令还能够将本地的包连接到全局。 使用方法是在包目录( package.json 所在目录)中运行 npm link 命令。若是咱们要开发 一个包,利用这种方法能够很是方便地在不一样的工程间进行调试和测试
如今有两个模块,npm-link-module为咱们开发的npm包;npm-link-test为咱们要使用上面的npm包来作测试
cd npm-link-module //进入开发的npm包目录里
npm link //将本地的包连接到全局
cd npm-link-test //进入到测试项目中
npm link npm-link-module //将全局包npm-link-module 连接到本地node_modules路径下,这样本地就可使用require()引用了
复制代码
使用node debug xxx.js 便可开启调试模式