При сжатии 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
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.