Node.js浅解

来源:互联网 发布:代码高亮java 编辑:程序博客网 时间:2024/06/07 16:27

    始于兴趣,一个月前接触了近来声名显赫的Node.js,随着使用和了解的深入,越来越觉得喜欢。想和只听过其概念的朋友分享所学皮毛,大牛请绕过,打搅!依个人理解,Node.js提供了一个编程环境,跟我们所熟知的Java,C++,C#,PHP等差不多,只是他的语言是简单的javascript,并且提供了大量的基础设施(如文件系统操作,网络通信,加密解密,模块管理,事件机制,Http等),社区也提供了大量的框架(NPM,Express, mongoose)。正如官网首页所述,它天生就是用来实现高效率的分布式网络应用。下面我们将简单的介绍几点。

   著名的Hello World


   遵循惯例,先实现Hello World.。Node.js的安装非常简单,Windows官网有安装程序,记得配置一下环境变量。新建一个javascript文件helloworld.js,敲下如下一行码: 

   console.log('Hello World'); 

    打开命令行,输入node helloworld即可看到控制台输出Hello World。没有编译,非常非常的简单。此处console是Node.js内置的一个命令行对象。


   非阻塞式编程+事件驱动

   事件驱动和非阻塞式编程是Node.js的核心。Node.js是单线程的,单个Node.js进程只有一个线程。该线程一直高效率的处理着当前所能够处理的命令,任何不能立即完成的任务返回结果时再通知线程继续处理返回逻辑,线程继续处理其它命令。一个比较典型的例子是对文件系统的访问,从开始访问到文件系统返回结果需要一段时间,普通的程序当前线程会挂起等待返回,返回之后再继续往下处理。Node.js线程不会等待返回,而是继续处理其它命令。判断文件是否存在的代码如下:

var fs = require('fs');    fs.exists('c:\nodejs\readme.txt', function(exist){if(exist){console.log('existed');}else{console.log('not existed');}});

    其中fs是Node.js提供的一个文件系统模块,线程在调用到fs.exists方法之后不等待文件系统返回,继续处理其它任务,等到文件系统有响应之后再调用匿名函数,Node.js才回来继续处理返回的处理逻辑。所谓的高效率正来源于此。虽然线程的切换没有进程那么大,但是还是要一定的开销的。另外单线程编程也避免了多线程编程的复杂易错问题。

   

   模块管理

   中型大型的项目都需要把代码分布到不同的文件以及文件夹下面,利于开发维护和测试。Node.js通过require和exports来实现。如官方文档里面的例子:

    circle.js

var PI = Math.PI;exports.area = function (r) {  return PI * r * r;};exports.circumference = function (r) {  return 2 * PI * r;};

    app.js

var circle = require('./circle.js');console.log( 'The area of a circle of radius 4 is '           + circle.area(4));

命令行输入node app即可看到结果。exports是一个内置的对象,require的时候会返回,上面的circle.js中为exports赋值了两个函数。值得一提的是exports自身也可以被赋值比如:

circle.js

var PI = Math.PI;exports = function (r) {  return PI * r * r;};

app.js

var circle = require('./circle.js');console.log( 'The area of a circle of radius 4 is '           + circle(4));

此时require返回的是一个函数,可以直接使用,这得益于javascript里面function是一等公民,可以作为参数传递。

    

    不可思议的Web服务器

    不需要tomcat, Httpd或者Nginx你也可以构建一个自己的高性能服务器。非常简单,官网首页就有一个例子,为了表示尊敬,我还是贴一下Hello World服务器。

    app.js

var http = require("http");http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); }).listen(8888);

  http也是Node.js的一个内置模块。命令行node  app, 浏览器输入localhost:8888查看Node.js web server返回的欢迎语句。


   学习资料推荐

 《The Node Beginner Book》 中文译名Node入门

  Node官网的Document,可以都写代码验证一下
  Express 一个非常出色的Node.js Web框架,写一个自己的Nodejs网站