【问题标题】:how to config grunt.js to minify files separately如何配置 grunt.js 以分别缩小文件
【发布时间】:2012-11-13 10:00:28
【问题描述】:

static/js/中有一些js文件

    1. a.js
    2. b.js
    3. c.js   

如何配置 grunt.js 以获取以下文件:

    1. a.min.js
    2. b.min.js
    3. c.min.js

到目前为止,我必须输入特定的文件名:

  min: {
    dist: {
    src:  'js/**/*.js',
    dest: 'js/min/xxx.min.js'
   }
 }

【问题讨论】:

  • 目前对此没有开箱即用的支持(请参阅How to minify separate files and do not combine them into one file?)。您必须动态生成 min 任务的配置(有很多目标)或创建自己的使用 min 助手的任务......我稍后会尝试发布解决方案......
  • @DmitryPashkevich 我不确定我是否同意。您可以在 min 任务中运行多个任务。请参阅下面的答案。
  • @DavidHyogo 的问题是,如何必须手动登记所有文件,但在原始问题工作中具有类似 Inge 的配置
  • *Inge = the (predictive text, sorry :))
  • @DmitryPashkevich 谢谢德米特里。你比我更了解这个问题。严格来说,问题并没有真正这么说,即使你明白了,所以我对其进行了编辑以使问题更清晰。我会留下我的答案,因为它对于简单的用例很有用,但我可以看到能够按照提问者的意图制作整个目录是多么有用。

标签: javascript compression gruntjs


【解决方案1】:

遇到了同样的问题,找到了一个可以分别自动缩小我所有脚本的解决方案:

uglify: {
      build: {
        files: [{
            expand: true,
            src: '**/*.js',
            dest: 'build/scripts',
            cwd: 'app/scripts'
        }]
      }
    }

【讨论】:

  • 你能解释一下哪个属性代表什么,因为它对我不起作用。
  • @LoneWOLFs 参考gruntjs.com/… 了解这些信息。另请注意,包装 [] 是必不可少的,即使对于单个文件声明也是如此。
  • cwd 代表当前工作目录,我想任何使用这个 sn-p 的人都应该知道它的目录结构,我个人删除了 cwd 并且它工作了
  • 是否可以更改文件名?当前的解决方案将保留它们,afaik。将*.js 动态更改为*.min.js 怎么样?
  • 只需将ext: '.min.js', 添加到files 内的列表中即可输出文件的.min.js 副本
【解决方案2】:

在 grunt 0.4 中,您可以像这样指定多个 dest/src 对:

uglify: {
    dist: {
        files: {
            'dist/main.js': 'src/main.js',
            'dist/widget.js': 'src/widget.js'
        }
    }
}

【讨论】:

  • 有些人应该会发现 expandMapping (gruntjs.com/api/grunt.file#grunt.file.expandmapping) 很有用,因此可以缩小整个目录并保持其结构不变,而无需列出其中的每个 JS 文件。
  • 您还可以将多个文件对编译成一个缩小文件,如下所示: files: { 'dist/main.js': 'src/main/*.js', 'dist/widget.js ': 'src/widget/*.js' }
【解决方案3】:

或者你可以使用expandMapping,像这样:

min: {
    files: grunt.file.expandMapping(['path/*.js', 'path2/*.js'], 'destination/', {
        rename: function(destBase, destPath) {
            return destBase+destPath.replace('.js', '.min.js');
        }
    })
}

还有输出:

路径/test.js => 目的地/路径/test.min.js
path2/foo.js => 目的地/path2/foo.min.js

【讨论】:

  • 这很好,但是,如果.min.js 文件已经存在于这些目录中,它将在每次运行时创建.min.min.js 文件等等。如何避免这种情况?
【解决方案4】:

下面的 gruntjs 适用于我为目录下的所有 js 文件创建缩小文件

module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    uglify: {
    build: {
        files: [{
            expand: true,
            src: '**/*.js',
            dest: 'build/scripts',
            cwd: 'public_html/app',
        ext: '.min.js'
        }]
      }
    }
  });

  // Load the plugin that provides the "uglify" task.
  grunt.loadNpmTasks('grunt-contrib-uglify');

  // Default task(s).
  grunt.registerTask('default', ['uglify']);

};

