用nodejs写的一个简单项目打包工具


Posted in NodeJs onMay 11, 2013

项目的模块加载和定义部分代码是这样的:

XX.define('ns',['tool/cookie'],function(){
});
//或者
XX.define('ns.ns2','tool/cookie,tool/abc',function(){
})
//或者
XX.define('ns',function(){
})

所用到的js打包工具就是扫描文件,然后匹配出来需要加载的模块,然后先加载模块代码。
主要的nodejs打包工具代码如下:

//通用模块
var Util = require('util'),
    FS = require('fs'),
    getDeps = require('./getDeps'),
    Uglify = require('./uglify/uglify-js'),
    removeBOMChar = require('./removeBOM').removeBOMChar,
    PATH =require('path');var packagedObj = {};//是否已经打包过
module.exports = function(filePath, rootPath, opts){
    opts = opts || {};
    var str = jscombo(filePath,rootPath);
    if(opts.unzip){
        return str;
    }else{
        return Uglify(str);   
    }
};
function jscombo(filePaths, rootPath){
    if(Util.isArray(filePaths)){
        return filePaths.map(function(filePath){            
            filePath = PATH.join(rootPath,filePath);
            //只打包一次
            if(packagedObj[filePath]){
                return '';
            }
            packagedObj[filePath] = 1;
            //是否存在
            if(FS.existsSync(filePath)){
                //异步读取内容
                var str = FS.readFileSync(filePath, 'utf-8');
                //移出BOM头
                str = removeBOMChar(str);
                var result = getDeps(str, rootPath);
                var content = result.content;
                content = '//'+filePath+'\n'+content;
                //递归打包
                if(result.list){
                    return jscombo(result.list, rootPath) + content;
                }                
                //返回内容
                return content;
            }else{
                //文件不存在错误信息
                console.error('jsCombo Error: ' + filePath + ' does not exsist! the path is:'+rootPath);
                return ';alert("' + filePath + ' does not exsist!");';
            }            
        }).join(';\n');
    }else{
        return jscombo([filePaths],rootPath);
    }
}

对于nodejs之前一直没认真学习,都是边查文档,编写的,所以代码很青涩~

NodeJs 相关文章推荐
Nodejs Post请求报socket hang up错误的解决办法
Sep 25 NodeJs
Nodejs极简入门教程(一):模块机制
Oct 25 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
NodeJS和BootStrap分页效果的实现代码
Nov 07 NodeJs
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
Jan 12 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
Nodejs封装类似express框架的路由实例详解
Jan 05 NodeJs
nodejs教程 安装express及配置app.js文件的详细步骤
May 11 #NodeJs
nodejs中exports与module.exports的区别详细介绍
Jan 14 #NodeJs
nodejs的require模块(文件模块/核心模块)及路径介绍
Jan 14 #NodeJs
windows系统下简单nodejs安装及环境配置
Jan 08 #NodeJs
NodeJs中的非阻塞方法介绍
Jun 05 #NodeJs
nodejs win7下安装方法
May 24 #NodeJs
NodeJS的模块写法入门(实例代码)
Mar 07 #NodeJs
You might like
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
使用PHP模拟HTTP认证
2006/10/09 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
Js 本页面传值实现代码
2009/05/17 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
微信小程序 wxapp内容组件 icon详细介绍
2016/10/31 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
Python字符遍历的艺术
2008/09/06 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
警示教育片观后感
2015/06/17 职场文书
golang用type-switch判断interface的实际存储类型
2022/04/14 Golang