繁体   English   中英

如何在保持文件夹结构的同时grunt-uglify多个脚本文件

[英]How to grunt-uglify multiple script files while keeping folder structure

我没有找到一个好方法来grunt-uglify多个脚本文件分布在多个文件夹,同时保持文件夹结构包括uglified文件完好无损。 我想这样做的唯一原因是能够提高我正在处理的网页的“遗留”部分的性能。

我已经找到了解决这个问题的方法,我不想做,因为它需要花费很多时间,就像在这个答案中一样(它们分别指定每个src和dest对): 如何配置grunt。 js分别缩小文件

我想要实现的一个例子:

**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文件做同样的事情。

有谁知道这是否可能?

Rafa Heringer 关于你所关联的帖子的回答的原则看起来很有希望,有点扭曲:

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: 没试过自己跑吧!

与@DioNNiS的答案类似,但将缩小的文件存储在同一文件夹中

    uglify: {
        all: {
            files: [{
                expand: true,
                cwd: 'path/to/js/',
                src: ['*.js', '!*.min.js'],
                dest: 'path/to/js/',
                ext: '.min.js'
            }]
        }
    }

实际上你可以使用以下方法:

uglify: {
  all: {
    files: [{
      expand: true,
      cwd: 'js/',
      src: ['*.js', '**/*.js'],
      dest: 'js-min/',
      ext: '.min.js',
    }],
  },
}

Wallace的答案很棒,但是如果你试图缩小的文件在grunt启动之前不存在(即如果你依赖于另一个任务),它将无法工作,因为地图是在任何任务运行之前生成的。

我想出了一个解决方案,使用节点包uglify-js而不是grunt-contrib-uglify来单独缩小生成的文件。

  • 将uglify-js添加到package.json中
  • 将以下示例之一添加到您的Grunfile(如果您使用示例1,则只需用适当的glob替换“您的文件”)。
  • 如果需要更改缩小的文件目标或扩展名,请改用示例2。 它使用带有回调的grunt.file.recurse,它为您提供每个文件的根目录,子目录和文件名(然后构建自定义目标路径更容易)。 将“FOLDER”替换为您要扫描的目录,并构建您自己的“CUSTOM PATH HERE”。

示例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");
});

这个解决方案不适合我。

这是一个有效的例子:

        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
                }
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM