- 浏览: 100182 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xwpxcom:
Springmvc学习笔记一(maven项目创建与配置) -
leaow567:
表达不严谨“用户自定义的ClassLoader有ExtClas ...
openfire源码解读第一节----ClassLoader的认识与理解 -
leaow567:
顶起!一起学习
openfire源码解读第一节----ClassLoader的认识与理解 -
xs.cctv:
信科
Springmvc学习笔记一(maven项目创建与配置) -
ywbrj042:
我们也在用这个,也在看openfire的源代码。以后可以一起交 ...
openfire源码解读第一节----ClassLoader的认识与理解
Node.js是一套用来编写高性能网络服务器的Java
Script工具包,一系列的变化由此开始。
也许你还不知道,JavaScript现在已经成了一门可编写出效率极高的、可用于开发产品级web服务器的出色语言。起初我也不相信,但2009年启动的两个项目让这成为可能:CommonJS
和
Node
。
尽管JavaScript已经出现很长一段时间了,运用也很广泛(可以说是这一星球上最常用的编程语言),但它一直只是局限在浏览器的范围内。与此同时,一些框架试图将JavaScript引入到服务器端,这些框架有Aptana Jaxer
,(采用了SpiderMonkey的
JavaScript解释器)和Helma
(基于Rhino),但自身的不足又制约着它们的普及。
技术生态圈
当我们选择某种技术编写应用程序时,我们不只是选择编程语言,还同时选择了其相应的库文件。如果一种语言有一个活跃的社区以及大量可用的库,那么你很容易用更短的时间编写出你的应用程序。
所有的现代编程语言都有一个标准库以及一个优秀的第三方代码库组成的技术生态圈(ecosystem)。Python是一种众所周知的以batteries
included"为特色的语言,而且有一个优秀的软件包生态圈形成的Python Package Index
(PyPI),Ruby和Perl也是这样的。不幸的是,JavaScript却并非如此。
直到最近,你才能在没有SpiderMonkey, V8,
或
JavaScriptCore这些JavaScript解释器的情况下,运行服务端的JavaScript代码。但是没有库的支持,你就无法多快好省地做出什么实际的东西来。
不过,在2009年JavaScript社区就意识到需要作出一些改变了。Kevin
Dangoor在他的博客
中说,虽然JavaScript是一种很通行的语言,但却没有形成标准的库API,也没有对外部库进行打包和制定统一的调用方法。由于没有通用的API,每个服务端的JavaScript项目不得不各自为政,这不利于跨项目的库和工具形成一个更庞杂的JavaScript生态圈。
因此Dangoor启动了ServerJS项目。其宗旨是制定一个大型的、可兼容的JavaScript生态圈所需的API。推出一周后内,ServerJS小组就有了224名成员,邮件列表
里也有了653条信息。显然,Dangoor已经引起了开发人员的注意。该项目后来改名CommonJS,以更好地反映其团结JavaScript社区、为浏览器端和服务器端制定统一API的这一伟大目标。
同时,也是在2009年,Ryan
Dahl还启动了一个名叫Node的JavaScript全新框架。Node又名Node.js或Nodejs,后面这两个名称更易于搜索。Node包含了Google的V8
解释器,并将其与CommonJS的库文件API捆绑起来,形成了一个可以不依赖浏览器而使用的完整环境。
在2009年,还有第三件关于JavaScript的事值得引得人们的注意。那就是以JavaScript为议题的会议开始出现。Chris
Williams 和 Iterative Designs
创立了JSConf,这是JavaScript开发者的第一个专业会议。
突破性的演讲
虽然Dahl在2009年初就启动了Node项目,但是它真正出彩是在11月的柏林JSConf上,Dahl作了一个关于它的演讲。从那以后,web开发人员对Node的关注明显增加,其关注度还在不断攀升。在这两次JSConf中,Dahl是唯一一位在演说结束后享受到起立鼓掌的发言人。在满堂的同行们面前展示最新的技术,这无疑是令人兴奋不已的事情。
由于服务器上的JavaScript已经说了多年了,你可能很想知道Node究竟有什么大不了的。是什么让它如此特别?这是因为使用Node编程,自始至终专注的是事件驱动I/O。
一般说来,实现高性能的服务器主要有以下三种编写方式:
1.
使用多进程
2. 或者使用多线程
3.
使用单线程异步事件
Node是一个以事件为基础的框架,并恪守非阻塞API的策略。
在 Java, C#, Perl, Python,
Ruby或是 PHP
这些语言中,使用多进程或多线程程序是一种更为通行、也更传统的方式。虽然用这些语言也可以实现基于事件的编程,但却不符合这些语言的习惯。(Twisted或Tornado是基于事件的Python框架,Ruby里则有EventMachine)
实例
虽然在其它语言中,基于事件的编程是一种不太常见的风格,但却是编写面向浏览器JavaScript代码的首要方式,Node就沿袭了这一传统。不论是写面向浏览器的代码还是用Node写服务端代码,都可以用事件的编程方式来实现。
例如,下面是jQuery的文档
中所介绍的如何发起一个异步(即Ajax)数据请求:
- $.get(ajax/test.html, function(data) {
- $(.result).html(data);
- alert(Load was performed.);
- });
在Node中编写的基于事件的程序又是什么样子呢?以下是Dahl在JSConf演示的代码段:
- db.query("select..", function (result) {
- // use result
- });
在这个例子中,完成了一个数据库
查询,而同时也附上了一个回调函数。当数据库返回结果时,回调函数将会被执行。代码块通过事件相联系。如果没有数据库事件被触发,该程序可以运行其它代码,处理其它事件。
与之相对照,用普通的处理方式,这就得写成这样:
- var result = db.query("select * from T");
- // use result
普通的处理方式中存在的问题
是:在等待数据库返回结果时,整个程序都被阻塞了,什么事都做不了。解决这一问题的传统办法是把数据库调用放到另外一个单独的线程或进程中。而Dahl在JSConf上介绍说,这种基于事件的模型更能有效的利用CPU和内存,同时其可扩展性也更好。与多进程或者多线程程序相比,基于事件的框架可以事半功倍。
Node入门
下面是试用最新版Node最简单的方法。
$
git clone git://github.com/ry/node.git
$ cd node
$ ./configure
$
make
$ sudo make install
$
node-repl
比较独特的是,Node.js会假设你是在POSIX环境下运行它Linux
或 Mac OS
X。如果你是在Windows
下,那就需要安装MinGW以获得一个仿POSIX的环境。
在Node中,Http是首要的。Node为创建http服务器作了优化,所以你在网上看到的大部分示例和库都是集中在web上(http框架、模板库等)。
下面是一个简单的hello
worldWeb服务器:
- var sys = require(sys),
- http = require(http);
- server = http.createServer(function (req, res) {
- res.writeHeader(200, {Content-Type: text/plain});
- res.write(Hello World);
- res.close();
- })
- server.listen(8000);
- sys.puts(Server running at a href="http://127.0.0.1:8000/);
让我们分别来看这段代码的各个部分:
- var sys = require(sys),
- http = require(http);
这就是CommonJS API导入的地方。require函数是导入模块的标准方式。在CommonJS出现之前,JavaScript程序员得使用类似于Python中的import语句或是Ruby中的require一样导入代码包。
- server = http.createServer(function (req, res) {
- res.writeHeader(200, {Content-Type: text/plain});
- res.write(Hello World);
- res.close();
- })
createServer函数需要设置一个回调函数,以便每次有新的请求到来时回调函数都会运行。
以下是如何运行该Web服务器示例:
$
node hello-world.js
Server running at a href="http://127.0.0.1:8000/
即使是只用这么少量的代码,Node都能快速地部署一个真正的服务器。如果要测试服务器的性能,Apache
Bench是一个优秀的负载测试小工具。在我的MacBook Pro(3.0 GHz Intel Core 2 Duo 以及4GB 1067 MHz
内存)上,这就是"hello world"服务器在每次4个请求、总共10,000个请求下的表现:
$ ab -c 4 -n 10000 a
href="http://127.0.0.1:8000/
...
Requests per second:
6560.50 [#/sec]
(mean)
...
当然,大多数的基准测试数据都不可信。上面的这个数据尤甚,因为它是在一台笔记本电脑上运行的,而不是通过一个真正的网络。然而,对每秒6560次请求进行处理,这并没有什么可笑之处。V8是一个强大快速的JavaScript解释器,Node又进一步对它进行了改进,让它成为一个引人注目的、可用于构建服务器的平台。
那么,它有什么缺陷吗?
由于Node刚问世不久,Rails和Django
认为有一些特性还不完备,这是理所当然的。在开发过程中,有一个很小、但是却很重要的特性还没实现,那就是在服务器的源代码改动之后自动重启服务器。其它的一些功能,像步进调试器(step-debugger)和REPL交互提示都已经可用并且很管用,但这跟Python和Ruby中的相应工具比较起来还是稍显粗糙。
在Node的代码库中正在发生许多变动,各个版本的核心API也会不同。当然,这些变化会让API更一致,所以我也不会埋怨什么。Node的开发速度让人想起了Ruby
on
Rails的初期,大量的创意付诸实施,一个星期不关注,你就会发现很多东西都改变了。这就是这个项目最好的、也是最不好的地方。更多的眼球关注会让更多的bug得到修复,新功能也将更快地得以实现,这是好事;但坏处就是你得努力跟上它的变化。
直到不久前,用JavaScript编写服务器软件还是一个梦想。在Node出现之前,有许多更好,更快的技术可供选择。但现在,情况已经改变了,Node参与到竞争中来了,并且是你下一个服务器软件开发语言选项中的有力竞争者。
发表评论
-
文本框只允许输入中文
2012-05-26 18:35 1025群友写的 顺手牵羊 保存了 只能输入中文:<in ... -
最新的qq号的验证
2012-05-18 22:43 700!/^[1-9]\d{4,9}$/.test("45 ... -
javaScript设计模式中的掺元类
2012-04-22 10:01 1336今天虽然周末但是没有撒懒,因为媳妇要上班所以我得送她下去,一方 ... -
JS递归将字符串中的字符替换为目标字符
2011-04-06 21:43 930//repStr:原字符串--rgExp:被替换的字符-- ... -
浮点计算方法
2011-01-20 12:57 893//浮点数加法运算 function FloatAdd(a ... -
JavaScript使用技巧精萃
2011-01-15 17:23 819(一).确认删除用法: 1. BtnDel.A ... -
JavaScript判断是否为数组
2011-01-15 17:17 829判断一个对象是否为数组比较麻烦,以下是我收集的各种版本 Do ... -
JavaScript通用的加入收藏夹代码
2011-01-15 17:15 1060<script type="text/jav ... -
jQuery对下拉框、单选框、多选框的处理
2011-01-15 17:13 1105下拉框: //得到 ... -
Firefox和IE之间7个JavaScript的差异
2011-01-15 17:12 684尽管 Java Script 历史上使用冗长而令人生厌的 ... -
JavaScript语法中12个需要绕开的陷阱
2011-01-15 17:10 7021. == Java script有两组 ... -
JavaScript类和继承:this属性
2011-01-15 17:04 768this属性表示当前对象,如果在全局作用范围内使用thi ... -
JavaScript类和继承:prototype属性
2011-01-15 17:03 726我们已经在第一章中使用prototype属性模拟类和继承的实现 ... -
JavaScript类和继承:constructor属性
2011-01-15 17:02 655constructor属性始终指向创建当前对象的构造函数。比 ... -
浅析Javascript闭包的特性
2011-01-15 17:01 677Java script闭包的定义非常晦涩——闭包,是指语法域 ... -
浅谈不用Cookie实现高亮Javascript菜单效果
2011-01-15 17:00 952笔者经常采用的高亮Java script菜单效果设计方式,一 ... -
10个最常用的JavaScript自定义函数
2011-01-15 16:57 929Java Script自定义函数在平时的开发过程中比较实用, ... -
详解JavaScript中的Array扩展
2011-01-15 16:54 694Java script中的Array扩展,一般都是从 ... -
JavaScript常用的2种定义类的方式
2011-01-15 16:51 6331. 混合构造函数/原型方式 functio ... -
使用jQuery制作滑动动画效果的层
2011-01-15 16:43 757基本原理 这些具有动态效果的滑动盒都基于同样的基本原理。 ...
相关推荐
JavaScript脚本语言基础
JavaScript语言基础 JavaScript程序流程控制语句 JavaScript函数和事件处理程序 HTML文档对象模型 JavaScript内置的常用对象 用JavaScript脚本对HTML数据的的验证
JavaScript脚本语言实现用户注册页面
里面包含了两套: 1,asp帮助文档 2,javascript脚本以及本人总结的一些不错的脚本
PHP 是一种广泛应用于 Web 开发的服务器端脚本语言
微信网页页面+微信完整项目+html5手机移动端自适应页面+javascript脚本插件+微信支付+前后端开发
NULL 博文链接:https://williamwhj.iteye.com/blog/2032655
基于Web服务器脚本语言的基本特点及研究现状,对目前发展较成熟的ASP,JSP,PHP和Cold Fusion等服务器端脚本语言进行了详细比较,并深入分析了Cold Fusion脚本语言的Web开发,旨在探寻脚本语言在Web开发方面的应用...
nodejs 服务器端的JavaScript脚本(node.js).zip
JavaScript脚本大全,各种JavaScript脚本开发
javascript基础、流程控件语句与函数,数据验证方法。 课件PPT加文档加实例
这个程序可以打开网页,进而找出网页中的javascript脚本,提取出来,然后测试脚本功能。
* 在Java中使用脚本语言JavaScript。 * * @author LeiWen@FansUnion.cn,http://FansUnion.cn, * http://blog.csdn.net/FansUnion * * QQ:240370818 参考资料:...
JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。Javascript提供了丰富的运算功能,...
从零开始学习各种脚本语言,提高编程能力,主要是vbs和JavaScript语言,希望对大家有所帮助
Perl的实际应用,如何自动化下载服务器端数据到本地。
javascript基础教程第六版,脚本及页面
服务器端jar启动脚本
使用javascript脚本向页面中的table添加和删除行
C# 动态解析 javascript 脚本引擎源码