【讨论】:

    【解决方案5】:

    来自 min 的 grunt 文档:

    这个任务是一个多任务,意味着 grunt 会自动 如果未指定目标,则遍历所有最小目标。

    所以你可以这样做:

      min: {
        min_a: {
           src:  'a.js',
           dest: 'a.min.js'
        },
        min_b: {
           src:  'b.js',
           dest: 'b.min.js'
        },
        min_c: {
           src:  'c.js',
           dest: 'c.min.js'
     }
    

    这些任务的名称“dist”没有什么特别之处。

    【讨论】:

    • OP 想要使用通配符来包含所有文件。这样做需要您命名每个单独的文件。
    【解决方案6】:

    使用ext 选项将文件命名为.min.js 而不是.js

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

    【讨论】:

      【解决方案7】:

      要将某些文件显式导出到单独的输出文件(在本例中为 all.min.jsall.jquery.js),请使用:

      uglify: {
        js: {
          files : {
              'js/all.min.js' : [
                'js/modernizr.js',
                'js/vendor/modernizr-2.6.2-respond-1.1.0.min.js',
                'js/bootstrap.min.js',
                'js/main.js',
                'js/ZeroClipboard.min.js',
                'js/bootstrap-datepicker/bootstrap-datepicker.js'
              ],
      
              'js/all.jquery.js' : [
                'js/vendor/jquery-1.9.1.js',
                'js/vendor/jquery-migrate-1.2.1.js',
                'js/vendor/jquery-ui.js'
              ]
      
          }
        },
        options: {
          banner: '\n/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n',
          preserveComments: 'some',
          report: 'min'
        }
      },
      

      【讨论】:

        【解决方案8】:

        我喜欢保留原始文件并创建丑陋的文件:

        uglify: {
          dist: {
            files: [{
              expand: true,
              src: '**/*.js',
              dest: 'destdir',
              cwd: 'srcdir',
              rename: function(dest, src) { return dest + '/' + src.replace('.js', '.min.js'); }
            }]
          }
        },
        

        【讨论】:

        • 这是我一直在寻找的答案。我有一些以“.pkgd.js”结尾的文件,所以如果我使用ext 选项,其他人都建议这会被覆盖并破坏我的应用程序。在我看来,这是最可靠的答案,因为它完全符合我们的要求。
        【解决方案9】:

        您也可以使用复制和grunt-mindirect

        copy: {
          dist: {
            src: 'a.js',
            dest: 'a.min.js'
          }
        },
        minidirect: {
          all: 'js/min/*.min.js'
        }
        

        这应该可行。

        【讨论】:

          【解决方案10】:

          我猜它只对监视任务很重要。

          在 grunt 0.4 中你可以这样做

            var filesA = 'a.js', filesB = 'b.js', filesC = 'c.js';
          
            ...
          
            min: {
                min_a: {
                   src:  filesA,
                   dest: 'a.min.js'
                },
                min_b: {
                   src:  filesB,
                   dest: 'b.min.js'
                },
                min_c: {
                   src:  filesC,
                   dest: 'c.min.js'
            }
          
            watch: {
                min_a: {
                   files:  filesA,
                   tasks: ['min:min_a']
                },
                min_b: {
                   files:  filesB,
                   tasks: ['min:min_b']
                },
                min_c: {
                   files:  filesC,
                   tasks: ['min:min_c']
                }
            }
          

          之后只需启动grunt watch,一切都会自动好起来的。

          【讨论】:

            【解决方案11】:

            旨在帮助将来访问此页面的其他人 -

            我在这里看到了一个视频,它解释了如何使用 Grunt JS 缩小 JS 文件:https://www.youtube.com/watch?v=Gkv7pA0PMJQ

            源代码在此处提供:http://www.techcbt.com/Post/359/Grunt-JS/how-to-minify-uglify-javascript-files-using-grunt-js

            以防万一,如果上述链接不起作用:

            1. 您可以使用以下脚本缩小所有 javascript 文件并将其合并/合并为一个文件:

                module.exports = function(grunt){
            	grunt.loadNpmTasks('grunt-contrib-uglify');	
            	
            	grunt.initConfig({
            		pkg: grunt.file.readJSON('package.json'),
            
            		uglify:{
            			t1:{
            				files:{
            					'dest/all.min.js': ['src/app.js', 'src/one.js', 'src/t/two.js']
            				}
            			}
            		}
            	});	
            };
            1. 如果您还想生成源地图,可以启用“sourceMap”选项,如下所示:

                module.exports = function(grunt){
            	grunt.loadNpmTasks('grunt-contrib-uglify');	
            
            	grunt.initConfig({
            		pkg: grunt.file.readJSON('package.json'),
            
            		uglify:{
            			t1:{
            				options : {
                    			sourceMap : true,
                  			},
            				files:{
            					'dest/all.min.js': ['src/app.js', 'src/one.js', 'src/t/two.js']
            				}
            			}
            		}
            	});	
            };
            1. 为了在压缩 JS 文件的同时保留整个文件夹结构,可以使用以下脚本:

                module.exports = function(grunt){
            	grunt.loadNpmTasks('grunt-contrib-uglify');	
            
            	grunt.initConfig({
            		pkg: grunt.file.readJSON('package.json'),
            
            		uglify:{
            			t1:{
            				files: [{
            					cwd: 'src/',
                           		src: '**/*.js',  
                           		dest: 'dest/',    
                           		expand: true,    
                           		flatten: false,
                           		ext: '.min.js'
                       		}]
            			}
            		}
            	});	
            };

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-06-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多