Node.js
Node.js是一套用来编写高性能网络服务器的JavaScript工具包,基于 Javascript 作为前台的表现语言,它是服务器端的语言。
Node.js是一个可以快速构建网络服务及应用的平台。该平台的构建是基于Chrome's JavaScript runtime,也就是说,实际上它是对Google V8引擎(应用于Google Chrome浏览器)进行了封装。
V8引擎执行Javascript的速度非常快,性能非常好。Node对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。
Node.js 内建了HTTP服务器
Java - Tomcat, Node.js 不需要。
NodeJS 单线程
Node.js 中的JavaScript是在单线程上执行。在高并发请求中,单线程执行运算形成的瓶颈,拖慢了I/O的效率,无法很好利用多核CPU。
Node也提供了child_process.fork来创建Node的子进程。在一个Node进程就能很好的解决密集I/O的情况下,fork出来的其余Node子进程可以当作常驻服务来解决运算阻塞的问题(将运算分发到多个Node子进程中上去,与Apache创建多个子进程类似)。单线程可避免线程上下文切换带来的性能损失。
NodeJS 异步IO,事件驱动
Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理 —— Node.js是单线程的。它通过事件轮询(event loop)来实现并行操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
一般的程序调用都是执行一个命令之后,线程阻塞,一直等到命令成功之后,才会去执行下面的事情。NodeJS 所有的IO,网络通信,磁盘操作都是由事件来控制的,Nodejs 进程在同一时刻只会处理一个事件,完成后立即进入事件轮询并检查处理后面的事件。
NodeJS和CommonJS之间的关系
CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白。它的终极目标是提供一个类似Python,Ruby和Java标 准库。CommonJS是一种规范,NodeJS是这种规范的实现。
搭建 Node.js
1. http://nodejs.org/,下载 node-v0.10.22-x86.msi 并安装到 D:\nodejs。
2. 配置环境变量:D:\nodejs 添加到 PATH
3. cmd - 输入 node 命令
C:\Documents and Settings\Administrator>node > console.log("hello world") hello world > console.log(process.version) --Node.js版本 v0.10.22 > console.log(process.platform) --操作系统版本 win32 > console.log("Hi,%d.",2013) Hi,2013.
在 D 盘编辑 demo.js
var args = process.argv; for(var i=0;i<args.length;i++){ console.log("arg%d : %s",i,args[i]); }
在 cmd 执行 node 命令,结果为
D:\>node demo.js a=1 b=2 c=3 arg0 : node arg1 : D:\demo.js arg2 : a=1 arg3 : b=2 arg4 : c=3
对于 process.argv ,它的第一个参数永远是 node,第二个参数是文件的绝对路径,从第三个参数开始才是传的脚本参数。
process 模块提供的属性和方法非常多,返回程序的返回码:process.exit(1); 给特定的进程发送信号:process.kill(process.pid,'SIGTERM')
> process.pid 6692 > process.kill(6692,'SIGTERM')
4. NPM ( Node Package Manager )
在 windows 的安装包才不到10M,Node.js 拥有庞大的第三方软件库,通过 npm 可以 install、update、uninstall package,类似 Linux 的 rpm。
假设我们只知道包的关键字 socket,通过 npm 搜索包
D:\>npm find socket
通过以上命令显示一行行具体的包名和描述,找到你所要的包并安装。(-g 表示作为全局使用)
D:\>npm install -g socket.io
查看 socket.io 详细信息
D:\>npm info socket.io
NPM 解决了包之间的依赖关系,通过 package.json,在 npm info 命令查看了该模块的具体信息,显示长长的列表,内容就来源于package.json 文件。package.json 是一个JSON 格式的文本文件,它包含一些属性用于描述包的功能。package.json是每 个模块必须具有的,即每个模块开发人员在发布包的时候会手动创建这个文件。如 Json 格式中有 dependencies,说明该包有依赖于其它包。
3. Express
Express 是整个 Node.js 之中最为常见的一个框架(开发包),可以帮助我们快速构建一个WEB项目。(http://expressjs.com)
在 F 盘新建 nodejsdemo,cd nodejsdemo ,执行
npm install express
在 F:\nodejsdemo 下有了个 node_modules 目录,在当前目录新建 loadModeul.js
module.exports = require('express');
执行
F:\nodejsdemo>node loadjs.js
Node.js 的模块加载对开发者来说很简单,调用 require 即可,require 类似 Java 的 import 。
当require 加载的模块不是核心模块时或者不以路 径为参数,它就会以你脚本所在的路径为当前路径并试图寻找此路径下是否有一个叫做 node_modules 的目录,如果没有这个目录(node_modules),则往此目录的父目录中寻找。 反复执行这一过程,直到你的根目录,如果还没有就报错了。
加载自定义模块,创建 printf.js
console.log('maths pi'); var PI = 3.14; exports.perimeter = function (r){ return 2 * PI * r; }; exports.area = function (r){ return PI * r * r; };
修改 loadModeul.js,console.dir() 可显示一个对象所有的属性和方法。
var c = require('./printf.js'); console.dir(c.perimeter(5)); console.dir(c.area(5));
执行
F:\nodejsdemo>node loadModeul.js maths pi 31.400000000000002 78.5