`
sammor
  • 浏览: 414102 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

NodeJS初探之一——神秘的服务器端JS

阅读更多

 

什么是NodeJS?

       第一次看到这个名字,是我在报名淘宝的知识分享时看到的,我很兴奋也很好奇这样的一个JS框架。而你看到这个名字的第一个反应会是什么,是否和我一样的简单的以为它就是一个JS框架?反正我是这么认为了。如果你也是,哈哈,看来也是和我一样单纯。

       在去听分享前,我特意google了相关资料来了解,不禁使我吓一大跳,或许是我刚出校园,视野太窄,远没有想过JS脚本从可以从客户端的浏览器转移到了 服务器上。当然,我不是很明白,这样做达到了一个什么样的好处。


简单地说,NodeJS是一个使用了Google高性能V8 引擎 的服务器端JavaScript实现。它提供了一个(几乎)完全非阻塞I/O栈,与JavaScript提供的闭包和匿名函数相结合,使之成为编写高吞吐 量网络服务程序的优秀平台。
特点:
* 单线程事件模型,简单高效
* 基于活跃的高性能V8引擎
* 社区活跃,组件丰富

 

或许,这一大炮又让前端开发人员又掀起一阵高浪。 在听完淘宝之后的分享,以及之后在网上相关的准备的查询,我才知识,NodeJS正在稍无声息的壮大起了了,一群活跃的开发人员,正在喂养这个出世不久的 孩子,这或许将是继日本海啸的后浪。

 

 

不信?好吧,看看下面的这些:


http://nodejs.org/ 官网
https://github.com/joyent/node/wiki wiki
http://cnodejs.org/ 淘宝的工程师志愿发起的原创社区
http://www.grati.org/?cat=35 一个国内灰常活跃的社区
http://wiki.grati.org/index.php?title=NodeJS%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3 官方文档翻译wiki
引自:cnodejs.org
 官方网站: http://nodejs.org/
 英文文档: http://nodejs.org/docs/v0.3.5/api/all.html
 node包管理器: http://npmjs.org/
 官方介绍: http://nodejs.org/jsconf2010.pdf
 Node的模块大全,必阅读: https://github.com/ry/node/wiki/modules
 一个Node入门网站: http://howtonode.org
 一个不错的Node博客: http://blog.nodejitsu.com/
 包含了不少node信息的前端blog: http://dailyjs.com/
 一个48小时NodeJS的竞赛网站: http://nodeknockout.com/

 

 

NodeJS 安装(安装环境ubuntu10.04):


   1、先从官网上(http://nodejs.org/)下载源码,这边我所下的是 node-v0.4.3.tar.gz 版本的包。


$ tar   -zxvf  node-v0.4.2.tar.gz
$ cd   node-v0.4.2
   

    2、接下来进行安装

$ ./configure
$ make
$ sudo make install
   

    3、安装npm(NodeJS Package Manager NodeJS的包管理器)

     相关介绍文章:http://howtonode.org/introduction-to-npm

    

  安装命令为:          

  (注意出错时请检查是不是以root用户进行安装)

curl http://npmjs.org/install.sh | sh
    


    4、 配置环境变量,在这里,我所安装的路径为~$ cd /var/iapps/nodejs/

sudo export PATH=$PATH:/var/iapps/nodejs/bin

 

 查看是否安装成功:

sammor@sammor-desktop:~$ cd /
sammor@sammor-desktop:/$ node --version
v0.4.2

 

     如此便成功安装了NodeJS

 

NodeJS ——Hello,World!

 

  准备脚本:

//helloworld.js
var sys = require("sys"),  
     http = require("http");  
     http.createServer(function(req, res) {  
     setTimeout(function () {
             res.writeHeader(200, {"Content-Type": "text/plain"});
             res.write("Hello,World!");
             res.finish();
         }, 2000);
     }).listen(8000);
 sys.puts("Server running at http://localhost:8000/");  
     

  执行脚本:

root@sammor-desktop:/var/iapps/nodejs/work# node helloworld.js 
Server running at http://localhost:8000/
   

  这时浏览器上访问 http://localhost:8000/

    就可以在页面上看到期待的效果:

Hello,World!
   

   这就是NodeJS的Hello,World! 神奇吧。

 

问题

    在这里,我只想起个引子,让大家更多的知道这个东西。因为我觉得,这或许对于前端来说是一个很大的惊喜,但对于不善于前端的我来说了开始疑惑了,也许很多人也一样在想着,这样的东西,适用于什么样的场景下?相对于传统的服务端方式来说,它又有什么优势呢?后面有一篇关于我问分享的讲师的一些问题,大家可以看看 NodeJS初探之三——新星的力量

 

 

NodeJS的应用

 

NodeJS初探之二——与Mysql的交互

NodeJS初探之三——新星的力量


 

 

分享到:
评论
25 楼 ray_linn 2011-03-25  
tapestry1122 写道
Army 写道
nodejs直接操作mongodb?这听着的确挺震撼,抽空看看。


这样直接用javascript就可以完成一个完整web应用了


有傻震撼的,mongodb的mongo shell就是嵌入了javascript引擎写的
24 楼 tapestry1122 2011-03-24  
Army 写道
nodejs直接操作mongodb?这听着的确挺震撼,抽空看看。


这样直接用javascript就可以完成一个完整web应用了
23 楼 qiaolu 2011-03-24  
把JS用在服务器端,05年一直到现在我都是这样做的,优点就是开发速度快,扩展容易。
缺点就是调试不好调试。
下面是代码展现。每个function 类似与struts中的Action。view层借鉴了ruby
每个服务器端JS文件对应一个目录,每个JS中的function对应一个view文件。view层用velocity。


require("pms/maputil.vega");
map = function(){
	var form = vega.getForm();
	var sql = "select * from v_pms_geoinfo WHERE GEO_CODE=?";
	var geo = vega.db.queryForMap(sql,form.GEO_CODE);
	sql = "select * from v_pms_geo_project where x is not null and y is not null AND (PROJECT_GEO_CODE='"+geo.GEO_CODE+"' OR GEO_PATH like '"+geo.GEO_PATH+":"+geo.GEO_CODE+"%')";
	var projects = vega.db.queryForList(sql);
	vega.saveValue({projects:projects,geo:geo});
}
listProject = function(){
	var form = vega.getForm();
	vega.log.info(form);
	var sql = "select * from v_pms_geo_project";
	if(form.sort){
		sql = sql + " order by " +form.sort +" " + form.dir; 
	}
	var where = form.getString("where");
	if(where ==""){
		where = " 1 = 1"
	}
	where = "("+where + ") and (x is null and y is null) and (PROJECT_GEO_CODE='"+form.GEO_CODE+"' OR GEO_PATH like '"+form.GEO_PATH+":"+form.GEO_CODE+"%')"
	var result = vega.db.query(sql,where,form.getInteger("start",0),form.getInteger("limit",20));
	vega.sendJSON({totalCount:result.page.rows,records:result.result});
}
updateProjectXY = function(){
	try{
		var form = vega.getForm();
		var sql = "update PMS_PROJECT set x = ?, y=? where PROJECT_ID=?";
		vega.db.update(sql,form.X,form.Y,form.PROJECT_ID);
	}catch(e){vega.sendErrorJSON({error:e.message});}
	vega.sendJSON({success:true});
}
removeProjectXY = function(){
	try{
		var form = vega.getForm();
		var sql = "update PMS_PROJECT set x = null, y=null where PROJECT_ID=?";
		vega.db.update(sql,form.PROJECT_ID);
	}catch(e){vega.sendErrorJSON({error:e.message});}
	vega.sendJSON({success:true});
}
22 楼 凯旋人生 2011-03-24  
这个主题我喜欢哈哈,昨天刚好搞了搞不错,不错。
21 楼 Army 2011-03-24  
nodejs直接操作mongodb?这听着的确挺震撼,抽空看看。
20 楼 tapestry1122 2011-03-24  
greatghoul 写道
js确实是强大的东东呀,不知道这nodejs有没有什么比较成熟的应用。

plurk应用了
他们将一个netty3开发的comte server迁移到nodejs上来了
内存消耗降低了10倍
日本有一个做社交游戏的公司,做法就更激进了
基于nodejs+mongodb开发了社交游戏,nodejs直接操作mongodb
19 楼 sammor 2011-03-22  
uin57 写道
sammor 写道
uin57 写道
如果这东西能够和其他应用服务器很方便的结合,我倒是愿意试试,在进行一些快速demo开发的的时候很有优势.
不过令人头疼的是js的调试一直都是很头痛的,不是麽?

NodeJS 可支持调试的,感觉用起来还行。

我现在一直在官网的demo聊天室里挂着,看看内存控制怎么样...

哦, 怎么样挂着看内存控制呢?
18 楼 sammor 2011-03-22  
danielking 写道
Army 写道
作为一名前端,我其实也不赞成js写后端,至多js写写表层的业务逻辑即可。


别把思维固定在传统web了
我开始也是觉得无所谓,最近仔细研究了下才发现如获至宝


是我,我一开始写觉得很不习惯,但在学习的过程中,感觉也开始慢慢有点适应了,也感觉到了它的强大。
17 楼 danielking 2011-03-22  
Army 写道
作为一名前端,我其实也不赞成js写后端,至多js写写表层的业务逻辑即可。


别把思维固定在传统web了
我开始也是觉得无所谓,最近仔细研究了下才发现如获至宝
16 楼 Army 2011-03-22  
作为一名前端,我其实也不赞成js写后端,至多js写写表层的业务逻辑即可。
15 楼 danielking 2011-03-22  
ray_linn 写道
用例子看过来不就是ASP吗?ASP也可以用javascript来写


和asp的模式完全不一样的
nodejs基于非阻塞和事件,并发性很强大


最近又看到了nowjs,如获至宝。nodejs的一个很简单的模块,但是相当强大,http://nowjs.com(可能被盾了)。浏览器和服务器之间通过websocket(ie上貌似通过flash,我试了ie9可以,678还不行)通信,用非阻塞的方式执行对方的js函数。


14 楼 uin57 2011-03-22  
sammor 写道
uin57 写道
如果这东西能够和其他应用服务器很方便的结合,我倒是愿意试试,在进行一些快速demo开发的的时候很有优势.
不过令人头疼的是js的调试一直都是很头痛的,不是麽?

NodeJS 可支持调试的,感觉用起来还行。

我现在一直在官网的demo聊天室里挂着,看看内存控制怎么样...
13 楼 sammor 2011-03-22  
uin57 写道
如果这东西能够和其他应用服务器很方便的结合,我倒是愿意试试,在进行一些快速demo开发的的时候很有优势.
不过令人头疼的是js的调试一直都是很头痛的,不是麽?

NodeJS 可支持调试的,感觉用起来还行。
12 楼 sammor 2011-03-22  
greatghoul 写道
js确实是强大的东东呀,不知道这nodejs有没有什么比较成熟的应用。

现在nodejs已经支持的越来越多的组件应用,添加速度很快。你可以看看这里的链接地址。https://github.com/joyent/node/wiki/modules
11 楼 semmy 2011-03-22  
clue 写道
semmy 写道
这个东西好像去年还是前年就有了。。。哎,js还在前端用用吧。。服务端已经够多够乱的,,别趟浑水。服务端,JS伤不起的

好像大家对JS的印象都是杂、乱、不易维护、性能低下。其实,那是因为你还没有深入了解过这门语言。如果你能像C程序员那样了解C、Java程序员那样了解Java那样了解它,就不会写出自己都不知道会怎么样运行的代码。
当你使用习惯后,就会发觉它的优势有多大了。

不了解一门语言就不要轻易下结论

嗯,个人觉得JS最强大的地方还是在于:函数即对象(设置回调注册事件十分方便)、单线程(事件驱动,同样可以处理多任务,并且没有多线程同步的烦恼)

你好像没有看清楚的我的回答,我并没有说JS乱,不易维护。JS在客户端是有明显的优势的,个人感觉它不并适合在服务端发展,我说的杂乱是服务端的语言:java、PHP、.net.......所以我说的是JS在服务端并不会得到发展,我的JS经验确实不是非常丰富,但个人觉得也不差。在工作中,也对JS进行封装过库,完全可以利用JS的原型做到面向对象的处理,比如继承、多态。所以JS在客户端是非常强大的。
10 楼 uin57 2011-03-22  
如果这东西能够和其他应用服务器很方便的结合,我倒是愿意试试,在进行一些快速demo开发的的时候很有优势.
不过令人头疼的是js的调试一直都是很头痛的,不是麽?
9 楼 lipengyu2006 2011-03-22  
tsoukw 写道
windows上不能跑?

如果想玩儿玩儿的话 可以装个Cygwin
8 楼 clue 2011-03-22  
ray_linn 写道
用例子看过来不就是ASP吗?ASP也可以用javascript来写

对ASP不太了解,但应该是在服务端用JScript解释器执行的。
但ASP中,每个页面是独立的程序,运行完就释放了。

而NodeJS,它并不局限于网页输出(类似asp, php等),它是全新的服务端JavaScript环境。
比如例子中的hello world,是创建一个http监听器,传入一个函数作为回调。当有访问此端口时自动执行回调。
它是完整的JS程序,从端口监听到处理数据都是自己处理。

你可以拿它写个刷点击的机器人:
var count = 0;
var runTask = function(){
   var requestObject = http.get({
      host : "clue.iteye.com",
      port: 80,
      path: '/'
   }, delayRunTask);
   requestObject.on("error", delayRunTask); // 出错时仍继续
   count++;
   console.log('第'+count+'次请求');
};

var delayTimer = null, delay = 1000; // 请求间隔1秒
var delayRunTask = function(){ 
   if(delayTimer){ // 保证永远只有1个定时器在等待
      clearTimeout(delayTimer);
      delayTimer = null;
   }
   delayTimer = setTimeout(runTask, delay);
}

delayRunTask();


当然,上面的代码中把delayRunTask直接换成runTask也没问题,只不过没有间隔,“有可能”会请求失控(当runTask被错误的多次调用,形成多个请求链)
看,多简单
7 楼 clue 2011-03-22  
很多人对JS的印象都是杂、乱、不易维护、性能低下。其实,那是因为你还没有深入了解过这门语言。如果你能像C程序员那样了解C、Java程序员那样了解Java那样了解它,就不会写出自己都不知道会怎么样运行的代码。
当你使用习惯后,就会发觉它的优势有多大了。

嗯,个人觉得JS最强大的地方还是在于:函数即对象(设置回调注册事件十分方便)、单线程(事件驱动,同样可以处理多任务,并且没有多线程同步的烦恼)

------------
重新编辑,之前言论过于武断
6 楼 ray_linn 2011-03-22  
用例子看过来不就是ASP吗?ASP也可以用javascript来写

相关推荐

Global site tag (gtag.js) - Google Analytics