contrib-concat

contrib-concat为grunt的一个插件,用来合并文件。

新建一个文件夹,根据我之前写的《初探grunt》配置好package.json和Gruntfile.js后,打开DOS cd到你的文件夹目录,输入

npm install grunt-contrib-concat --save-dev
安装contrib-concat插件并自动更新package.json

最简单的concat

现在,来做一个最简单的concat。代码如下:

module.exports = function(grunt) {
    grunt.initConfig({
        concat: {
	    dist: {
		src: ['js/test01.js', 'js/test02.js', 'js/test03.js'],
		dest: 'dest/test.js'
	    }
        }	
    });
	
    grunt.loadNpmTasks('grunt-contrib-concat');
	
    grunt.registerTask('default', ['concat']);
}
src里放的就是你想要进行合并的文件

dest则是你想输出的合并后的文件的位置。我这里设置为dest/test.js,所以它合并后会在dest文件夹里生成一个test.js(如果没有dest文件夹它会自行创建)
dist可以为任意值,你将dist改为file、basic等等都行,主要简单易懂,让别人一看名字就知道这个是干什么的就行。

这样,一个最简单的concat就完成了。在DOS下输入grunt后就会在dest文件夹下生成一个test.js,里面就是src里所有文件合并后的代码。

另外,如果我们现在js目录下只有test01.js和test02.js,然后我们依然执行上面的代码,DOS下并不会给出警告。这时候我们需要在dist里加上nonull属性,代码如下:

dist: {
    src: ['js/test01.js', 'js/test02.js', 'js/test03.js'],
    dest: 'dest/test.js',
    nonull: true
}
这样,当你执行上面concat代码时,DOS就会给出警告,test03.js not found。有时我们想要合并的文件太多,在src里写好要合并的文件,实际上却少放了几个文件到相应的文件夹,nonull属性就可以起到很大的作用。

生成多个文件

如果现在我们想要把A和B合并生成文件1,把C和D合并生成文件2,要如何设置concat属性呢?代码如下(其他一样,只有config属性里代码不同,所以只粘贴concat属性部分的代码):

concat: {
    fileOne: {
    <span style="white-space:pre">	</span>src: ['js/test01.js', 'js/test02.js'],
    <span style="white-space:pre">	</span>dest: 'dest/fileOne.js'
    },
    fileTwo:{
	src: ['js/test02.js', 'js/test03.js'],
        dest: 'dest/fileTwo.js'
    }
}
你也可以用一种更简洁的写法,要用到files属性,代码如下(这里的files就不能随意改成其他值了):

concat: {
    dist: {
	files: {
	    'dest/fileOne.js': ['js/test01.js', 'js/test02.js'],
	    'dest/fileTwo.js': ['js/test02.js', 'js/test03.js']
	}
    }
}	

两种方式最后的结果都是一样的。在dest目录下生成fileOne.js和fileTwo.js。

options属性

concat下的options属性可以让你更人性化的生成合并后的文件。查看了官方的API,options下有这几个属性:separator、banner、footer、stripBanners、process。先贴上代码:

concat: {
    options: {
<span style="white-space:pre">	</span>separator: ';',
	banner: '/*This is a test*/',
	footer: '/*the End*/',
	stripBanners: true,
	process: function(src, filepath){
	    return '//This is ' + filepath + '\n' +  src + '\n';
<span style="white-space:pre">	</span>}
    },			
    file: {
	src: ['js/test01.js', 'js/test02.js', 'js/test03.js'],
	dest: 'dest/test.js'
    }
}

separator 一个String类型,参与合并的文件会加入到这个String当中。我们可以设置一个符号来将参与合并的文件分割开来,比如上面代码,就用“;”分割每个文件。这在你合并压缩后的js文件时可能会用到

banner 用于在合并后的文件开头显示注释信息,上面代码在合并后的文件开头显示/*This is a test*/

footer 跟banner相似,但它是在合并后的文件末尾显示注释信息,上面代码在合并后的文件最后显示/*the End*/

stripBanners 设置是否要忽略注释信息。设为true则将忽略/**/类型的注释信息。注意,只能忽略块注释而不能忽略行注释,那要怎样才能忽略行注释呢,代码如下:

stripBanners: {
    line: true
}

另外,我发现stripBanners只会忽略文件一开始的注释信息,而代码中间的注释信息则仍然存在,比如:

/* NUM_ONE */
var NUM_ONE = 1;
/* NUM_TWO */
var NUM_TWO = 2;
则/* NUM_ONE */合并后会被忽略,/* NUM_TWO */合并后仍然存在。官方API上写着设为true块注释都会被忽略,可我测试后并非如此,关于这一点我还没想通。

process 自定义进程函数。比如我们想在每个参与合并的文件开头显示相应的文件信息,就可以像上面代码一样设置,function(src, filepath){}是process给我们定义好的函数,每有一个参与合并的文件进来,它就会调用一次。filepath是参与合并的文件的位置, src就是文件里面的代码。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值