Параметры компилятора Closure

Я хочу использовать Closure Compiler для минимизации/сжатия JS-кода.

проблема в том, что она не минимизирует, как я ожидаю. рассмотрите приведенный ниже код. когда я передаю строку

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

Я ожидаю, что сокращенный код переименует «someArgument» на нечто гораздо более короткое, например «a».

так или иначе я делаю что-то неправильно? ТИА

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() );
}
1
nl ja de
Вы пробовали его с помощью инструментов командной строки?
добавлено автор Ja͢ck, источник

1 ответы

Вы используете setDebugOptionsForCompilationLevel() , вы хотите setOptionsForCompilationLevel() . Из источника это что 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).
 */
4
добавлено
спасибо Джейсону. но когда я устанавливал setDebugOptionsForCompilationLevel (), прежде чем я смог получить минимизированный результат, вызывая compiler.toSource (), и если я использую setOptionsForCompilationLevel (), я больше не могу этого делать. любая идея, как я могу получить минимизированный результат?
добавлено автор isapir, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async