Директива @define, удаление веток компилятором
Директива @define позволяет переопределить глобальную переменную (как правило, константу) в процессе компиляции. Компилятор заменит значение javascript-переменной на новое непосредственно в коде javascript.
А так как это константа, то сжатие продвинутым режимом позволяет тут же заинлайнить ее и оптимизировать соответствующие ветки if .
Например:
/** @define {number} */
var DEBUG_LEVEL = 5;
document.onclick = function() {
if (DEBUG_LEVEL > 3) console.log("clicked")
alert("click")
}
Станет при переопределении DEBUG_LEVEL=2 и сжатии обычным режимом:
var DEBUG_LEVEL = 2; // (замена!)
document.onclick = function() {
if (DEBUG_LEVEL > 3) console.log("clicked")
alert("click")
}
А при сжатии продвинутым режимом:
document.onclick = function() {
alert("click")
}
Как видно, переопределенная константа инлайнится, и лишние ветки кода удаляются. Это, разумеется, положительно влияет и на размер скрипта и на производительность.
Чтобы включить возможность переопределения, необходимо сделать аннотацию переменной вида:
/** @define {boolean} */
var myvar = 5
Для успешного определения @define должны соблюдаться следующие правила:
- Переменная должна быть глобальной и определена через var
- Тип переменной должен быть простейшим литеральным (строка, число, булево значение)
Кстати, имя переменной может быть любым, не обязательно БОЛЬШИМИ_БУКВАМИ.
Итак, в скрипте задана переопределяемая глобальная переменная . Следующий шаг - указание компилятору, на что ее заменять.
В документации описан флаг --define . Но на момент написания статьи он не работает, и вообще - его нет в исходных кодах.
Поэтому мы добавим свой флаг, как описано в статье про собственные флаги.
Флаг будет целочисленный.
Добавим его к описаниям флагов в (My)CompilerRunner :
@FlagSpec(help = "Debug level.")
public static final Flag<Integer> FLAG_debug_level = Flag.value(5);
Как видите, значение по умолчанию - 5. Это будет максимальный уровень отладки. Целочисленное значение выбрано из соображений удобства, можно было взять классический DEBUG/INFO/WARNING/...
Флаг добавлен. Теперь нужно из флага сделать установку компилятора на замену переменной.
Для этого дописываем соответствующую опцию в конец метода CompilerRunner#createOptions .
Добавление define производится одним из методов вида setDefineTo* , которые находятся в классе CompilerOptions .
Для целочисленного флага это будет setDefineToNumberLiteral :
options.setDefineToNumberLiteral("DEBUG_LEVEL", FLAG_debug_level.get());
Теперь после сборки ant'ом компилятор умеет распознавать новый флаг.
Код:
/** @define {number} */
var DEBUG_LEVEL = 5;
document.onclick = function() {
if (DEBUG_LEVEL > 3) console.log("clicked")
alert("click")
}
Запуск компилятора:
java -jar compiler.jar --js debug.js --debug_level 3
Даст нам следующий код:
var DEBUG_LEVEL = 3;
document.onclick = function() {
DEBUG_LEVEL > 3 && console.log("clicked");
alert("click")
};
Как видите, переопределение произошло успешно. Однако, лишняя ветка кода не была убрана.
Это произошло из-за того, что в обычном режиме компилятор не имеет права заинлайнить глобальную переменную DEBUG_LEVEL .
Для этого его необходимо запустить в продвинутом режиме:
java -jar compiler.jar --js debug.js --compilation_level ADVANCED_OPTIMIZATIONS --debug_level 3
Результат компиляции:
document.onclick = function() {
alert("click")
}
Таким образом, продвинутый режим дает возможность в полной мере воспользоваться преимуществами переопределения переменных.
Эта директива может применяться не только для отладки, но и для других настроек, которые точно известны во время компиляции.
Например, в библиотеке Google Closure Library, в файле dom/dom.js есть настройки:
/**
* @define {boolean} Whether we know at compile time that the browser is in
* quirks mode.
*/
goog.dom.ASSUME_QUIRKS_MODE = false;
/**
* @define {boolean} Whether we know at compile time that the browser is in
* standards compliance mode.
*/
goog.dom.ASSUME_STANDARDS_MODE = false;
То есть, если мы знаем, что наш сайт работает в STANDARDS MODE (есть правильный DOCTYPE ), то мы можем указать это компилятору, и он уберет из библиотеке лишние ветки кода, которые относятся к поддержке QUIRKS MODE .
Мы рассмотрели переопределение переменных при помощи аннотации @define и соответствующую недокументированую опцию компилятора.
Самое полезное применение, на мой взгляд - это существующая переменная COMPILED , значение которой при компиляции становится true и свой собственный LOG_LEVEL , который позволит автоматически вырезать ненужное логирование из production-кода.
Уже только это делает директиву @define весьма и весьма юзабельной.
Кстати, вот класс MyCompilerRunner с флагом и опцией:
package com.google.javascript.jscomp;
import com.google.common.flags.Flag;
import com.google.common.flags.FlagSpec;
import java.io.PrintStream;
public class MyCompilerRunner extends CompilerRunner {
@FlagSpec(help = "Debug level.")
public static final Flag<Integer> FLAG_debug_level = Flag.value(5);
/* всевозможные конструкторы */
public MyCompilerRunner(String[] args) {
super(args);
}
public MyCompilerRunner(String[] args, PrintStream out, PrintStream err) {
super(args, out, err);
}
/* изменить опции, в соответствие с новым флагом */
@Override
protected CompilerOptions createOptions() {
CompilerOptions options = super.createOptions();
options.setDefineToNumberLiteral("DEBUG_LEVEL", FLAG_debug_level.get());
return options;
}
/* точка входа в компилятор */
public static void main(String[] args) {
(new MyCompilerRunner(args)).run();
}
}
|
I am happy to find this post Very useful for me, as it contains lot of information. I Always prefer to read The Quality and glad I found this thing in you post. Thanks! https://www.tileinstallationtampafl.com/
Anonse erotyczne świdnica
Roksa pl anonse wszystkie
While you're scrolling through your feed, have you ever noticed that some posts have different fonts than others? Well, there's actually a tool for that! It's called Instagram Schrift, and it allows you to change the font of your Instagram posts.
The problems of life will be solved with the stickman fighter game, which is one of the popular new action games today.
Please play the game at any of your free time. I was also recommended this game by my friends slope io
There are a lot of fun, free games available on the internet these days, I usually play flagle because it's great for a lot of people, it feels so much fun when I guess the crossword correctly and get the highest score, are you ready to play?
For Retro Bowl success, it's important to have a well-rounded roster of players from all generations and positions. retro bowl
I think it is well worth taking a few growdle minutes to read the insightful information you offer. Thank you for that.
Life is a fun and easy-to-play board game that can be enjoyed by two to six players. Collect the most money and life tile value to win this game! life the game
You can try to play redactle unlimited all you want, but the information that has been supplied is current and helpful. Very captivating!
The fun of Monkey Mart unblocked! Play the game online for free and enjoy endless hours of entertainment No restrictions start playing now
Welcome to https://schriftarten.io/ - the ultimate font generator for anyone looking to add a unique, professional flair to their projects. Our wide selection of fonts allows you to pick out something special, and our user-friendly platform helps make the process effortless. Whether you’re searching for intricate calligraphy lettering, or something more contemporary with bold lines and modern symbols, Schriftarten.io has you covered.
A US judge refuses to permit Microsoft to acquire Activision. The development of shell shockers 2 might be hampered by this initiative.
I feel great playing world of mario game so that's why i want to share it with you.
Remember to always gamble rankdle responsibly and within your means. Good luck in your search for the perfect bookmaker!
When the weather outside is hot, staying indoors and playing a fun game is the best option. As a firm recommendation, wordle today
Как видите, переопределение произошло успешно. Однако, лишняя ветка кода не была убрана. drywall installation River Oaks
Challenge yourself with fnf game and see if you can conquer every round! The adrenaline rush you get from nailing those arrow keys in FNF is unbeatable!
Superfluous code branches are removed, and the overridden constant is inlined. fencing contractors christchurch
Amazing! The use of internal options and custom Buckshot Roulette flags in the Closure Inspector source code is so clean and organized.
You will have to fight other eggs on diverse and interesting maps in shell shockers.
This command is extremely effective. Bring benefits and save time for bob the robber
The attention to detail in this post is commendable. Well-researched!
The benefit of this kind of retaining wall wellington is that it can assist you in keeping your goods secure and out of harm's way.
Online games often require Geometry Dash persistence and patience, teaching players the value of perseverance.
Geometry Dash — популярный ритм-платформер, разработанный Робертом Топалой, основателем компании по разработке игр RobTop Games.
Can't get enough of Slope Unblocked game. The fast-paced action and simple controls make it a great game for quick sessions or longer playthroughs.
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.