`
JavaSam
  • 浏览: 952099 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NodeJs 合并文件

 
阅读更多
var fs = require("fs"),
    path = require("path"),
    http = require("http");
    
var MIME = {
	'.css':'text/css',
	'.js':'application/javascript'
}
/**
 *合并文件 
 * @param {Object} pathnames
 * @param {Object} callback
 */
function combinFiles(pathnames,callback){
	var output = [];
	
	(function next(i,len){
		if(i<len){
			fs.readFile(pathnames[i],function (err,data){
				if(err){
					callback(err)
				}else{
					output.push(data);
					next(i+1,len)
				}
			});
		}else{
			callback(null,Buffer.concat(output));
		}
	}(0,pathnames.length));
}

/**
 *主函数 
 * @param {Object} argv
 */
function main(argv){
	//var config = require('./config.json'),
	var config = JSON.parse(fs.readFileSync(argv[0],'utf-8')),
	    root = config.root || '.',
	    port = config.port || 8080;
	    
	http.createServer(function (req,resp){
		var urlInfo = parseURL(root,req.url);
		
		combinFiles(urlInfo.pathnames,function (err,data){
			if(err){
				 resp.writeHead(404);
				 resp.end(err.message);
			}else{
				resp.writeHead(200,{
					"Content-Type":urlInfo.mine
				});
				resp.end(data);
			}
		});
	}).listen(port);
}

/**
 *解析url地址 
 */
function parseURL(root,url){
	var base,pathnames,parts;
	
	if(url.indexOf("??") === -1){
		url  = url.replace("/","/??");
	}
	
	parts = url.split("??");
	
	base = parts[0];
	
	pathnames = parts[1].split(",").map(function(value){
		return path.join(root,base,value);
	});
	
	return {
		mime:MIME[path.extname(pathnames[0])] || 'text/plan',
		pathnames:pathnames
	}
}

main(process.argv.slice(2));

 

     config.json

 

     {“port”:“8080”}

 

      启动服务

 

     node server.js config.json

 

 

 

     浏览器测试

    http://localhost:8080/??server.js,temp.js

 

 

 

优化版的server.js

var fs = require("fs"),
path = require("path"),
http = require("http");
 
var MIME = {
    '.css': 'text/css',
    '.js': 'application/javascript'
}
/**
 *合并文件 
 * @param {Object} pathnames
 * @param {Object} callback
 */
function combinFiles(pathnames, callback) {
    var output = [];
 
    (function next(i, len) {
        if (i < len) {
            fs.readFile(pathnames[i],
            function(err, data) {
                if (err) {
                    callback(err)
                } else {
                    output.push(data);
                    next(i + 1, len)
                }
            });
        } else {
            callback(null, Buffer.concat(output));
        }
    } (0, pathnames.length));
}
 
/**
 *主函数 
 * @param {Object} argv
 */
function main(argv) {
    var config = JSON.parse(fs.readFileSync(argv[0], 'utf-8')),
    root = config.root || '.',
    port = config.port || 8080;
 
    http.createServer(function(req, resp) {
        var urlInfo = parseURL(root, req.url);
 
        validateFiles(urlInfo.pathnames,
        function(err, pathnames) {
            if (err) {
                resp.writeHead(404);
                resp.end(err.message);
            } else {
                resp.writeHead(200, {
                    "Content-Type": urlInfo.mime
                });
                outputFiles(pathnames, resp);
            }
        });
    }).listen(port);
}
/**
 *输出文件 
 */
function outputFiles(pathnames, writer) { 
(function next(i, len) {
        if (i < len) {
            var reader = fs.createReadStream(pathnames[i]);
            
            reader.pipe(writer, {
                end: false
            });
            
            reader.on("end",
            function() {
                next(i + 1, len);
            })
        } else {
            writer.end();
        }
    }) (0, pathnames.length);
}
 
/**
 * 验证文件
 */
function validateFiles(pathnames, callback) { 
(function next(i, len) {
        if (i < len) {
            fs.stat(pathnames[i],
            function(err, stats) {
                if (err) {
                    callback(err);
                } else if (!stats.isFile()) {
                    callback(new Error());
                } else {
                    next(i + 1, len);
                }
            })
        } else {
            callback(null, pathnames);
        }
    })(0, pathnames.length);
}
/**
 *解析url地址 
 */
function parseURL(root, url) {
    var base, pathnames, parts;
 
    if (url.indexOf("??") === -1) {
        url = url.replace("/", "/??");
    }
 
    parts = url.split("??");
 
    base = parts[0];
 
    pathnames = parts[1].split(",").map(function(value) {
        return path.join(root, base, value);
    });
 
    return {
        mime: MIME[path.extname(pathnames[0])] || 'text/plan',
        pathnames: pathnames
    }
}
 
main(process.argv.slice(2));

 

0
0
分享到:
评论

相关推荐

    0226NodeJS文件合并packagejson配置Demo

    本教程将详细讲解如何利用Node.js处理`package.json`文件,进行配置合并以及相关的开发实践。 一、`package.json`文件详解 1. 基本结构:`package.json`文件通常包含`name`、`version`、`description`、`keywords`...

    nodejs上传下载管理文件

    4. **路径管理**:Node.js中的`path`模块提供了处理文件路径的工具函数,例如合并路径、获取文件扩展名等。 5. **HTTP响应**:当用户请求下载文件时,我们需要构造合适的HTTP响应,包含文件内容和适当的头部信息...

    nodejs 解析html根据标签提取需要合并的js、css,并且更新html

    nodejs 解析html根据标签提取需要合并的js、css,并且更新html # 简介 &gt; 站点页面上js、css外链过多会导致网页的加载速度过慢,通过合并页面的js、css成一个文件,减少http的开销。 读取config.json,解析html根据 ...

    php和Nodejs大文件分片上传

    所有分片上传完成后,使用`fs`模块的`concat`函数或者手动合并临时文件。 **4. jQuery大文件分片上传插件** 在描述中提到的"jquery大文件分片上传插件"可能是用于前端实现分片上传的工具,如Resumable.js或...

    MergeExcelTable:基于nodejs的excel表格合并工具

    基于nodejs的excel表格合并工具 安装或升级 该工具是Nodejs命令行工具,安装方式如下(需全局安装) ...输入命令,选择需要合并Excel的文件夹(文件夹里面不能包含其他的任何文件) excelmergetool

    COMBINE-JSON-TO-CSV:将所有 JSON 文件合并到一个文件夹中并将其保存为 CSV 的 NodeJS 脚本

    本文将详细介绍如何使用 JavaScript 和 Node.js 实现一个功能强大的工具:将多个 JSON 文件合并并转化为 CSV 格式。这个过程通常称为数据的格式转换,对于数据分析、报表生成以及与其他系统集成具有重要意义。 标题...

    NodeJS整理手册文档

    1. 文件系统(fs):NodeJS内置的fs模块提供了操作文件和目录的API,如读取、写入、创建、删除等。 2. 网络模块(http/https):用于创建HTTP和HTTPS服务器,支持监听客户端请求并发送响应。 3. URL模块:解析和构建...

    详解nodejs 配置文件处理方案

    2. rc模块会按照特定的优先级顺序合并配置,包括: - 命令行参数 - 环境变量(以${appname}_为前缀的变量) - 指定文件 - 默认配置文件(位于多个可能的目录中) - 用户主目录下的配置文件 - 系统级别的配置...

    nodejs将mysql数据库中的数据导出成excel表格文件

    4. 将生成的Excel文件保存到本地文件系统。 5. 可能包含一个`test.sql`文件,用于生成大规模的测试数据。 这个示例对于需要在后端处理大量数据导出的开发者非常有用,它展示了如何利用Node.js高效地处理数据并生成...

    07Nodejs WEB服务器 静态文件托管、 GET POST路由 EJS模板引擎2

    "Nodejs WEB 服务器静态文件托管、GET POST 路由 EJS 模板引擎" NodeJs WEB 服务器静态文件托管是指将静态文件托管在 NodeJs 服务器上,使得客户端可以直接访问这些文件。静态文件托管可以提高网站的访问速度和...

    CacheCheck:python和nodejs合并的CacheChck

    标题“CacheCheck: python和nodejs合并的CacheChck”暗示了这是一个结合了Python和Node.js技术的缓存检查工具。缓存检查在软件开发中扮演着至关重要的角色,因为它涉及到性能优化和数据一致性。理解这个工具的运作...

    node命令行生成补丁文件合并补丁生成新的文件

    "node命令行生成补丁文件合并补丁生成新的文件"这个主题涉及的是一个基于Node.js的命令行实用程序,它允许开发者创建补丁文件并合并多个补丁以生成更新后的文件。下面我们将深入探讨这一主题。 首先,补丁文件是...

    nodejs用gulp管理前端文件方法

    标题中的“nodejs用gulp管理前端文件方法”指的是在Node.js环境下使用Gulp这个自动化构建工具来管理和优化前端开发过程中的文件。Gulp是基于Node.js的自动化任务运行器,它可以帮助开发者自动化处理常见的前端任务,...

    【nodejs】nodejs版seajs压缩部署工具

    Node.js作为一款强大的服务器端JavaScript运行环境,提供了丰富的生态系统,包括用于处理文件操作、压缩和合并等任务的模块。这款基于Node.js的Seajs压缩部署工具正是利用了这些模块,实现了Seajs模块的自动化处理。...

    nodejs-demo

    “grunt”则是一个JavaScript任务运行器,它自动化了一系列的前端工作流程,如编译Sass、压缩JavaScript和CSS、合并文件等。在“nodejs-demo”中,Grunt可能被配置来执行这些任务,确保代码的优化和构建过程的高效性...

    nodejs_gulp_cli

    在实际开发中,你可能还需要处理其他任务,比如 JavaScript 的 Babel 转换、HTML 模板的合并、静态资源的复制、文件的清理等。Gulp 社区提供了许多插件来满足这些需求,你可以根据项目需要进行选择和配置。 总结来...

    nodejs_guide.pdf

    4. Path模块:处理文件路径相关的操作,如解析、合并路径。 5. Buffer模块:处理二进制数据,是Node.js处理非文本数据的关键。 三、模块系统 Node.js使用模块化开发,每个文件都是一个模块,通过`require`导入模块...

    JavaScript_优化SVG文件的Nodejs工具.zip

    SVGO通过一系列可配置的插件来清理和压缩SVG代码,删除不必要的信息,如注释、元数据、隐藏元素等,同时也可以进行简化路径、合并重复的属性等操作,从而达到减小SVG文件大小的目的。 使用SVGO的步骤通常包括以下几...

Global site tag (gtag.js) - Google Analytics