Оптимальное ООП с Google Closure Compiler
В javascript есть несколько основных стилей объявления объектов и свойств.
Они основаны на разной структуре кода, и поэтому - по-разному сжимаются компилятором.
Цель этой статьи - выбрать наилучший стиль ООП с точки зрения минификации кода и понять, почему ООП в таком стиле сжимается лучше всего.
Сжатие будет осуществляться продвинутым способом: --compilation_level ADVANCED_OPTIMIZATIONS .
Мы рассмотрим различные варианты ООП для виджета SayWidget с двумя приватными методами init, setElemById и публичным методом setSayHandler .
Кроме того, для проверки, как работает удаление недостижимого кода, в виджете будет присутствовать неиспользуемый метод unused
Первый стиль ООП основывается на классическом механизме наследования javascript, при котором свойства и методы берутся из прототипа.
function SayWidget(id) {
this.setElemById(id)
this.init()
}
SayWidget.prototype = {
init: function() {
this.elem.style.display = 'none'
},
setElemById: function(id) {
this.elem = document.getElementById(elem)
},
setSayHandler: function() {
this.elem.onclick = function() {
alert('hi')
}
},
unused: function() { alert("unused") }
}
window['SayWidget'] = SayWidget
SayWidget.prototype['setSayHandler'] = SayWidget.prototype.setSayHandler
Результат сжатия:
function a(b) {
this.c(b);
this.b()
}
a.prototype = {b:function() {
this.a.style.display = "none"
}, c:function() {
this.a = document.getElementById(elem)
}, d:function() {
this.a.onclick = function() {
alert("hi")
}
}};
window.SayWidget = a;
a.prototype.setSayHandler = a.prototype.d;
Как видно, все свойства. кроме экстернов, были заменены на короткие.
Что очень кстати, был удален неиспользуемый метод unused .
Этот метод, в принципе, аналогичен предыдущему, но методы добавляются в прототип по одному.
function SayWidget(id) {
this.setElemById(id)
this.init()
}
SayWidget.prototype.init = function() {
this.elem.style.display = 'none'
}
SayWidget.prototype.setElemById = function(id) {
this.elem = document.getElementById(id)
}
SayWidget.prototype.setSayHandler = function() {
this.elem.onclick = function() {
alert('hi')
}
}
SayWidget.prototype.unused = function() { alert("unused") }
window['SayWidget'] = SayWidget
SayWidget.prototype['setSayHandler'] = SayWidget.prototype.setSayHandler
После сжатия:
function a(b) {
this.a = document.getElementById(b);
this.a.style.display = "none"
}
a.prototype.b = function() {
this.a.onclick = function() {
alert("hi")
}
};
window.SayWidget = a;
a.prototype.setSayHandler = a.prototype.b;
А здесь - уже интереснее. Благодаря тому, что каждая функция описана отдельно, Google Closure Compiler может построить граф взаимодействий и заинлайнить функции. Что и произошло: в прототипе осталась только одна функция a.prototype.b (бывшая setSayHandler ).
В результате размер существенно уменьшился.
Это - концептуально другой подход: методы записываются не в прототип, а в сам объект во время создания. При этом приватные свойства и методы являются локальными переменными функции-конструктора.
В следующем коде находится два неиспользуемых метода unused : один публичный и один - приватный.
function SayWidget(id) {
var elem
setElemById(id)
init()
function init() {
elem.style.display = 'none'
}
function setElemById(id) {
elem = document.getElementById(id)
}
function unused() {
alert("unused")
}
this.setSayHandler = function() {
elem.onclick = function() {
alert('hi')
}
}
this.unused = function() {
alert("unused")
}
}
window['SayWidget'] = SayWidget
После сжатия:
function b(c) {
function d() {
a.style.display = "none"
}
function e(f) {
a = document.getElementById(f)
}
var a;
e(c);
d();
this.a = function() {
a.onclick = function() {
alert("hi")
}
};
this.b = function() {
alert("unused")
}
}
window.SayWidget = b;
Этот стиль ООП обычно сжимается лучше прототипного, т.к. обычный компрессор (или Google Closure Compiler в безопасном режиме) сжимает только локальные переменные.
Но продвинутый режим Google Closure Compiler уравнивает локальные переменные с обычными (кроме экстернов) - он сжимает и то и другое.
Поэтому никакого преимущества этот стиль ООП не показал. Более того, в данном компилятору не удалось ни заинлайнить вызовы ни удалить неиспользуемый публичный метод.
Последний из рассматриваемых стилей работает без вызова оператора new. Он просто возвращает объект с нужными методами.
// object = sayWidget(id)
function sayWidget(id) {
var elem
setElemById(id)
init()
function init() {
elem.style.display = 'none'
}
function setElemById(id) {
elem = document.getElementById(id)
}
function unused() {
alert("unused")
}
var me = { // новый объект
setSayHandler: function() {
elem.onclick = function() {
alert('hi')
}
},
unused: function() {
alert("unused")
}
}
me['setSayHandler'] = me.setSayHandler
return me
}
window['sayWidget'] = sayWidget
После сжатия:
function c(a) {
function d() {
b.style.display = "none"
}
function e(f) {
b = document.getElementById(f)
}
var b;
e(a);
d();
a = {a:function() {
b.onclick = function() {
alert("hi")
}
}, b:function() {
alert("unused")
}};
a.setSayHandler = a.a;
return a
}
window.sayWidget = c;
Результат аналогичен предыдущему.
Победил в итоге, вот сюрприз, самый длинный способ - добавление каждого свойства через прототип кодом вида: SayWidget.prototype.methodXXX = ... .
Более того, эта победа не случайна. Такой способ позволяет компилятору построить самый полный граф взаимодействий и произвести инлайны.
А определение функций в прототипе вместо замыкания - дает возможность успешно вырезать неиспользуемые символы. В результате - уменьшение размера кода.
В библиотеке Google Closure Library, под которую заточен Closure Compiler, используется именно такой стиль объявления свойств.
|
На самом деле можно еще описать класс в таком стиле:
var oop = {};
(function (ns){
function KeyType() {}
/**
* @constructor
*/
function TestObject() {
this._markedObj = new KeyType()
}
TestObject.prototype = {
_markedObj : null,
doIt: function() {
opns.addEvent("keydown", function(obj) {
return obj instanceof KeyType
})
},
getMarked: function() {
return this._markedObj
},
dummy: function(event) {
opns.isEvent(event)
}
}
/* export TestObject */
ns.TestObject = TestObject
})(oop)
В данной записи пространство имен oop будет содержать "публичный" класс TestObject, который в свою очередь использует "приватный" класс KeyType. В данном случае closure сможет убрать, к примеру, метод dummy, если он не используется. И вообще, похоже, closure сможет выполнить все оптимизации за исключением одной - вызов функции вводящей определение TestObject не будет заинлайнен.
У приведенного кода есть только одно преимущество перед описанным добавлением через прототип - этот способ позволяет вводить приватные сущности, используемые публично видимыми классами (типа KeyType в описанном примере).
К слову
a.prototype.b = ...;
a.prototype.setSayHandler = a.prototype.b;
- не полный аналог
a.prototype.setSayHandler = ...;
Полный аналог выглядел бы так:
a.prototype.b = ...;
a.prototype.setSayHandler = a.prototype.b;
delete a.prototype.b; // <<<<<
Короче, GCC не просто переименовывает свойства, а дублирует их, что теоретически может выйти боком, когда свойства по ходу дела меняются, или когда делается перебор свойств (например, для сериализации).
А что же делать, если unused - мое API в конструкторе для объекта, и самим объектом не используется, но используется внешним (либо другим js-кодом, либо даже flash'ом)? Получается он его похерит
окончательная декомпрессия этой кодовой последовательности с количеством циклов достаточна только для одного файла, если файлов больше, это будет невозможно, поэтому выберите более широкое поле и добавьте код, который автоматически дублирует количество циклов.
picos school
Anonse erotyczne wejherowo
Ogłoszenia erotyczne olx
Roksa grybow
Because all games in free games unblocked are currently unblocked, you might even utilize a smart device like a smartphone, iPad, or PC to play them at work or school.
This is a very great post and the way you express all your post details is too good. Thanks for sharing with us this useful post interior painting near me Raleigh NC
In addition, to test how removing unreachable code works, the widget will have an unused methodunused drywall contractors dallas tx
what are you waiting for snake games? You should click and challenge any players in the world.
There is nothing better than finding yourself a good game and playing at home on hot summer days. I recommend duck life to you.
I appreciate you sharing the facts and advice, and I will take them into consideration. The game traffic jam 3d is fun which you can try wherever you want.
A nagging sensation in the back of their heads compels them to come to a halt, but Riley is obligated to continue watching the tapes in amanda the adventurer
Articles with very interesting topics. 8 ball pool
All of the emoji characters are now accessible for you to copy and paste with ease (just copy them and then paste them into the editor of your choice).
Google Closure Compiler works well with modern stumble guys syntax, including classes. Using classes helps organize your code in a more structured and OOP-oriented manner.
Excellent piece! This is a fantastic site that I plan on revisiting numerous times throughout the year. I appreciate your informative blog. mini crossword
Кроме того, для проверки, как работает удаление недостижимого кода, в виджете будет присутствовать неиспользуемый метод unused sacramento ca drywall repair
This is a fantastic site that I plan on revisiting numerous slope
You have created a work that is very enjoyable to read, bringing enlightenment to every topic for us to acquire knowledge happy wheels. Thank you for sharing such information for us to read...
I thoroughly enjoyed your article play wordle; it was captivating and made my morning coffee even more delightful. Thank you for sharing such a high-quality piece.
Be able to create comparative themes with pleasure! Welcome here and you will discover what it should look like.먹튀신고
tiny fishing - Simple, pleasant and so good
This can certainly happen moto x3m
Very interesting article. This is my first time coming here fnaf. I found a lot of interesting things in your blog, especially the discussion therein. Thanks for the post! retro games
It gives me great pleasure to convey my sincere gratitude for the outstanding quality of the previously mentioned products. The writer has produced a remarkable and thought-provoking work that exhibits a strong command of language and the capacity to organize thoughts. papa's freezeria
Playing Sprunki Incredibox allows you to experiment with beats, melodies, and effects, offering endless possibilities for musical creation.
Sprunki Incredibox is a fan-created modification of the original Incredibox game, developed by passionate community members. This mod enhances the core gameplay with fresh soundscapes, unique visuals, and exciting new characters. Players can mix and match various beats, melodies, and effects to create their own musical masterpieces.
If you're into creative music games, you should definitely check out Sprunki Incredibox! It’s an amazing way to mix and match beats.
If you're into creative music games, you should definitely check out Sprunki Incredibox! It’s an amazing way to mix and match beats.
Tap Road encourages players to improve their reflexes and concentration.
Dive into Sprunki Incredibox, a user-friendly music-mixing game that expands on the original with exciting new elements.
Discover exciting online experiences with a variety of engaging platforms. Start by visiting Chat Gratuito for real-time conversations with friends. If you're into music, try creating unique beats on Incredibox Sprunki. For those who love adrenaline, enjoy the thrill of racing on Moto X3 Unblocked or test your agility in Parkour Civilization. Winter sports enthusiasts can have fun with Sled Rider 3D and Snow Rider 3D. If you are looking for casual games, explore the world of Sprunki Game or sharpen your reflexes in Stickman Hook Unblocked. These platforms promise endless fun and entertainment for all!
Looking for a diverse range of AI tools and entertainment? Explore sites like nudeai.beauty and uncensoredai.cc for unique AI-generated content. Try aihentaigenerator.fun and its extension stable-diffusion-hentai.aihentaigenerator.fun for specialized image generation. If visual creativity interests you, visit bingimagecreator.online or nsfwaiart.art. For interactive chats, check out nsfw-ai-chatbot.online or engage with the community at nsfwai.world.
Discover useful AI directories at aitoolsdirectory.online and explore productivity apps like viggleai.live, tdeecalculator.online, calculatorapp.online, and compoundinterestcalculator.site. Dive into creative writing at aistorygenerator.fun and explore LLaMA's capabilities on llamaai.online. If you love AI-generated art, don't miss aiartfree.online.
Explore more mystical content at cekkhodam.co, and use ai-detector.online to check for AI content. Design engaging covers at aicover.fun and experiment with AI-powered generators at flux-ai.online and bratgenerator.org. Enhance your writing with aitextgenerator.live and learn about new releases on blackmythwukong.buzz.
For book lovers, booksummary.wiki offers concise insights. Get access to AI chat services at chatgptgratuit.chat and chatgtponline.com. Discover Thai-based services on gauthai.pro, and explore recipes at bestrecipe.pro. Finally, satisfy your gaming needs with cookie-clicker-unblocked.pro and enhance your creativity with freakyfont.org.
There are many people who want to find more updates about this oops, and it is good to see the details here. By using the colorbond roof repair I saw a lot of great services that are providing us the right results.
This tool, How Old Do I Look, uses facial recognition to estimate your age. Perfect for some light-hearted fun!
Play Escape Road Game free and unblocked online ???? Escape games with fast driving challenges. Unlock cars like Ford Escape & dodge police terrains at school.
Play Sprunki Sprunked, the music game mod by Incredibox. Characters from sprunki, sprunked, and sprunki incredibox. Enjoy the free Sprunked Daytime Demo online.
Play Incredibox Abgerny game online free, with Abgerny Sprunki Mod and Cocrea. Explore sprunki incredibox and incredibox mod games along with abgerny wiki.
Immerse yourself in creative gaming worlds at https://sprunki-phase.online/ When playing online games, there are plenty of fun options to explore. First, try out https://block-blast.pro/, a free online Tetris puzzle game. Next, enjoy https://trafficracer.online/, where you can play free 3D racing car games. Don’t miss https://sprunkiparasite.com, which offers exciting Parasprunki Mod games, and finally, check out https://footballbros.online/, where you can dive into a world of football games and endless soccer fun.
Immerse yourself in creative gaming worlds at https://sprunki-phase.online/
Sprunki Phase Games brings fan-created twists to Incredibox, merging creative music-making with fresh gameplay.
Sprunki Phases brings together various popular versions of the Sprunki games, including Sprunki Phase 3, Sprunki Phase 4, and so on.
WEBFISHING is more than just casting a line. Jump into a sandbox environment where you can play the guitar, draw with chalk, and even have a bit of playful fun with your friends. This interactive space adds a creative and lighthearted touch to your fishing adventure, allowing you to unwind and enjoy the world in your own way.
Experience the future of music-making with Sprunki Retake, blending innovation, dynamic sounds, and interactive entertainment like never before.
Play https://sprunkiretake.online Incredibox Phases Horror Mod Games
Sprunki Mustard ???? Play Incredibox Mustard Sprunki Mod Games https://sprunki-mustard.online/
Download https://pvz-fusion.online PVZ Fusion Super Hybrid Mod APK & PC Game
Get https://airlinebutler.fun Airline Butler Streaming App for Movies & TV Shows
Play https://myfemboy-roommate.com My Femboy Roommate Online, Free Download APK & PC
Download https://homicipher.fun Homicipher APK Game for Android & PC
sprunki A super fun music-making website where you can create your own beats by dragging and dropping different characters. Each character makes unique sounds like beatbox, vocals, or effects. You can mix up to 8 different sounds to make cool music loops. It's really easy to use - no music skills needed! You can even record and save your creations to share with others. Perfect for killing time and getting creative with music.
Unleash your musical genius with FiddleBops Incredibox, on https://fiddlebopsincredibox.org/
Try this sprunki game: Sprunked 2.0
https://sprunked2.com
[html]
Incredibox Mustard
Dive into the world of Incredibox Mustard, where creative music-making meets stunning visuals in this innovative fan-made expansion.[html]
https://sprunkiphaseincredibox.com/
https://retrobowl25.org/
https://retrobowl25.org/
All Active Anime Reborn Codes https://animereborncodes.com , November 2024 ???? Latest Code
The Rise of the Golden Idol https://theriseofthegoldenidol.com/ ???? Walkthrough & Play The Case
Explore the joy of music creation with Sprunki Sinner Edition's innovative tools, charming characters, and unique sounds.
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.