5

我正在尝试使用 grunt 和 terser 缩小 angularjs 应用程序。我首先使用了 uglifiy-es,但后来读到它有一些问题。所以我尝试了简洁。但输出并没有给我缩小文件。

gruntfile.js

    module.exports = function(grunt) {
  grunt.initConfig({
      pkg: grunt.file.readJSON('package.json'),
        //grunt task configuration will go here
        ngAnnotate: {
          options: {
              singleQuotes: true
          },
          app: {
              files: {
                  './public/min-safe/js/_config_min.js': ['./controllers/_config.js'],
                  './public/min-safe/js/ctrl_accountingdashboard.js': ['./controllers/ctrl_accountingdashboard.js'], 

              }
          }
      },
      concat: {
        js: { //target
            src: ['./public/min/app.js', './public/min-safe/js/*.js'],
            dest: './public/min/app.js'
        }
    },
    terser: {
      options: {},
      files: {
        './public/min/app.js': ['./public/min/app.js'],
      },
    }
  });

  //load grunt tasks
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-terser');
  grunt.loadNpmTasks('grunt-ng-annotate'); 

  //register grunt default task
  grunt.registerTask('default', ['ngAnnotate', 'concat', 'terser']);

}
4

3 回答 3

5

我有同样的问题。根据文档,这应该可以工作,但对我没有用。将“文件”设置包装在自定义目标中对我有用:

terser: {
  options: {},
  main: {
    files: {
      './public/min/app.js': ['./public/min/app.js'],
    }
  }
}
于 2019-06-13T08:52:35.613 回答
4

添加到@Tim 的最佳答案:
这是一个允许使用路径/文件通配符模式(通配符)运行 grunt-terser 的示例——它不支持开箱即用。

请注意帮助程序属性_src_destterser 配置中的 grunt-terser 本身而不是任务读取的terser_all。此任务扩展了 globbing 模式并在属性中_src构建了真实配置。files完成后,它会使用更新的配置运行更简洁。

module.exports = function (grunt) {
    grunt.initConfig({
        terser: {
            dist: {
                options: {
                    compress: {
                        drop_console: true   // remove console.log, console.info, ...
                    }
                },
                files: {
                    // FILLED through terser_all task below!

                    // Examples config:
                    // "dist/example.js": [ "path/to/files/example.js" ]
                    // "dist/example_joined.js": [ "path/to/files/*.js" ]

                },
                // -----
                // HELPER PROPERTIES to build the files prop (see above) in the terser_all task below.
                _src: [
                    "path/to/files/*.js"
                ],
                _dest: "dist/"
            }
        }
    });

    grunt.registerTask('terser_all', function () {
        // work on this target in terser config
        var terser_target_name = "dist";

        // read the terser config
        var terser_config = grunt.config.get('terser') || {};
        var terser_target_config = terser_config[terser_target_name] || {};

        // get the destination dir
        var destDir = terser_target_config._dest;

        // loop through all source files and create an entry in the terser config for each of it
        var files = grunt.file.expand(terser_target_config._src);
        for (const [i, file] of files.entries()) {
            grunt.log.writeln(file);
            // add this file to the terser config as:  dest_file: src_file
            terser_target_config.files[destDir + file] = file;
        }

        // show new config on CLI
        grunt.log.writeflags(terser_target_config);

        // write back config and run task
        grunt.config.set('terser', terser_config);
        grunt.task.run('terser');
    });

    grunt.loadNpmTasks('grunt-terser');

    grunt.registerTask('build', ['terser_all']);
    grunt.registerTask('default', ['build']);
};
于 2020-11-11T10:39:07.283 回答
0

请注意:如果您尝试通过重命名来“禁用”某些选项,则会禁用整个过程。至少这是我的结果grunt-terser。我留下了原始的js文件。

{
   mangleX: {
          reserved: [/* ... */]
   }
}
于 2021-01-07T08:13:49.033 回答