我还没有找到一种很好的方法来grunt-uglify分布在多个文件夹中的多个脚本文件,同时保持包含uglified文件的文件夹结构不变。 我想这样做的唯一原因是能够提高我正在处理的网页“遗留”部分的性能。
我已经找到了解决这个问题的方法,我不想这样做,因为它需要花费很多时间,而且就像在这个答案中那样(它们分别指定每个src和dest对): how to config grunt.js to minify files separately
我想要实现的一个例子:
**src dir (no uglify applied):**
src
|- app1
|- randomFile.js
|- scripts
|- file1.js
|- file2.js
|- libs
|- file3.js
|- file4.js
|- app2
|- scripts
|- file1.js
|- file2.js
**destination dir (uglify applied, same file name):**
dist
|- app1
|- randomFile.js
|- scripts
|- file1.js
|- file2.js
|- libs
|- file3.js
|- file4.js
|- app2
|- scripts
|- file1.js
|- file2.js
顺便说一下,如果可能的话,想对CSS文件做同样的事情。
有人知道这是否可行?
答案 0 :(得分:22)
Rafa Heringer
的回答on the post you linked to中的原则看起来很有希望,但有点扭曲:
uglify: {
min: {
files: grunt.file.expandMapping(['path/**/*.js', 'path2/**/*.js'], 'destination/', {
rename: function(destBase, destPath) {
return destBase+destPath.replace('.js', '.min.js');
}
})
}
}
这里唯一的区别是基本路径和带有扩展名的通配符文件名之间的双星号。这将遍历所有子文件夹,并且 - 希望 - 输出每个找到它在正确文件夹中找到的文件。
输出结果为:
path/test.js => destination/path/test.min.js
path/subpath1/abc.js => destination/path/subpath1/abc.min.js
path/subpath2/yey.js => destination/path/subpath2/yey.min.js
path2/foo.js => destination/path2/foo.min.js
使用CSS
(使用grunt-contrib-cssmin插件)执行相同操作时,上述方法仍然有效,但您必须将其与必须使用的相关插件配置相结合适当地以您想要的方式输出缩小的CSS
。
PS:我自己没有尝试过运行它!
答案 1 :(得分:14)
与@DioNNiS的答案类似,但将缩小的文件存储在相同的文件夹中:
uglify: {
all: {
files: [{
expand: true,
cwd: 'path/to/js/',
src: ['*.js', '!*.min.js'],
dest: 'path/to/js/',
ext: '.min.js'
}]
}
}
答案 2 :(得分:7)
实际上你可以使用以下方法:
uglify: {
all: {
files: [{
expand: true,
cwd: 'js/',
src: ['*.js', '**/*.js'],
dest: 'js-min/',
ext: '.min.js',
}],
},
}
答案 3 :(得分:2)
Wallace的答案很棒,但是如果你试图缩小的文件在grunt启动之前不存在(即如果你依赖于另一个任务),它将无法工作,因为地图是在任何任务之前生成的跑了。
我想出了一个解决方案,使用节点包uglify-js而不是grunt-contrib-uglify来单独缩小生成的文件。
示例1:使用grunt.file.expand
grunt.registerTask('uglifyFiles', 'Uglifies files', function () {
var jsp = require("uglify-js").parser,
pro = require("uglify-js").uglify,
count = 0;
grunt.file.expand(['YOUR FILES HERE']).forEach(function (abspath) {
// Exclude already minified files (with extension .min.js)
if (!abspath.match(/\.min\.js$/i)) {
// Get Abstract Syntax Tree
var ast = jsp.parse(grunt.file.read(abspath));
// If mangling
// ast = pro.ast_mangle(ast);
// If squeezing
ast = pro.ast_squeeze(ast);
// Write new file
grunt.file.write(abspath.replace(/\.js$/i, '.min.js'), pro.gen_code(ast));
count += 1;
}
});
grunt.log.oklns("Successfully uglified " + count + " files");
});
示例2:使用grunt.file.recurse
grunt.registerTask('uglifyFiles', 'Uglifies files', function () {
var jsp = require("uglify-js").parser,
pro = require("uglify-js").uglify,
count = 0;
grunt.file.recurse('FOLDER', function callback(abspath, rootdir, subdir, filename) {
// Exclude already minified files (with extension .min.js)
if (!abspath.match(/\.min\.js$/i)) {
// Get Abstract Syntax Tree
var ast = jsp.parse(grunt.file.read(abspath));
// If mangling
// ast = pro.ast_mangle(ast);
// If squeezing
ast = pro.ast_squeeze(ast);
// Write new file, using abspath or rootdir, subdir and filename
grunt.file.write('CUSTOM PATH HERE', pro.gen_code(ast));
count += 1;
}
});
grunt.log.oklns("Successfully uglified " + count + " files");
});
答案 4 :(得分:0)
This solution没有为我工作。
这是一个有效的例子:
path: {
build: {
src: 'assets',
js: 'js',
css: 'css'
},
js: 'js',
css: 'css'
},
uglify: {
scripts: {
expand: true,
cwd: '<%= path.js %>/',
src: [
'**/*.js',
'*.js',
//skip minified scripts
'**/!*.min.js',
'!*.min.js'
],
dest: '<%= path.build.src %>/<%= path.build.js %>/',
rename: function (destBase, destPath) {
return destBase + destPath.replace('.js', '.min.js');
}
}
},
//same options for css minify
cssmin: {
styles: {
expand: true,
cwd: '<%= path.css %>/',
src: [
'**/*.css',
'*.css',
//skip minified styles
'**/!*.min.css',
'!*.min.css'
],
dest: '<%= path.build.src %>/<%= path.build.css %>/',
rename: function (destBase, destPath) {
return destBase + destPath.replace('.css', '.min.css');
}
}
},
//and watch it for changes
watch: {
js: {
files: [
'<%= path.js %>/*.js',
'<%= path.js %>/**/*.js'
],
tasks: [
'uglify:scripts'
],
options: {
livereload: true
}
},
css: {
files: [
'<%= path.css %>/*.css',
'<%= path.css %>/**/*.css'
],
tasks: [
'cssmin:styles'
],
options: {
livereload: true
}
}
}