【问题标题】:How to minify multiple Javascript files in a folder with UglifyJS?如何使用 UglifyJS 缩小文件夹中的多个 Javascript 文件?
【发布时间】:2013-06-05 04:46:55
【问题描述】:

您好,我正在使用 uglifyJs 来缩小我的 javascript 文件,它一次只能处理一个文件,我正在寻找的是将名为 JS 的文件夹中存在的所有 javascript 文件缩小到名为 JSM 的文件夹中,需要明确的是,我的 JS 文件夹中有 2 个文件,名为 test1.js 和 test2.js,我想对该文件夹运行 uglify 并在 JSM 文件夹中生成 test1.min.js 和 test2.min.js,所以有没有怎么做?像这样的命令:

uglifyjs -c -m JS/*.js JSM/*.min.js

或者任何可以帮助我的想法。

谢谢。

【问题讨论】:

    标签: node.js uglifyjs uglifyjs2


    【解决方案1】:

    我知道这似乎是一个巨大的进步,但我真的建议使用grunt。 一旦掌握了窍门,这真的很简单。

    这是一个速成课程:

    1. 安装NodeJS
    2. 安装 Grunt CLI(只需在控制台/终端中输入):

      npm install -g grunt-cli
    3. 在项目的根目录中创建一个简单的package.json 文件:

      { “名称”:“我的项目名称”, “版本”:“1.0.0”, “开发依赖”:{ “咕噜”:“〜0.4.2”, "grunt-contrib-uglify": "~0.2.4", “grunt-contrib-watch”:“~0.5.3” } }
    4. 完成后,只需在控制台(在项目的根目录中)输入:npm install。 这将安装必要的 grunt 插件/依赖项(来自上面的包文件)。

    5. 现在在您项目的根目录中创建一个简单的gruntfile.js(这是您项目的一种配置):

      module.exports = 功能(咕噜声){ grunt.initConfig({
          // define source files and their destinations
          uglify: {
              files: { 
                  src: 'js/*.js',  // source files mask
                  dest: 'jsm/',    // destination folder
                  expand: true,    // allow dynamic building
                  flatten: true,   // remove all unnecessary nesting
                  ext: '.min.js'   // replace .js to .min.js
              }
          },
          watch: {
              js:  { files: 'js/*.js', tasks: [ 'uglify' ] },
          }
      });
      
      // load plugins
      grunt.loadNpmTasks('grunt-contrib-watch');
      grunt.loadNpmTasks('grunt-contrib-uglify');
      
      // register at least this one task
      grunt.registerTask('default', [ 'uglify' ]);
      
      };
    6. 完成后,您只需构建它。在控制台输入:

      咕哝

      或者 - 更好 - 如果你键入执行下面的命令 - grunt 将监视你的源文件的变化,如果你改变它们中的任何一个 - 它会自动构建它们:

      grunt watch --force

    然后您可以添加更多插件,例如:css 缩小、css 预处理器(less、sass、stylus)、jshint 等。

    【讨论】:

    • 嗨,谢谢你的帮助,但我不知道这将如何工作或解决我的问题,我做了所有的步骤,我得到了这个:运行“监视”任务等待......,我有要修改“gruntfile.js”中的代码,您的代码中有一些错误。我只想按时运行一些可以做我想做的事情(如上所述),谢谢
    • 嗨。抱歉出现错误(大量复制和粘贴)。如果你能看到“正在运行的监视任务……”那就太好了!只需保存您的 js 文件,然后 grunt 就应该构建它。或者只使用grunt 命令构建文件一次。
    • 嗨,对不起,这是我收到的新消息,我的 jsm 文件夹中没有创建任何内容:C:\npm>grunt --force Running "uglify:file1" (uglify) task Warning: Uglification failed. Used --force, continuing. Warning: Cannot read property 'min' of undefined Used --force, continuing. Running "uglify:my_plugins" (uglify) task Warning: Uglification failed. Used --force, continuing. Warning: Cannot read property 'min' of undefined Used --force, continuing. Done, but with warnings
    • 你可以做得更好 - 使用掩码,你可以将所有文件 uglify 为一个:uglify: { tests: { src: [ 'js/*.js' ], dest: 'jsm/tests.min.js' } },
    • 您可以将我的答案标记为“答案”(关闭主题)并点击旁边的向上箭头 :-) 我很乐意提供帮助!
    【解决方案2】:

    如果您使用的是 Linux/Mac 并且可以访问 bash,则可以对多个 JS 文件使用 uglifyjs,如下所示:

    rm *.min.js; for f in *.js; do short=${f%.js}; uglifyjs $f > $short.min.js; done
    

    【讨论】:

    • 您将如何递归地浏览脚本文件夹?我有一个 javascripts 文件夹,里面有诸如 polyfills 和库之类的目录。有没有办法只通过嵌套目录递归地运行 for 循环?
    • 我的解决方案递归地在任何路径上运行,并使用terser 作为uglifyjs 的替代品,因为它不支持ES6+ stackoverflow.com/a/65232798/2015609
    【解决方案3】:

    npm-only 方式:

    1. 运行:

      npm install uglifyjs-folder --save-dev
      
    2. 然后添加到您的package.json 类似:

      "uglifyjs": "uglifyjs-folder js -eo jsm"
      
    3. 然后运行:

       npm run uglifyjs
      

    请注意,如果您需要生成到与源文件相同的文件夹 (js),以下应该可以完成工作:

    1. 运行:

      npm install del-cli uglifyjs-folder --save-dev
      
    2. 然后添加到您的package.json 类似:

      "uglifyjs": "del js/*.min.js; uglifyjs-folder js -eo js"
      
    3. 然后运行:

       npm run uglifyjs
      

    【讨论】:

      【解决方案4】:

      除了上面的答案,我现在在我的 .bashrc 文件中设置了这个:

      alias minify='rm *.min.js; for f in *.js; do short=${f%.js}; uglifyjs $f > $short.min.js; done'
      

      【讨论】:

        【解决方案5】:

        uglify-js 不支持 ES6+ 所以我建议使用terser(安装它运行npm install terser -g) 在对任何路径递归执行 terser 的 shell 脚本下方:

        terser_path.sh

        #!/bin/bash
        
        ####
        # Tiny shell script for terser any JavaScript project
        # usage:
        # ./terser_path <path_to_your_project>
        ####
        
        path="$1"
        
        find $path -name '*.js' -type f | while read f
        do
            folderpath=$(dirname "$f")
            filename=$(basename "$f") 
            extension="${filename##*.}"
            filename="${filename%.*}"
            nf=$folderpath/$filename.min.$extension
        
        # ----- METHOD 1 : Replace the old file
        #    terser "$f" --output "$f" --compress --mangle
        # ----- METHOD 2 : Create .min.js file
            terser "$f" --output "$nf" --compress --mangle
             
        done
        

        【讨论】:

        • 这太棒了!但是,我遇到了一个问题,即函数名称没有被破坏。我尝试在 CLI 命令中添加 --module 以告诉它我正在使用 ES6 模块,这也应该自动启用 --keep-fnames=false,但它仍然对我不起作用。添加--keep-fnames=false 会导致错误
        【解决方案6】:

        你可以在 gruntfile.js 中使用这个配置:

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

        【讨论】:

        • 这不处理子文件夹? “dest”应该是什么,以便“app/app.js”和“mod/mod1.js”最终出现在“dest/app/app.min.js”和“dest/mod/mod1.min.js”中?
        • 同样的问题,这会跳过子文件夹。
        【解决方案7】:

        制作一个以每行开头的bat文件

        start uglifyjs app\main.js -mt sort -c -e -o app\main.ug.js
        start uglifyjs app\lib.js -mt sort -c -e -r myfunctionname -o app\lib.ug.js
        start uglifyjs app\controllers\bbbCtrl.js -mt sort -c  -o     app\controllers\bbbCtrl.ug.js
        start uglifyjs app\controllers\aaaCtrl.js -mt sort -c -e -o app\controllers\aaaCtrl.ug.js
        

        【讨论】:

          【解决方案8】:

          你可以使用这个 npm 模块包

           npm i uglify-js-minify-css-allfiles
           npm i uglify-js clean-css
          
          // making index.js file
          const minifyAll = require('uglify-js-minify-css-allfiles');
          
          // Folder Name (you will change all files in Folders)
          minifyAll('../test/');
          

          npm package site

          【讨论】:

            猜你喜欢
            • 2012-02-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多