При сжатии javascript-кода минификатор делает две основные вещи.
Есть несколько несложных приемов программирования, которые могут увеличить сжимаемость JS-кода.
function flyToMoon(moon) {
var spaceShip = new SpaceShip()
spaceShip.fly(moon.getDistance())
}
</div>
После минификации станет:
function flyToMoon(A) {
var B = new SpaceShip()
B.fly(A.getDistance())
}
Заведомо локальные переменные moon
, spaceShip
могут быть безопасно заменены на более короткие A,B
. Минификатор использует патченный открытый интерпретатор javascript, написанный на java: Rhino, он разбирает код, анализирует и собирает обратно с заменой, поэтому все делается корректно.
С другой стороны, название функции в этом скрипте - глобальная переменная, оно не сжимается, чтобы сохранить возможность обращения к функции.
По тем же причинам не сжимается вызов SpaceShip
и методы fly
, getDistance()
.
Итак, сделаем какой-нибудь более реальный скрипт и напустим на него YUI Compressor.
function SpaceShip(fuel) {
this.fuel = fuel
this.inflight = false
this.showWarning = function(message) {
var warningBox = document.createElement('div')
with (warningBox) {
innerHTML = message
className = 'warningBox'
}
document.body.appendChild(warningBox)
}
this.showInfo = function(message) {
var messageBox = document.createElement('div')
messageBox.innerHTML = message
document.body.appendChild(messageBox)
}
this.fly = function(distance) {
if (distance<this.fuel) {
this.showWarning("Мало топлива!")
} else {
this.inflight = true
this.showInfo("Взлетаем")
}
}
}
function flyToMoon() {
var spaceShip = new SpaceShip()
spaceShip.fly(1000)
}
flyToMoon()
К сожалению, в YUI Compressor нельзя отключить убивание переводов строки, поэтому получилось такое:
function SpaceShip(fuel){this.fuel=fuel;
this.inflight=false;this.showWarning=function(message){
var warningBox=document.createElement("div");
with(warningBox){innerHTML=message;
className="warningBox"
}document.body.appendChild(warningBox)
};this.showInfo=function(message){
var messageBox=document.createElement("div");
messageBox.innerHTML=message;
document.body.appendChild(messageBox)
};this.fly=function(distance){
if(distance<this.fuel){this.showWarning("Мало топлива!")
}else{this.inflight=true;
this.showInfo("Взлетаем")
}}}function flyToMoon(){var A=new SpaceShip();
A.fly(1000)};flyToMoon()
Если посмотреть внимательно - видно, что локальные переменные вообще не сжались внутри SpaceShip
, а сжались только в функции flyToMoon
.
ShrinkSafe замечательно сжимает все, что только может.
function SpaceShip(_1){
this.fuel=_1;
this.inflight=false;
this.showWarning=function(_3){
var _4=document.createElement("div");
with(_4){
innerHTML=_3
className="warningBox";
}
document.body.appendChild(_4);
};
this.showInfo=function(_5){
var _6=document.createElement("div");
_6.innerHTML=_5;
document.body.appendChild(_6);
};
this.fly=function(_7){
if(_7<this.fuel){
this.showWarning("Мало топлива!");
}else{
this.inflight=true;
this.showInfo("Взлетаем");
}
};
};
function flyToMoon(){
var _8=new SpaceShip();
_8.fly(1000);
};
flyToMoon();
Все локальные переменные заменены на более короткие _варианты.
Почему YUI не сжал, а ShrinkSafe справился?
Дело в конструкции with() { ... }
в методе showWarning
. Эти два компрессора по-разному к ней относятся.
ShrinkSafe игнорирует нелокальные названия переменных внутри with
:
// Было
with(val) {
prop = val
}
// Стало
with(_1) {
prop = _1
}
К сожалению, в последней версии ShrinkSafe есть баг: если переменная prop объявлена локально, то она заменяется:
// Было
var prop
with(val) {
prop = val
}
// Стало
var _1
with(_2) {
_1 = _2
}
Например, если val = { prop : 5 }
, то сжатая таким образом конструкция with
сработает неверно из-за сжатия prop
до _1
.
Впрочем, никогда не слышал, чтобы кто-то на такой баг реально напоролся. Видимо, люди локальные переменные не объявляют одноименные со свойствами аргумента with
, чтобы код понятнее был.
Внутри оператора with(obj)
никогда нельзя точно сказать: будет ли переменная взята из obj
или из внешней области видимости.
Поэтому никакие переменные внутри with сжимать нельзя.
А раз так - получается, что локальные переменные с именами, упомянутыми внутри with
тоже сжимать нельзя.
YUI Compressor почему-то (почему? есть идеи?) пошел еще дальше: он не минифицирует вообще никаких локальных переменных даже в соседних функциях.
Может быть, это баг (версия 2.3.5), а может - фича, не знаю. Будут идеи - пишите в комментариях. Например, локальные переменные функции fly
вполне можно было минифицировать.
Вывод:
YUI категорически не любит with.
ShrinkSafe любит, но с багофичей.
Если заменить функцию showWarning
на вариант без with
, то YUI сожмет код без проблем:
// вариант без with
this.showWarning = function(message) {
var warningBox = document.createElement('div')
warningBox.innerHTML = message
warningBox.className = 'warningBox'
document.body.appendChild(warningBox)
}
Результат сжатия YUI без with:
function SpaceShip(A){this.fuel=A;
this.inflight=false;this.showWarning=function(B){var C=document.createElement("div");
C.innerHTML=B;C.className="warningBox";
document.body.appendChild(C)
};this.showInfo=function(B){var C=document.createElement("div");
C.innerHTML=B;document.body.appendChild(C)
};this.fly=function(B){if(B<this.fuel){this.showWarning("Мало топлива!")
}else{this.inflight=true;
this.showInfo("Взлетаем")
}}}function flyToMoon(){var A=new SpaceShip();
A.fly(1000)}
В примере не сжались вызовы к объекту document
.
Для того, чтобы сжатие сработало, надо заменить обращение к глобальной переменной document
вызовом локальной функции.
Например, вот так:
function SpaceShip(fuel) {
/* сокращенные локальные вызовы */
var doc = document
var createElement = function(str) {
return doc.createElement(str)
}
var appendChild = function(elem) {
doc.body.appendChild(elem)
}
this.fuel = fuel
this.inflight = false
this.showWarning = function(message) {
var warningBox = createElement('div')
warningBox.innerHTML = message
warningBox.className = 'warningBox'
appendChild(warningBox)
}
this.showInfo = function(message) {
var messageBox = createElement('div')
messageBox.innerHTML = message
appendChild(messageBox)
}
this.fly = function(distance) {
if (distance<this.fuel) {
this.showWarning("Мало топлива!")
} else {
this.inflight = true
this.showInfo("Взлетаем")
}
}
}
Обращение к document
осталось в одном месте, что тут же улучшает сжатие:
(Здесь и дальше для сжатия использован ShrinkSafe, т.к он оставляет переводы строки.
Результаты YUI - по сути, такие же)
function SpaceShip(_1){
var _2=document;
var _3=function(_4){
return _2.createElement(_4);
};
var _5=function(_6){
_2.body.appendChild(_6);
};
this.fuel=_1;
this.inflight=false;
this.showWarning=function(_7){
var _8=_3("div");
_8.innerHTML=_7;
_8.className="warningBox";
_5(_8);
};
this.showInfo=function(_9){
var _a=_3("div");
_a.innerHTML=_9;
_5(_a);
};
this.fly=function(_b){
if(_b<this.fuel){
this.showWarning("Мало топлива!");
}else{
this.inflight=true;
this.showInfo("Взлетаем");
}
};
Как правило, в интерфейсах достаточно много обращений к document
, и все они длинные, поэтому этот подход может уменьшить сразу код эдак на 10-20%.
Функции объявлены через var
, а не function
:
var createElement = function(str) { // (1)
return doc.createElement(str)
}
// а не
function createElement(str) { // (2)
return doc.createElement(str)
}
Это нужно для ShrinkSafe, который сжимает только определения (1). Для YUI - без разницы, как объявлять функцию, сожмет и так и так.
Существуют различные способы объявления объектов.
Один из них - фабрика объектов, когда для создания не используется оператор new
.
Общая схема фабрики объектов:
function object() {
var private = 1 // приватная переменная для будущего объекта
return { // создаем объект прямым объявлением в виде { ... }
increment: function(arg) { // открытое свойство объекта
arg += private // доступ к приватной переменной
return arg
}
}
}
// вызов не new object(), а просто
var obj = object()
Прелесть тут состоит в том, что приватные переменные являются локальными, и поэтому могут быть сжаты. Кроме того, убираются лишние this
.
function SpaceShip(fuel) {
var doc = document
var createElement = function(str) {
return doc.createElement(str)
}
var appendChild = function(elem) {
doc.body.appendChild(elem)
}
var inflight = false
var showWarning = function(message) {
var warningBox = createElement('div')
warningBox.innerHTML = message
warningBox.className = 'warningBox'
appendChild(warningBox)
}
var showInfo = function(message) {
var messageBox = createElement('div')
messageBox.innerHTML = message
appendChild(messageBox)
}
return {
fly: function(distance) {
if (distance<this.fuel) {
showWarning("Мало топлива!")
} else {
inflight = true
showInfo("Взлетаем")
}
}
}
}
function flyToMoon() {
var spaceShip = SpaceShip()
spaceShip.fly(1000)
}
function SpaceShip(_1){
var _2=document;
var _3=function(_4){
return _2.createElement(_4);
};
var _5=function(_6){
_2.body.appendChild(_6);
};
var _7=false;
var _8=function(_9){
var _a=_3("div");
_a.innerHTML=_9;
_a.className="warningBox";
_5(_a);
};
var _b=function(_c){
var _d=_3("div");
_d.innerHTML=_c;
_5(_d);
};
return {fly:function(_e){
if(_e<this.fuel){
_8("Мало топлива!");
}else{
_7=true;
_b("Взлетаем");
}
}};
};
function flyToMoon(){
var _f=SpaceShip();
_f.fly(1000);
};
flyToMoon();
Максимально возможное использование локальных переменных, собственно, и улучшает минификацию. А некоторые подходы в этой статье - лишь иллюстрации.
ВОопщето вот лучший минимизатор!
http://dean.edwards.name/packer/
Это неправда.
packer не следует вообще использовать, если на сервере стоит mod_gzip/deflate/compress.
Однозначно сказать нельзя. В общем случае, да. Но не всегда
Приведите, пожалуйста, хоть один пример скрипта, на котором результат packer + gzip весит меньше, чем просто gzip.
*(gzip -9)
Дополнил статью по сжатию - смотрите в конец, там мои результаты по сжатию jQuery 1.3.2 с использованием php-packer 1.1, yui 2.4.2(он же - родной минифай) и gzip.
Да, действительно, gzip + packer могут работать вместе. Предполагаю, что это благодаря той части packer, которая реализует регэкспы. Регэкспы используют знание о структуре кода, которого нет у gzip.
Возможно, gzip + packer работали бы еще лучше вместе, если б из packer убрать псевдо-гзип и оставить только регэкспы.. Но тогда уже получится минифай вместо пакера.
Итого, лучше всех: yui + gzip.
P.S. Если еще есть что обсудить - лучше там, здесь все же статья по оптимизации для сжатия, а не по самому сжатию.
В Опере страничка отображается неправильно
Да, совсем забыл об этом
Оказались непротестаны изменения верстки в опере. Поправил.
К сожалению, все эти фишки актуальны только при отсутствии сжатия. Само сжатия уменьшает код раз в 5, поэтому дальнейшая оптимизация зачастую бессмысленна.
Зачастую сжатие в 5 раз еще не означает сжатие до нуля
Собственно не верное утверждение.
Ибо эти фишки можно использовать как обфускатор. Для запутывания кода.
А может лучше просто самому писать короткий код?
а после тебя трынь трава?
другой разработчик будет сидеть голову ломать?
имхо,писать лучше читабельным кодом.
с комментами.
а уже выкладывая проект в сеть,
шаманить над оптимизацией и т.д...
-
выкладывая и исходный вариант кода с доступом разработчику.
Коммент неудачно написал уровнем ниже....
А сам через месяц когда вернешься поправить баг и сразу в ступор.
Мы на работе договорились даже об определенной семантике названия объектов и т.п. Пусть даже они будут длинными. Зато поддерживать удобнее. При факте - что вероятнее всего другой разработчик будет этим заниматься.
ТС, за статью спасибо. Буквально на днях скрещивал Tortoise Svn с батниками и YUI Compressor. Теперь есть о чем подумать и как все это дело допилить еще лучше.
Для конкретного кода подходят разные типы сжатия кода.
Вообще, понравилась статья, узнал кое-что новое.
Зачастую сжатие в 5 раз еще не означает сжатие до нуля
а для чего вообще сжимать, зачем такие сложности?
Чтобы быстрее загружалось
Спасиб отличный сайт...
Отличный пакер!
Сделал простую обертку для запуска этого crunchy из командной строки:
Защитить код можно достаточно просто, помогут статьи.
Очень Помогли спасибо вам огромная.
Gun Mayhem 2
Interesting post. I Have Been wondering about this issue, so thanks for posting. Pretty cool post.It 's really very nice and Useful post.Thanks
click this site
I’ve read some good stuff here. Definitely worth bookmarking for revisiting. I surprise how much effort you put to create such a great informative website.
I recently came across your blog and have been reading along. I thought I would leave my first comment. I don't know what to say except that I have enjoyed reading. Nice blog. I will keep visiting this blog very often.
bitcoin news
That appears to be excellent however i am still not too sure that I like it. At any rate will look far more into it and decide personally!
ataque de pánico
I have a hard time describing my thoughts on content, but I really felt I should here. Your article is really great. I like the way you wrote this information.
Digital Marketing Agency
Great articles and great layout. Your blog post deserves all of the positive feedback it’s been getting.
https://champagne-pools.com
I am very happy to discover your post as it will become on top in my collection of favorite blogs to visit.
rico chandra kusuma
Just admiring your work and wondering how you managed this blog so well. It’s so remarkable that I can't afford to not go through this valuable information whenever I surf the internet!
go here
If you set out to make me think today; mission accomplished! I really like your writing style and how you express your ideas. Thank you.
https://worldsbestdogfoods.org/
I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
divorce lawyers colorado springs
I like this post,And I guess that they having fun to read this post,they shall take a good site to make a information,thanks for sharing it to me.
https://sportstv.io/en/watch-live/all-sports/upcoming
I have read your blog it is very helpful for me. I want to say thanks to you. I have bookmark your site for future updates.
read the article
Great job for publishing such a beneficial web site. Your web log isn’t only useful but it is additionally really creative too. There tend to be not many people who can certainly write not so simple posts that artistically. Continue the nice writing
learn here
Thank you so much for sharing this great blog.Very inspiring and helpful too.Hope you continue to share more of your ideas.I will definitely love to read.
look at this
Thank you for some other informative blog. Where else could I get that type of information written in such an ideal means? I have a mission that I’m just now working on, and I have been at the look out for such information.
TheFancyVoyager
If you set out to make me think today; mission accomplished! I really like your writing style and how you express your ideas. Thank you.
bioharzard cleanup
I just found this blog and have high hopes for it to continue. Keep up the great work, its hard to find good ones. I have added to my favorites. Thank You.
https://arkserverhosting.co.uk
I think that thanks for the valuabe information and insights you have so provided here.
Cardiovascular disease
Interesting post. I Have Been wondering about this issue, so thanks for posting. Pretty cool post.It 's really very nice and Useful post.Thanks
https://trulylovelykitchen.com
Great info! I recently came across your blog and have been reading along. I thought I would leave my first comment. I don’t know what to say except that I have.
dji mavic air
You make so many great points here that I read your article a couple of times. Your views are in accordance with my own for the most part. This is great content for your readers.
crime scene cleanup
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
go right here
Hi! Thanks for the great information you have provided! You have touched on crucuial points!
TLK
I found this is an informative and interesting post so i think so it is very useful and knowledgeable. I would like to thank you for the efforts you have made in writing this article.
hair dry machine
I was surfing net and fortunately came across this site and found very interesting stuff here. Its really fun to read. I enjoyed a lot. Thanks for sharing this wonderful information.
Boiler installation
I am very much pleased with the contents you have mentioned. I wanted to thank you for this great article.
psicologos en Madrid para adolescentes
This is a great inspiring article.I am pretty much pleased with your good work.You put really very helpful information. Keep it up. Keep blogging. Looking to reading your next post.
Orange County Air Conditioning Home Service
Thank you for another great article. Where else could anyone get that kind of information in such a perfect way of writing? I have a presentation next week, and I am on the look for such information.
hair dry machine
Its a great pleasure reading your post.Its full of information I am looking for and I love to post a comment that "The content of your post is awesome" Great work.
psicologos para adolescentes en Madrid
Thank you for such a well written article. It’s full of insightful information and entertaining descriptions. Your point of view is the best among many.
マリッジリング
Thanks for sharing nice information with us. i like your post and all you share with us is uptodate and quite informative, i would like to bookmark the page so i can come here again to read you, as you have done a wonderful job.
婚約指輪 福岡
Thank you so much for sharing this great blog.Very inspiring and helpful too.Hope you continue to share more of your ideas.I will definitely love to read.
search for company in cyprus
Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
エンゲージリング
I admit, I have not been on this web page in a long time... however it was another joy to see It is such an important topic and ignored by so many, even professionals. professionals. I thank you to help making people more aware of possible issues.
結婚指輪 手作り
Thanks for this great post, i find it very interesting and very well thought out and put together. I look forward to reading your work in the future.
temp-mail
I have been checking out a few of your stories and i can state pretty good stuff. I will definitely bookmark your blog
婚約指輪 福岡
I found that site very usefull and this survey is very cirious, I ' ve never seen a blog that demand a survey for this actions, very curious...
エンゲージリング
Awesome article! I want people to know just how good this information is in your article. It’s interesting, compelling content. Your views are much like my own concerning this subject.
ハワイアンジュエリー
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
婚約指輪 猫
Thanks for the nice blog. It was very useful for me. I'm happy I found this blog. Thank you for sharing with us,I too always learn something new from your post.
結婚指輪 手作り
I recently came across your blog and have been reading along. I thought I would leave my first comment. I don’t know what to say except that I have enjoyed reading. Nice blog, I will keep visiting this blog very often.
婚約指輪 福岡
I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
ハワイアンジュエリー 結婚指輪
Excellent .. Amazing .. I’ll bookmark your blog and take the feeds also…I’m happy to find so many useful info here in the post, we need work out more techniques in this regard, thanks for sharing.
barzo otslabvane
Thank you for such a well written article. It’s full of insightful information and entertaining descriptions. Your point of view is the best among many.
bemer mats
An fascinating discussion is value comment. I think that it is best to write extra on this matter, it won’t be a taboo topic however generally people are not enough to talk on such topics. To the next. Cheers
pulsed magnetic field therapy
i am for the first time here. I found this board and I in finding It truly helpful & it helped me out a lot. I hope to present something back and help others such as you helped me.
free classified ads
These are some great tools that i definitely use for SEO work. This is a great list to use in the future..
smart lighting
Thank you very much for sharing these links. Will definitely check this out..
I read that Post and got it fine and informative. Please share more like that...
New web site is looking good. Thanks for the great effort.
https://daisso.net
I really appreciate the kind of topics you post here. Thanks for sharing us a great information that is actually helpful. Good day!
click here
Wonderful article, thanks for putting this together! This is obviously one great post. Thanks for the valuable information and insights you have so provided here.
Most of the time I don’t make comments on websites, but I'd like to say that this article really forced me to do so. Really nice post!
click this site
Most of the time I don’t make comments on websites, but I'd like to say that this article really forced me to do so. Really nice post!
Cost consultants
Most of the time I don’t make comments on websites, but I'd like to say that this article really forced me to do so. Really nice post!
seo
Thank you for taking the time to publish this information very useful!
mudanças brasilia df
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
carpet cleaning
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
homeostasis
I can set up my new idea from this post. It gives in depth information. Thanks for this valuable information for all,..
immigration attorney
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
Akıllı Ev
This is a great inspiring article.I am pretty much pleased with your good work.You put really very helpful information. Keep it up. Keep blogging. Looking to reading your next post.
tra giam can vy tea
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
Birthday Cards
I just couldn't leave your website before telling you that I truly enjoyed the top quality info you present to your visitors? Will be back again frequently to check up on new posts.
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
Felixstowe window cleaner
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
aerial drone services
This article gives the light in which we can observe the reality. This is very nice one and gives indepth information. Thanks for this nice article.
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
abogado de lesiones
I haven’t any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.
retro games kopen
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
colon cleanse supplements
Very interesting blog. Alot of blogs I see these days don't really provide anything that I'm interested in, but I'm most definately interested in this one. Just thought that I would post and let you know.
colon cleanse supplements
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
angajari
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
Harley-Davidson Mens
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
Auftragsgewinnung im Handwerk
Your post content is being interested by a lot of people, I am very impressed with your post. I hope to receive more good articles. mapquest driving directions
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
artificial grass installers
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
Leeds tiler
Знакомства с девушками ))
I really enjoyed reading this post, big fan. Keep up the good work and please tell me when can you publish more articles or where can I read more on the subject?
buy a photo booth
This is a great inspiring article.I am pretty much pleased with your good work.You put really very helpful information...
3d printing Manchester
hello!! Very interesting discussion glad that I came across such informative post. Keep up the good work friend. Glad to be part of your net community.
derby printers
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
Lancaster roofer
Admiring the time and effort you put into your blog and detailed information you offer!..
buy a photo booth
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
mobile mechanic Reading
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
casas inteligentes
Thanks for sharing this quality information with us. I really enjoyed reading. Will surely going to share this URL with my friends.
car repair Reading
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
pest control Wakefield
I am not really into buying fashion items nowadays. With this whole pandemic going on, I would rather buy groceries and other household essentials than a pair of nice-looking jeans. Also, the brands mentioned here are subpar, to say the least. I can think of 5 other brands that have way better selections and more fashionable than these brands here. Also, they are pretty cheap compared to the brands here. If you want to see their wares you can click consists of game info and download. Or just visit this website bed wars.
I have not any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.
maison intelligente
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
Domotique
Wonderful blog! I found it while surfing around on Yahoo News. Do you have any suggestions on how to get listed in Yahoo News? I’ve been trying for a while but I never seem to get there! Appreciate it.
デジタルノマド
I love the way you write and share your niche! Very interesting and different! Keep it coming!
read more
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
Abonnenten kaufen PayPal
Thanks for sharing nice information with us. i like your post and all you share with us is uptodate and quite informative, i would like to bookmark the page so i can come here again to read you, as you have done a wonderful job.
Automação de Hotéis
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
digital marketing
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
mehr Abonnenten auf instagram
I know your expertise on this. I must say we should have an online discussion on this. Writing only comments will close the discussion straight away! And will restrict the benefits from this information.
Automação de Hotéis
Thanks for taking the time to discuss this, I feel strongly that love and read more on this topic. If possible, such as gain knowledge, would you mind updating your blog with additional information? It is very useful for me.
digital marketing
I appreciate everything you have added to my knowledge base.Admiring the time and effort you put into your blog and detailed information you offer.Thanks.
digital marketing
Really a great addition. I have read this marvelous post. Thanks for sharing information about it. I really like that. Thanks so lot for your convene.
house clearance bridgend
I have not any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.
alquiler de carros barranquilla
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
bridgend house clearance
Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic.
hartlepool removals
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
Heimautomation
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
tree surgeon in colchester
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
coronavirus holbox
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
Hausautomation
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
tree surgeon colchester
Whether you are looking for casual encounters you will find them here sex chat
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
best mexican food in cozumel
This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog..
آموزش سیستم هوشمند
I haven’t any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.
آموزش سیستم هوشمند
I can set up my new idea from this post. It gives in depth information. Thanks for this valuable information for all,..
covid holbox
Great Information sharing .. I am very happy to read this article .. thanks for giving us go through info.Fantastic nice. I appreciate this post.
belföldi fuvarozás megrendelésénél
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
otomatisasi rumah
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
otomatisasi rumah
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
megbízható pályázatírás Debrecen
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
how to get from cancun to cozumel
Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I'll be subscribing to your feed and I hope you post again soon. Big thanks for the useful info.
treatnheal
I really enjoyed reading this post, big fan. Keep up the good work and please tell me when can you publish more articles or where can I read more on the subject?
treatnheal
Thanks for this great post, i find it very interesting and very well thought out and put together. I look forward to reading your work in the future.
Automatyka domowa
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
bathroom vanity
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web!..
taroko gorge day tour
I can set up my new idea from this post. It gives in depth information. Thanks for this valuable information for all,..
RC car tips
Thanks so much for this information. I have to let you know I concur on several of the points you make here and others may require some further review, but I can see your viewpoint.
Long Island Rug Cleaning
I have been checking out a few of your stories and i can state pretty good stuff. I will definitely bookmark your blog
Area Rug Cleaning
You completed a few fine points there. I did a search on the subject and found nearly all persons will go along with with your blog.
Excellent website you have here, so much cool information!..
Area Rug Cleaning
If you want to find casual sex contacts with hot ladies in United Kingdom you must to visit hampshire personals
I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
things to do in cozumel
Your work is very good and I appreciate you and hopping for some more informative posts. Thank you for sharing great information to us.
staffing software
Thank you for helping people get the information they need. Great stuff as usual. Keep up the great work!!!
applicant tracking system
Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
Osteopathie Wiesbaden
This is my first time visit here. From the tons of comments on your articles,I guess I am not only one having all the enjoyment right here!
Heilpraktiker Wiesbaden
I found your this post while searching for some related information on blog search...Its a good post..keep posting and update the information.
Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
cozumel
You must to visit shemale escort bradford for your own casual chat experience in UK
Keep up the good work , I read few posts on this web site and I conceive that your blog is very interesting and has sets of fantastic information.
dizajnovy blog
Hello I am so delighted I located your blog, I really located you by mistake, while I was watching on google for something else, Anyways I am here now and could just like to say thank for a tremendous post and a all round entertaining website. Please do keep up the great work.
luxusny zahradny nabytok
Keep up the good work , I read few posts on this web site and I conceive that your blog is very interesting and has sets of fantastic information.
modern house architecture design
Impressive web site, Distinguished feedback that I can tackle. I am moving forward and may apply to my current job as a pet sitter, which is very enjoyable, but I need to additional expand. Regards.
body visualizer
hi was just seeing if you minded a comment. i like your website and the them you picked is super. I will be back.
I like this post,And I guess that they having fun to read this post,they shall take a good site to make a information,thanks for sharing it to me.
introverts definition
Nice to be visiting your blog once more, it has been months for me. Well this article that ive been waited for therefore long. i want this article to finish my assignment within the faculty, and it has same topic together with your article. Thanks, nice share.
how to calculate enterprise value using dcf
Thanks for your post. I’ve been thinking about writing a very comparable post over the last couple of weeks, I’ll probably keep it short and sweet and link to this instead if thats cool. Thanks.
dcf method
I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
denver to vail limo
The website is looking bit flashy and it catches the visitors eyes. Design is pretty simple and롤강의
a good user friendly interface.
nice post, keep up with this interesting work. It really is good to know that this topic is being covered also on this web site so cheers for taking time to discuss this!
구글광고대행
This is truly a great read for me. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work!.
macos tips
Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
All-Terrain Electric Wheelchair
I am happy to find your distinguished way of writing the post. Now you make it easy for me to understand and implement the concept. Thank you for the post.
android tips
This type of message always inspiring and I prefer to read quality content, so happy to find good place to many here in the post, the writing is just great, thanks for the post.
I admit, I have not been on this web page in a long time... however it was another joy to see It is such an important topic and ignored by so many, even professionals. professionals. I thank you to help making people more aware of possible issues.
프리서버
Very good points you wrote here..Great stuff...I think you've made some truly interesting points.Keep up the good work.
perfect health
This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free.
perfect health
Hi! Thanks for the great information you have provided! You have touched on crucuial points!
arete capital
Thank you for taking the time to publish this information very useful!
see this
I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
유흥사이트
Great Article it its really informative and innovative keep us posted with new updates. its was really valuable. thanks a lot.
aloevera products shop
Thanks you very much for sharing these links. Will definitely check this out..
롤 대리
I like this post,And I guess that they having fun to read this post,they shall take a good site to make a information,thanks for sharing it to me.
레플리카
I would like to say that this blog really convinced me to do it! Thanks, very good post.
레플리카
Your blog provided us with valuable information to work with. Each & every tips of your post are awesome. Thanks a lot for sharing. Keep blogging..
Cherada
melbourne shemale is great web platform for casual sex contacts with fine shemale in Australia
Nice to read your article! I am looking forward to sharing your adventures and experiences.
Playa Del Carmen real estate
This is highly information, crisp and clear. I think that everything has been described in systematic manner so that reader could get maximum information and learn many things.
book store in dubai
Spend some extratime and chat for free with hot sexy ladies on omaseks
Good post but I was wondering if you could write a litter more on this subject? I’d be very thankful if you could elaborate a little bit further. Appreciate it!
It was a very good post indeed. I thoroughly enjoyed reading it in my lunch time. Will surely come and visit this blog more often. Thanks for sharing.
Nice to read your article! I am looking forward to sharing your adventures and experiences.
https://mylifelogin.org/
Nice to read your article! I am looking forward to sharing your adventures and experiences.
https://mylifelogin.org/
This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post.!
Walworth valves uae
I have read your blog it is very helpful for me. I want to say thanks to you. I have bookmark your site for future updates.
Forged steel valves in dubai
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..wwwroblox.com redeem
Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
blackseed
Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
blackseed
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
minecraftskindex
I really like your take on the issue. I now have a clear idea on what this matter is all about..
UiPath freelancer
Your post is very helpful and information is reliable. I am satisfied with your post. Thank you so much for sharing this wonderful post. If you have any assignment requirement then you are at the right place. 안전놀이터추천
I am happy to find your distinguished way of writing the post. Now you make it easy for me to understand and implement the concept. Thank you for the post.
정보이용료현금화
nice post, keep up with this interesting work. It really is good to know that this topic is being covered also on this web site so cheers for taking time to discuss this!
things to do in mexicocancun
If you set out to make me think today; mission accomplished! I really like your writing style and how you express your ideas. Thank you.
cancun resorts
Transexuelle Sex Toulouse is great web platform for casual chat experience with fine ladies in France
Sextreffen ist die Dating-App, die ich empfehlen würde. Wenn man nur sehr wenig über eine Person weiß, kann die erste Kontaktaufnahme zu einer großen Herausforderung werden. Sie müssen sich durch ein Meer von Profilen wühlen, was es leicht macht, Menschen zu übergehen, denen man unter anderen Umständen vielleicht eine Chance gegeben hätte.
What is the weirdest forum topic which you have ever come across in your life? I found a couple, I can’t really list them here : D Alex
Doctors Gallery
The content you share is really helpful for me. I hope you will provide more great information. play retro games
it was a wonderful chance to visit this kind of site and I am happy to know. thank you so much for giving us a chance to have this opportunity..
Roksa jastrowie
Roksa swarzędz
Your article is very good and useful, thank you for sharing, bk8 hopes that next time you will have more good articles to send to all readers.
You completed a few fine points there. I did a search on the subject and found nearly all persons will go along with with your blog. rolet online
This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post.!
mature salope is web platform created for finding casual sex contacts with fine ladies in France
deri kalemlik deri kalemlik Bu sayede, oldukça eğlence bir kalemlik modeline sahip olabilirsiniz. Kalemlik kullanımında birçok kişi Lisanslı kalemlik almak istemektedir. Bu kişiler için de pek çok farklı lisansa sahip seçenekler sunulmaktadır. Tutulan takım ya da desteklenen herhangi bir yerin lisansına sahip olan bir kalemlik modelini, size sunulan seçenekler arasında oldukça kolay bir şekilde bulabilirsiniz. Kalem kullanmayı seven ve oldukça fazla kalemi olan kişiler için özel olarak tasarlanmış olan Kalemlik büyük modeller de bulunmaktadır. deri kalemlik
Makrome anahtarlık tasarımları şık ve dekoratif görünümleriyle günlük yaşamın her anında ve birçok alanında konfor sunar. makrome anahtarlık kaybolma sıkıntısından kurtaran ürünler, makrome anahtarlık onların hem güvende olmasını sağlar hem de anahtarlarınıza ihtiyaç duyduğunuz zamanlarda ulaşabilmenizi mümkün kılar.
Pg Slot สล็อต เว็บตรง เว็บสล็อตออนไลน์ แตกง่ายจ่ายจริง แจกหนัก แตกหนัง กับ เว็บ pg-slot.game ของเรา ที่กำลังมาแรง แซงเว็บเกมอันดับต้น ๆ ไปหมดแล้ว สมัครสมาชิกได้แล้ววันนี้
Pg slot สล็อต เว็บตรง เว็บสล็อตออนไลน์ แตกง่ายจ่ายจริง แจกหนัก แตกหนัง กับ เว็บ pg-slot.game ของเรา ที่กำลังมาแรง แซงเว็บเกมอันดับต้น ๆ ไปหมดแล้ว สมัครสมาชิกได้แล้ววันนี้
erkek kartlık
erkek kartlık Özellikle kendinizi hatırlatmak istediğiniz kişilere bu setlerden hediye alarak hediyenin anlamını daha da özel hale getirebilirsiniz. Sadece isim değil, dilediğiniz bir sözü ya da farklı bir kelimeyi de yazdırabilir ve hediyeyi çok daha anlamlı hale getirebilirsiniz. İş hayatına yeni atılmış gençlere, terfi almış erkek arkadaşlarınıza ya da hayatında önemli bir değişiklik yaşayan kişilere rahatlıkla Erkek kartlık satın alabileceğiniz erkek için kartlık setleri her zaman hatırlanmanızı garanti edecektir. Bu noktada dikkat edilmesi gereken en önemli unsur, kişinin hangi modelden hoşlandığını bilmektir. Kumaş pantolon giymeyi seven kişilere erkek uzun, mini kartlık çeşitleri ya da daha küçük kartlıklar satın almak kartlıkların daha sevilerek kullanılmasını sağlayacaktır. Erkek kartlık
makrome anahtarlık makrome anahtarlık
Thanks for every other informative site. The place else may just I get that kind of information check it written in such an ideal means? I have a venture that I’m just now operating on, and I have been on the look out for such information.
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
Thank you so much for the post you do. I like your post and all you share with us is up to date and quite informative, i would like to bookmark the page so i can come here again to read you, as you have done a wonderful job.
Restaurant Umsatz Booster
This website สล็อตเว็บตรง has received international standards. The system is constantly being updated with perfect system make all players can use the web service without interruption. สล็อตวอเลท there are professional staff to give advice and solve problems for all service users at all the times. With great service, เครดิตฟรี And no matter where you are, you can come to use our online slots games website just you have an internet. แจก เครดิตฟรี 50 Registered and play through the webpage right away. สล็อตเว็บตรง popular game camps in one place.
The camp สล็อตเว็บตรง is popular right now. สล็อตวอเลท Because it's easy to play, it's fun to play, adventure, challenge, joker and many games. เครดิตฟรี Easy to apply for membership with us, get free credits, free bonuses anytime, anywhere in top-up. แจก เครดิตฟรี 50 There are promotions for both new and old members. Deposit and withdraw with an automatic system, do not waste time waiting for a long time. สล็อตเว็บตรง a new online slot website that is ready to serve you 24 hours a day.
A mobile online slots game provider with a variety of games to choose from. It is a new type of game that allows players to win real money. สล็อตค่ายใหญ่ รวมค่าย สล็อตวอเลท เครดิตฟรี 24 ชั่วโมง สล็อตเว็บตรง แจกทุนให้เล่นฟรี เครดิตฟรี แค่สมัครรับไปเลยทันที จัดหนักจัดเต็ม แค่คลิกรับทันที สล็อตเว็บตรง easy game play There is a tutorial on how to play online slots games for beginners. Beautiful graphics in every game Make it not boring and exciting with unique in-game effects.. asv123df
At this moment the best slot from the camp สล็อตเว็บตรง is popular right now. Because it's easy to play, it's fun to play, adventure, challenge, slot and many games. เครดิตฟรี Easy to apply for membership with us, get free credits, free bonuses anytime, anywhere in top-up. สล็อตวอเลท Deposit and withdraw with an automatic system, do not waste time waiting for a long time. เครดิตฟรี 50 my-sa-gaming.me, สล็อตเว็บตรง a new online slot website that is ready to serve you 24 hours a day, will have a service to respond to all problems and questions from the administrators quickly. 19
pg PGSLOTAUTO789 Open up a new dimension of playing slots for you.
pg เว็บตรง On the website, we are open to try free online slots games. modern, beautiful pictures
slot pg Popular promotion that other websites don't have, don't dare to do with promotion 19 get 100
พีจี No.1 gaming website in Thailand, reliable, real money, fast transfer
pg pg auto 789 website straight from the famous website like PG SOFT
yes
any use for this tree services colchester
At this moment the best slot from the camp สล็อตเว็บตรง is popular right now. Because it's easy to play, it's fun to play, adventure, challenge, slot and many games. เครดิตฟรี Easy to apply for membership with us, get free credits, free bonuses anytime, anywhere in top-up. สล็อตวอเลท Deposit and withdraw with an automatic system, do not waste time waiting for a long time. เครดิตฟรี 50 my-sa-gaming.me, สล็อตเว็บตรง a new online slot website that is ready to serve you 24 hours a day, will have a service to respond to all problems and questions from the administrators quickly. 24
At this moment the best slot from the camp สล็อตเว็บตรง is popular right now. Because it's easy to play, it's fun to play, adventure, challenge, slot and many games. เครดิตฟรี Easy to apply for membership with us, get free credits, free bonuses anytime, anywhere in top-up. สล็อตวอเลท Deposit and withdraw with an automatic system, do not waste time waiting for a long time. เครดิตฟรี 50 my-sa-gaming.me, สล็อตเว็บตรง a new online slot website that is ready to serve you 24 hours a day, will have a service to respond to all problems and questions from the administrators quickly. 26
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://allhindiyojna.in/
The camp สล็อตเว็บตรง is popular right now. สล็อตวอเลท Because it's easy to play, it's fun to play, adventure, challenge, joker and many games. เครดิตฟรี Easy to apply for membership with us, get free credits, free bonuses anytime, anywhere in top-up. แจก เครดิตฟรี 50 There are promotions for both new and old members. Deposit and withdraw with an automatic system, do not waste time waiting for a long time. สล็อตเว็บตรง a new online slot website that is ready to serve you 24 hours a day.
ทันได้ไง
https://joker8899.app/
PG SLOT หนึ่งในค่ายผู้พัฒนาเกมสล็อตออนไลน์ สำหรับค่ายเกมสล็อต ณ ปัจจุบันมีมากมายหลายค่ายด้วยกันเล่นได้ที่ superslot 2022 ความนิยมของตัวผู้เล่นหรือจะเป็นจุกเด่นของแต่ละค่าย ก็มีเอกลักษณ์ที่ต้องบอกว่าแตกต่างกันอย่างเห็นได้ผชัด สำหรับทางค่ายเกมเองก็มุ่งเน้นที่จะพัฒนาและผลิตผลงานดี ๆ ออกมาเพื่อให้ตอบสนองต่อความต้องการของตัวผู้เล่นมากที่าสุด สำหรับค่าย PG SLOT
Thanks for this article
apostle.pl
คาสิโนออนไลน์ Website is open 24 hours, a lot of members. You can play anytime anywhere. easy to play. An admin to consult 24 hours. We have more players every day. The way to make money online. บาคาร่า New member you can receive 50 free credits. คาสิโนออนไลน์ With a beautiful graphics in every game Make it not boring and exciting with unique in-game effects. If you have a problem don’t worry, Admin ready to consult everybody all the time.
Wonderful article, thanks for putting this together! This is obviously one great post. Thanks for the valuable information and insights you have so provided here.
Flughafentransfer Nordzypern
สล็อตแตกง่าย A mobile online slots game provider with a variety of games to choose from. คาสิโนออนไลน์ It is a new type of game that allows players to win real money. สล็อตเว็บตรง easy game play There is a tutorial on how to play online slots games for beginners. คาสิโนออนไลน์ Beautiful graphics in every game Make it not boring and exciting with unique in-game effects. สล็อตวอเลท
A mobile online slots game provider with a variety of games to choose from. เครดิตฟรีกดรับเอง It is a new type of game that allows players to win real money. คาสิโนออนไลน์เว็บตรง easy game play There is a tutorial on how to play online slots games for beginners. รวมคาสิโนออนไลน์ Beautiful graphics in every game Make it not boring and exciting with unique in-game effects. Become a new millionaire with the most frequent jackpot online slots game. สล็อตออนไลน์เว็บตรง Even small bets get rewards.
A mobile online slots game provider with a variety of games to choose from. เครดิตฟรีกดรับเอง It is a new type of game that allows players to win real money. คาสิโนออนไลน์เว็บตรง easy game play There is a tutorial on how to play online slots games for beginners. รวมคาสิโนออนไลน์ Beautiful graphics in every game Make it not boring and exciting with unique in-game effects. Become a new millionaire with the most frequent jackpot online slots game. สล็อตออนไลน์เว็บตรง Even small bets get rewards.
สล็อตแตกง่าย A mobile online slots game provider with a variety of games to choose from. คาสิโนออนไลน์ It is a new type of game that allows players to win real money. สล็อตเว็บตรง easy game play There is a tutorial on how to play online slots games for beginners. คาสิโนออนไลน์ Beautiful graphics in every game Make it not boring and exciting with unique in-game effects. สล็อตวอเลท
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.