Node.js应用之静态文件分发器

我不久之前翻译过一篇文章:

asp.net使用httphandler打包多CSS或JS文件以加快页面加载速度

采用打包并压缩和在浏览器与客户端同时构建缓存的技术,来对页面的加载进行优化。最近在学习Node.js,下面我们来看看Node.js在这方面能做些什么。

Node.js的优势是网络通信、I/O不阻塞,可见它是高并发需求的有效解决方案。在Web开发中有许多文件是静态文件,例如CSS文件、JS文件。对它们的请求,通常是页面加载到客户端后,浏览器重新发出的异步请求。通常Web服务器能处理的并发请求是有限的,对于大的应用来讲,动态页面的并发请求可能已经足够多了。何不利用好Node.js的服务端优势,给Web服务器减轻一点负担呢?

下面,我通过测试来,验证该方案是否可行。

首先,我们构建网站(asp.net)。

文件列表:


一个测试页面


Default.aspx


一个样式表文件


StyleSheet.css


一个Javascript文件


Jscript.js(实现动态改变节点文本内容

页面内容:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <!--通常的请求方式-->
    <link rel="Stylesheet" href="StyleSheet.css" />
    <script type="text/javascript" src="JScript.js"></script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <p class="a">This is a test Page.</p>
        <p class="b" id="hw">Hello world!</p>
        <input type="button" id="testBtn" onclick="test.change();" value="change innerText" />
    </div>
    </form>
</body>
</html>

上面是我们通常的做法,这些请求通常也是被Web服务器首先接管,然后进一步处理(这里不做讨论)。

运行效果:

CSS效果:

JS效果,点击按钮之后:

点击按钮,可以切换第二个P标签内容(这里也主要是说明JS文件是有效并能被访问的)

而,采用Node.js我们就可以不必将这些静态文件的请求交给Web服务器来处理,可以让其交给另外一个Node.js创建的http服务器来处理(通过将请求该Http服务器正在监听的那个端口)。

采用Node.js文件的请求方式:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <!--通常的请求方式-->
    <%--<link rel="Stylesheet" href="StyleSheet.css" />
    <script type="text/javascript" src="JScript.js"></script>--%>

    <!--Node.js的请求方式-->
    <link rel="Stylesheet" href="http://localhost:8080/StyleSheet.css" />
    <script type="text/javascript" src="http://localhost:8080/JScript.js"></script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <p class="a">This is a test Page.</p>
        <p class="b" id="hw">Hello world!</p>
        <input type="button" id="testBtn" onclick="test.change();" value="change innerText" />
    </div>
    </form>
</body>
</html>

当然,这只是客户端的请求方式,光有这些是不够的。下面我们需要构建服务端的处理逻辑:

(1) 在Cygwin根目录下创建一个test.js文件;

(2) 里面键入如下JS:

var sys=require("sys"),
	http=require("http"),
	url=require("url"),
	path=require("path"),
	fs=require("fs");
http.createServer(function(request,response){
	var uri=url.parse(request.url).pathname;
	var filename=path.join(__dirname,uri);
	path.exists(filename,function(exists){
		if(!exists){
			response.writeHead(404,{"Content-Type":"text/plain"});
			response.write("404 Not Found\n");
			response.end();
			return;
		}

		fs.readFile(filename,"binary",function(err,file){
			if(err){
				response.writeHead(500,{"Content-Type":"text/plain"});
				response.write(err+"\n");
				response.end();
				return;
			}

			response.writeHead(200);
			response.write(file,"binary");
			response.end();
		});
	});
}).listen(8080);

sys.puts("Server running at http://localhost:8080/");

(3) 运行Cygwin,键入命令:node /test.js

可以看到,http服务器已经构建完成:

接下来,我们就可以让它处理客户端请求了。它会根据,请求的文件结合路径,到文件系统中查找文件并响应到客户端。

页面效果:

可以看到效果和普通做法是一样的。

很显然,Node.js能够很轻松地完成这些事情,I/O与通信无阻塞是它的优势。并且它对文件的读取可以是异步的。异步与基于事件驱动一直都是JS的优势。

该例子只是列举了获取JS、CSS这些文件,其实只要是那些静态文件,都可以切换成这种请求方式。当然这个例子并不能作为商业应用的部署方案,这只是一种可行性验证,但很明显它确实是一种方案,只是还有很多问题需要考虑,例如,构建缓存以提高效率,文件压缩问题,加密问题,分布式架构下文件结构访问,Node.js服务端安全的问题等等。

但作为一个兴起的技术,我相信它会慢慢完善的。

最近正在学习Node.js有兴趣的童鞋可以多多交流~

mailto:yanghua1127@gmail.com

原文发布时间为:2011-10-16

本文作者:vinoYang

本文来自合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。

时间: 2024-10-29 18:59:36

Node.js应用之静态文件分发器的相关文章

Node.js 去掉种子(torrent)文件里的邪恶信息

 torrent文件,又被称为种子,原来只是用于记录 bt下载当中所需信息的一种文件.但是随着互联网的极大发展,一些人士将一些邪恶的信息注入到了小小的 torrent文件当中,种子从此变成了邪恶的代名词.     2012 年,一部名为 ABS-130 的日本影片引起了网络的震动,网络上纷纷出现了 "当初求种像条狗,如今*完嫌人丑"的现象,成为了 2012 年互联网的一件大事件. 2014年,净网行动如火如荼地进行,各大互联网公司都作出了表率,一时之间XX云.X雷都把万恶的种子拒之门外

node.js实现逐行读取文件内容的代码_node.js

在此之前先介绍一个逐行读取文件内容NPM:https://github.com/nickewing/line-reader,需要的朋友可以看看. 直接上代码: function readLines(input, func) { var remaining = ''; input.on('data', function(data) { remaining += data; var index = remaining.indexOf('\n'); while (index > -1) { var l

Node.js 去掉种子(torrent)文件里的邪恶信息_node.js

2012 年,一部名为 ABS-130 的日本影片引起了网络的震动,网络上纷纷出现了 "当初求种像条狗,如今*完嫌人丑"的现象,成为了 2012 年互联网的一件大事件. 2014年,净网行动如火如荼地进行,各大互联网公司都作出了表率,一时之间XX云.X雷都把万恶的种子拒之门外.净网行动万岁!!(还我苍老师!!) 各大网盘.下载应用都从种子当中提取关键信息,将种子拒之门外.这些关键信息究竟藏在哪里?让我们一探究竟. 种子文件结构 以下内容来自维基百科 .torrent种子文件本质上是文本

node.js开机自启动脚本文件_node.js

复制代码 代码如下: #!/bin/bash ### BEGIN INIT INFO # Provides:       xiyoulib # Required-Start:   $all # Required-Stop:     $all # Default-Start:     2 3 4 5 # Default-Stop:   0 1 6 # Short-Description: Start daemon at boot time # Description:     Enable ser

node.js应用后台守护进程管理器Forever安装和使用实例_node.js

我们不可能直接通过node命令来管理远程站点,这样无法保证网站的可持续运行.我们用Forever来解决这个问题,它可以将NodeJS应用以后台守护进程的方式运行,我们还可以将NodeJS应用设成随系统启动而自动运行. 首先,安装Forever: 复制代码 代码如下: npm install forever -gd 这样Forever就安装好了,我们可以直接运行Forever命令: 复制代码 代码如下: forever --helpforever start app.jsforever stop

Node.js中常规的文件操作总结_node.js

前言 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API. Node 导入文件系统模块(fs)语法如下所示: var fs = require("fs") fs模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等POSIX文件系统操作.与其他模块不同的是,fs模块中所有的操作都提供了异步和同步的两个版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync() . 一. 目录操作 1. 创建目录 创

node.js实现多图片文件上传实例

先我们来看单文件图片上传 单个的实现我是这样的  代码如下 复制代码 fs.readFile(req.files['file'].path, function(err, data){          fs.writeFile(newPath, data, function(err){                //上传成功           }) }); 如果多文件上传我们只要在此基础上进行修改即可,下面看一个实例. 先看图 这是我当时做多图片的代码,拿出来给大家借鉴一下(有些地方需要亲

《Node应用程序构建——使用MongoDB和Backbone》一第 1 章 Node.js基本介绍1.1 Node和npm命令

第 1 章 Node.js基本介绍 写给PHP开发者的Node.js学习指南 我们假定你有一个PHP代码库需要移植到Node.js.在可预见的未来你需要为用户提供PHP和Node.js两个代码库,这意味着你需要同步更新和改进这两个代码库.但是你并不了解Node.js,也没有做过任何有关Node.js的开发.那么该从哪里下手呢? 首先需要下载支持你的平台的Node.js,可能是Linux或者Windows版本(是的!Node.js还提供了Windows的版本!).因为每个版本的安装方法和安装工具都

《写给PHP开发者的Node.js学习指南》一第 2 章 简单的Node.js框架2.1 HTTP服务器

第 2 章 简单的Node.js框架 写给PHP开发者的Node.js学习指南 在之前的章节,我介绍了一个用于PHP到Node.js转换的开发环境,以及如何使用它进行转换.在本章,我们将开始使用这个开发环境并进行实际的转换. 2.1 HTTP服务器 写给PHP开发者的Node.js学习指南 在PHP中,一个PHP文件代表一个HTML页面.一个Web服务器,比如Apache,当请求一个PHP页面时,Web服务器会运行PHP.但是在Node.js里,Node.js的main文件代表了整个服务器.No