用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与Mysql的交互示例代码
Aug 18 NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
nodejs基础知识
Feb 03 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
Jan 04 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
详解Vue取消eslint语法限制
2018/08/04 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python3处理文件中每个词的方法
2015/05/22 Python
python抽象基类用法实例分析
2015/06/04 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
RealTek面试题
2016/06/28 面试题
.NET初级开发工程师面试题
2014/04/18 面试题
广告艺术设计专业自荐书
2014/07/08 职场文书
活动总结结尾怎么写
2014/08/30 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
2015年党小组工作总结
2015/05/26 职场文书
出生证明范本
2015/06/15 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
JavaScript原型链详解
2021/11/07 Javascript
Go语言grpc和protobuf
2022/04/13 Golang