Closure编译器选项

我想使用Closure Compiler来缩小/压缩JS代码。

问题是它不会像我期望的那样缩小。 考虑下面的代码。 当我传递字符串

var func = function ( someArgument ) { alert ( someArgument ); return someArgument; } 

我希望缩小的代码将“someArgument”重命名为更短的内容,比如“a”。

这是它的方式或我做错了什么? TIA

 public static void Compress( String src ) { ByteArrayOutputStream err = new ByteArrayOutputStream(); CompilerOptions opt = new CompilerOptions(); CompilationLevel.ADVANCED_OPTIMIZATIONS.setDebugOptionsForCompilationLevel( opt ); Compiler.setLoggingLevel( Level.OFF ); Compiler compiler = new Compiler( new PrintStream( err ) ); compiler.disableThreads(); List externs = Collections.emptyList(); List inputs = Arrays.asList( SourceFile.fromCode( "javascript-code.js", src) ); Result result = compiler.compile( externs, inputs, opt ); System.out.println( "source: " + compiler.toSource() ); } 

您正在使用setDebugOptionsForCompilationLevel() ,您需要setOptionsForCompilationLevel() 。 从Source这是setDebugOptionsForCompilationLevel正在做的事情:

 public void setDebugOptionsForCompilationLevel(CompilerOptions options) { options.anonymousFunctionNaming = AnonymousFunctionNamingPolicy.UNMAPPED; options.generatePseudoNames = true; options.removeClosureAsserts = false; // Don't shadow variables as it is too confusing. options.shadowVariables = false; } 

虽然这是setOptionsForCompilationLevel()正在做的事情:

 // All the safe optimizations. options.dependencyOptions.setDependencySorting(true); options.closurePass = true; options.foldConstants = true; options.coalesceVariableNames = true; options.deadAssignmentElimination = true; options.extractPrototypeMemberDeclarations = true; options.collapseVariableDeclarations = true; options.convertToDottedProperties = true; options.rewriteFunctionExpressions = true; options.labelRenaming = true; options.removeDeadCode = true; options.optimizeArgumentsArray = true; options.collapseObjectLiterals = true; options.protectHiddenSideEffects = true; // All the advance optimizations. options.removeClosureAsserts = true; options.aliasKeywords = true; options.reserveRawExports = true; options.setRenamingPolicy( VariableRenamingPolicy.ALL, PropertyRenamingPolicy.ALL_UNQUOTED); options.shadowVariables = true; options.removeUnusedPrototypeProperties = true; options.removeUnusedPrototypePropertiesInExterns = true; options.collapseAnonymousFunctions = true; options.collapseProperties = true; options.checkGlobalThisLevel = CheckLevel.WARNING; options.rewriteFunctionExpressions = true; options.smartNameRemoval = true; options.inlineConstantVars = true; options.setInlineFunctions(Reach.ALL); options.inlineGetters = true; options.setInlineVariables(Reach.ALL); options.flowSensitiveInlineVariables = true; options.computeFunctionSideEffects = true; // Remove unused vars also removes unused functions. options.setRemoveUnusedVariables(Reach.ALL); // Move code around based on the defined modules. options.crossModuleCodeMotion = true; options.crossModuleMethodMotion = true; // Call optimizations options.devirtualizePrototypeMethods = true; options.optimizeParameters = true; options.optimizeReturns = true; options.optimizeCalls = true; 

从技术上讲,SIMPLE_OPTIMIZATIONS会为您提供参数重命名。如果高级启动会导致代码出现问题(同样来自源代码):

 /** * SIMPLE_OPTIMIZATIONS performs transformations to the input JS that do not * require any changes to JS that depend on the input JS. For example, * function arguments are renamed (which should not matter to code that * depends on the input JS), but functions themselves are not renamed (which * would otherwise require external code to change to use the renamed function * names). */