接触Node.js有段时间了,估计跟大多数Web开发者一样,对Node.js有种自来熟的感觉。其实Node.js并不是第一个把JavaScript应用到服到服务端的,微软很早就在ASP中支持了JScript,但JSctrip并不包含prototype继承和闭包这两大核心内容。NodeJS与PHP一样是脚本语言,直接由C/C++编写的编绎器解释执行,性能上比任何需要虚拟机托管执行的高级语言都要快。不过个人感觉其单线程,事件驱动的特性并不太适合架设较为复杂的Web服务器,因为一但遭遇异常,服务就会中止,以后Tomcat可能会支持Node.JS,为每一个请求新建一个Node进程,增强其健壮性。
NodeJS因为其JS的语法特点所以拥有非常高的产出效率(语法简洁,{}即对象,[]即数组,虽然C#也引入了许多动态语言的特性如var/dynamic, 兰布达表示等,但在开发效率上比JS还稍差一些),而且Node绝对不会被过渡设计,因而性能是有保障的。总之个人认为Node.JS大有可能挑战php目前在Web架构中的统治地位(超过77%的网站、Alex排名靠前网站大多基于PHP)。下面是本人编写的一个简单静态文件服务器,除掉注释100行左右,调用非常简单,安装好Node.JS后在命令行输入:
node FileServer.js E:\ 8021
"E:\" 是需要浏览的目录(尚不支持带有空格的目录,Node框架会把空格当成变量分隔符,目前没有做特殊处理),8021是侦听的端口。这里还支持第三个参数,即是否开启全目录浏览,默认是关闭的,注意这种模式只适合浏览文件较少的目录。
node FileServer.js E:\ 8021 true
运行完以后,可以直接在浏览器输入网址浏览结果: http://localhost:8021代码分析: JS源码
//FileServer Namespace
var FileServer;(function(){
var fs = require("fs"),
path = require("path"); var server = FileServer = {
//Root path
dir: "C:\\Program Files",
从以上代码可以看出,JS是完全面向对象的,这里引用了Node.JS的全局对象fs和path。
var fileServer = Object.create(FileServer);
fileServer.init(process.argv[2], process.argv[3], process.argv[4]);
Object.create来自自ECMAScript5,这样FilerServer即可以作为单例来使用,又可以使用对象来继承,使用起来非常灵活。关于更多的ECMAScript5的用法可以参数我的另一篇博文: ECMAScript 5 用法
try{
stat = fs.statSync(fullPath)
}catch(err){
server.response.writeHead(404, {"Content-Type": "text/html"});
server.write("File not found!", err);
return;
}
因为同步处理的代码写起来比较简单,所以这里使用的都是Sync模式,但这种模式会抛出异常,所以有几处使用了try{}catch{}代码块。这个只是初稿,可能会有很多BUG,如果有时间的话会继续完善。源代码大家可以去这下下载: https://github.com/newghost/FileServer-Node.js
NodeJS因为其JS的语法特点所以拥有非常高的产出效率(语法简洁,{}即对象,[]即数组,虽然C#也引入了许多动态语言的特性如var/dynamic, 兰布达表示等,但在开发效率上比JS还稍差一些),而且Node绝对不会被过渡设计,因而性能是有保障的。总之个人认为Node.JS大有可能挑战php目前在Web架构中的统治地位(超过77%的网站、Alex排名靠前网站大多基于PHP)。下面是本人编写的一个简单静态文件服务器,除掉注释100行左右,调用非常简单,安装好Node.JS后在命令行输入:
node FileServer.js E:\ 8021
"E:\" 是需要浏览的目录(尚不支持带有空格的目录,Node框架会把空格当成变量分隔符,目前没有做特殊处理),8021是侦听的端口。这里还支持第三个参数,即是否开启全目录浏览,默认是关闭的,注意这种模式只适合浏览文件较少的目录。
node FileServer.js E:\ 8021 true
运行完以后,可以直接在浏览器输入网址浏览结果: http://localhost:8021代码分析: JS源码
//FileServer Namespace
var FileServer;(function(){
var fs = require("fs"),
path = require("path"); var server = FileServer = {
//Root path
dir: "C:\\Program Files",
从以上代码可以看出,JS是完全面向对象的,这里引用了Node.JS的全局对象fs和path。
var fileServer = Object.create(FileServer);
fileServer.init(process.argv[2], process.argv[3], process.argv[4]);
Object.create来自自ECMAScript5,这样FilerServer即可以作为单例来使用,又可以使用对象来继承,使用起来非常灵活。关于更多的ECMAScript5的用法可以参数我的另一篇博文: ECMAScript 5 用法
try{
stat = fs.statSync(fullPath)
}catch(err){
server.response.writeHead(404, {"Content-Type": "text/html"});
server.write("File not found!", err);
return;
}
因为同步处理的代码写起来比较简单,所以这里使用的都是Sync模式,但这种模式会抛出异常,所以有几处使用了try{}catch{}代码块。这个只是初稿,可能会有很多BUG,如果有时间的话会继续完善。源代码大家可以去这下下载: https://github.com/newghost/FileServer-Node.js
解决方案 »
- 几行ie下不兼容的代码,求大哥大姐指点...
- setInterval()的用法
- 用JavaScript做一个弹出窗口,只有关闭的窗口,而且固定大小
- JS 截取数据问T,,,,,
- 请教大虾们一个css的问题
- EXCEL?
- 看看这个按钮怎么无法执行location.href语句呢?
- cpplus(百合):<select id="select1" onChange="addItem()">如果是name而不是id怎么办?
- JqGrid插件的分页功能用到了woff文件,在IE8上识别不了
- 关闭弹出窗口的JavaScript事件冒泡捕获问题
- 风之石 下面为什么错了 var em= easyMask("adf", 200, 200, 2, "#112200", 50, false);
- UEStudio双击高亮显示选择的同类项
没想着实用,就是写着玩的,
异步:本来第一个版本是异步的,不过这样写出的代码会产生很多的闭包嵌套,代码有点不好看,而且做全目录递归的时候处理起来有些复杂,有时间会改成异步的,但可能不支持全目录浏览模式。
安全性:http://localhost:8021/../ : Winodws下测试过,没有发现有这个问题。
缓存过于复杂,以后可能会在全目录模式下加进去。