Javascript.RU

Система сборки и зависимостей Google Closure Library

В этой статье мы рассмотрим систему сборки и зависимостей Google Closure Library.

А также увидим, как применить ее к своему коду, даже если вместо Google Closure Library используется совсем другой фреймворк.

Система зависимостей Google Closure Library имеет два основных декларативных метода: goog.provide и goog.require.

В javascript-файлах при помощи goog.provide указывается, какие символы предоставляет этот файл.

Символ - это имя javascript-объекта, который тут же можно использовать. Например:

goog.provide('my.super.dom')
my.super.dom.createElement = function() { ... }

Как видите, здесь мы декларируем, что файл объявляет символ my.super.dom, и goog.provide тут же создает пустой объект, используя для этого код, наподобие следующего:

my = window.my || {}
my.super = my.super || {}
my.super.dom = my.super.dom || {}

Так что существующие объекты и свойства не перезаписываются.

При помощи goog.require указывается, какие символы нужны. Указывать require принято после provide для лучшей читабельности кода.

Например:

goog.provide('goog.Delay');
goog.provide('goog.async.Delay');

goog.require('goog.Disposable');
goog.require('goog.Timer');

Функция goog.require лишь декларирует требование объекта и проверяет его. Она также может подгрузить нужный файл, но только если найдет его во внутренней структуре зависимостей.

Для добавления информации о зависимостях используется функция goog.addDependency.

Эта функция для каждого файла перечисляет список символов, которые он дает (provide) и которые требует (require).

Например:

goog.addDependency('/tmp/my/bye.js', ['my.bye'], ['my.main']);

Этот вызов добавляет в структуру зависимостей информацию, что файл bye.js предоставляет символ my.bye и требует my.main.

После такого вызова можно смело использовать goog.require('my.bye') - библиотека подгрузит файл /tmp/my/bye.js.

C другой стороны, если информация не была добавлена при помощи goog.addDependency - вызов goog.require('my.bye') завершится с ошибкой.

Для символов, объявленных в Google Closure Library, зависимости хранятся в корневой директории библиотеки, в файле deps.js.

Для ваших собственных символов и файлов вы должны либо прописать зависимости goog.addDependency самостоятельно, либо использовать для этого скрипт calcdeps.py (см. далее).

Для автоматической сборки и генерации файла зависимостей из ваших модулей используется скрипт calcdeps.py, поставляемый вместе с библиотекой.

Для его запуска под Windows можно использовать ActivePython, под Linux/MacOS - обычный python.

Эта утилита получает три основные опции:

-i file.js
входной javascript-файл, можно указать несколько
-p path/to/dir
список путей
-o script/deps/list/compiled
тип вывода

Например:

calcdeps.py -i hello.js -p /tmp/my -p /tmp/gc/closure-library -o script

В нашем примере /tmp/my - место, где хранятся файлы main.js, bye.js, hello.js, а /tmp/gc/closure-library - каталог с google closure library, которая взята из SVN.

Скрипт calcdeps.py делает следующие простые шаги:

  1. Рекурсивно проходит по всем директориям из списка -p, находит все файлы с расширением .js
  2. Для каждого файла - регулярными выражениями выцепляет списки, что ему надо (goog.require) и что он дает (goog.provide).
  3. В зависимости от типа вывода:
    deps
    Выводит набор директив goog.addDependency.
    В нашем случае это будет длинная простыня:
// This file was autogenerated by calcdeps.py
goog.addDependency('/tmp/my/bye.js', ['my.bye'], ['my.main']);
goog.addDependency('/tmp/my/hello.js', ['my.hello'], ['my.main']);
goog.addDependency('/tmp/my/main.js', ['my.main'], []);
goog.addDependency('/tmp/gc/closure-library/alltests.js', [], []);
goog.addDependency('/tmp/gc/closure-library/closure/goog/base.js', [], []);
goog.addDependency('/tmp/gc/closure-library/closure/goog/deps.js', [], []);
goog.addDependency('/tmp/gc/closure-library/closure/goog/array/array.js', ['goog.array'], []);
// ...

Первые несколько зависимостей взяты из файлов bye.js, main.js, hello.js, а остальные - построены из файлов Google Closure Library.

Свой deps.js в Closure Library

Если вы используете Google Closure Library, то можете загружать новый файл в качестве deps.js вместо стандартного.
Для этого нужно установить флаг:

// до загрузки base.js
goog.global.CLOSURE_NO_DEPS=true

(base.js перестанет подгружать стандартный deps.js) и загружать deps.js через отдельный тег <script>, либо формировать список зависимостей goog.addDependency каким-либо другим путем.

list
выводит список нужных файлов в порядке зависимостей.
В нашем случае:
/tmp/gc/closure-library/closure/goog/base.js
/tmp/my/main.js
hello.js

Других файлов для сборки не нужно.

script
собирает все входные файлы (-i) и требуемые для них в один файл.
В нашем случае это будет javascript-файл следующего вида:
// Input 0
содержание файла closure-library/closure/goog/base.js

// Input 1
содержание файла main.js

// Input 2 
содержание файла hello.js
compiled
Компилирует файл, полученный в результате сборки. При использовании этой опции обязательно указание флага --compiler_jar с путем до jar-файла с компилятором.

Кроме того, как правило, указываются и флаги компиляции. Чтобы вывести откомпилированный файл в o.js, вызовем calcdeps.py вот так:

calcdeps.py -i hello.js -p /tmp/my -p /tmp/gc/closure-library -o compiled \
--compiler_jar compiler.jar --compiler_flags "--js_output_file o.js"

Кавычки для передачи флагов компилятора должны быть двойными.

Обратите внимание - в результате компиляции не будет директив goog.provide/require. Это потому, что компилятор использует специальный проход для проверки зависимостей и удаления этих директив из итогового файла.

С другой стороны, после компиляции с обычным уровнем оптимизации в файле остается много лишнего. Если добавить экспорт какой-нибудь функции и указать флаг "--js_output_file o.js --compilation_level ADVANCED_OPTIMIZATIONS", то почти вся base.js исчезнет. Таким образом, overhead от использования системы сборки google будет сведен к минимуму.

Вообще, никто не заставляет использовать Google Closure Library. Для использования системы зависимости хватит base.js.

Так как calcdeps.py основан на регэкспах, условные директивы provide/require не поддерживаются. Утилита выхватит из файла все provide/require без разбора блока и местоположения в файле.

У функции goog.require есть один недостаток. Если встроенные зависимости Google Closure Library она загружает автоматически, то для собственных символов такой возможности не предусмотрено: нужно для каждого символа/файла прописывать goog.addDependency.

Чтобы упростить процесс, мы немного расширим goog.require, добавив автоматический подхват символов.

Исходный вариант:

goog.require = function(rule) {

  // if the object already exists we do not need do do anything
  // TODO: ...
  if (!COMPILED) {
    // если объект уже есть - возврат
    if (goog.getObjectByName(rule)) {
      return;
    }
    // получить путь к файлу с символом rule 
    var path = goog.getPathFromDeps_(rule);
    if (path) {
      // _writeScripts пишет <script> только 1 раз для каждого файла
      goog.included_[path] = true;
      goog.writeScripts_();
    } else {
      // файл не нашли
      var errorMessage = 'goog.require could not find: ' + rule;
      if (goog.global.console) {
        goog.global.console['error'](errorMessage);
      }

        throw Error(errorMessage);
    }
  }
};

Введем правило - символ a.b.c находится в файле a/b/c.js, и модифицируем функцию goog.require, чтобы она при отсутствии зависимости в списке загружала файл по этому правилу.

А чтобы было еще удобнее - добавим префиксы, которые будут указывать путь к каждому пространству имен. Например:

goog.namespacePrefixes = {
  'my': '/js/my'
}

Это будет означать, что goog.require('my.file') загрузит символ из /js/my/file.js.

Вот версия goog.require с соответствующими модификациями:

goog.require = function(rule) {
  if (!COMPILED) {
    if (goog.getObjectByName(rule)) {
      return;
    }
    var path = goog.getPathFromDeps_(rule);
    if (path) {
      goog.included_[path] = true;
    } else {
      path = rule.replace(/\./g,'/')+'.js'
      for(var prefix in goog.namespacePrefixes) {
       path = path.replace(new RegExp("^"+prefix), goog.namespacePrefixes[prefix])
      }
      goog.included_[path] = true;
      setTimeout(function() {
        if (goog.getObjectByName(rule)) {
          return
        }
        var errorMessage = 'goog.require could not find: ' + rule;
        if (goog.global.console) {
          goog.global.console['error'](errorMessage);
        }
        throw Error(errorMessage);
      }, 0)
    }
    goog.writeScripts_();
    
  }
};

В функции выше также оставлен контроль ошибок. В отличие от простого require, мы можем узнать, появился ли символ, только после загрузки файла, поэтому проверка обернута в setTimeout(..., 0). Такой вызов сработает сразу после синхронной загрузки script.

Вы можете пропатчить base.js или, что гораздо лучше, загрузить свой файл с новым require и префиксами, который перезапишет определение в base.js.

После этого goog.require начнет подгружать зависимости аналогично системе зависимостей в dojo toolkit и других фреймворках.

Можно расширить эту функциональность, добавить подгрузку вида goog.require('my.*'), более сложную логику нахождения файла по символу и т.п., но нужно ли?

При сборке нескольких модулей Google Closure Compiler проверяет зависимости require/provide, но при этом многомодульные сборки можно делать и без них, как описано в соответствующей статье.

Для удобства примеры в этой статье собраны в архив gbuild.zip.

Он содержит модифицированный require и иллюстрирует, как использовать систему сборки Google, даже если вы не используете Google Closure Library.

Содержимое:

goog 
  директория с base.js из Google Closure Library
my
  директория с нашими js-файлами, base_require.js содержит модифицированный require 
calcdeps.py
  стандартный calcdeps.py из Google Closure Library
compiler.jar
  стандартный Google Closure Compiler
compile.bat
   файл для компиляции hello.js с ADVANCED оптимизациями и зависимостями
hello.html
  файл-пример, использующий hello.js

Автор: 카지노사이트 (не зарегистрирован), дата: 14 августа, 2022 - 11:35
#permalink

What a post I've been looking for! I'm very happy to finally read this post. 카지노사이트 Thank you very much. Can I refer to your post on my website? Your post touched me a lot and helped me a lot. If you have any questions, please visit my site and read what kind of posts I am posting. I am sure it will be interesting.
gjgj


Автор: 카지노사이트추천 (не зарегистрирован), дата: 15 августа, 2022 - 06:03
#permalink

I'm writing on this topic these days, 카지노사이트추천 , but I have stopped writing because there is no reference material. Then I accidentally found your article. I can refer to a variety of materials, so I think the work I was preparing will work! Thank you for your efforts.


Автор: keonhacai (не зарегистрирован), дата: 15 августа, 2022 - 06:06
#permalink

Hello ! I am the one who writes posts on these topics keonhacai
I would like to write an article based on your article. When can I ask for a review?


Автор: sweetcandysp (не зарегистрирован), дата: 17 августа, 2022 - 10:18
#permalink

I like this post, And I guess that they having fun to read this post lewdle


Автор: 카지노사이트 (не зарегистрирован), дата: 17 августа, 2022 - 11:52
#permalink

What a post I've been looking for! I'm very happy to finally read this post. 카지노사이트 Thank you very much. Can I refer to your post on my website? Your post touched me a lot and helped me a lot. If you have any questions, please visit my site and read what kind of posts I am posting. I am sure it will be interesting.


Автор: 카지노사이트 (не зарегистрирован), дата: 17 августа, 2022 - 11:53
#permalink

What a post I've been looking for! I'm very happy to finally read this post. 카지노사이트 Thank you very much. Can I refer to your post on my website? Your post touched me a lot and helped me a lot. If you have any questions, please visit my site and read what kind of posts I am posting. I am sure it will be interesting.
)))))


Автор: 바카라사이트 (не зарегистрирован), дата: 18 августа, 2022 - 07:33
#permalink

Your information was very useful to me. That's exactly what I've been looking for 바카라사이트!


Автор: 카지노게임사이트 (не зарегистрирован), дата: 18 августа, 2022 - 07:34
#permalink

When I read an article on this topic, 카지노게임사이트 the first thought was profound and difficult, and I wondered if others could understand.. My site has a discussion board for articles and photos similar to this topic. Could you please visit me when you have time to discuss this topic?


Автор: 온라인카지노 (не зарегистрирован), дата: 18 августа, 2022 - 11:57
#permalink

While looking for articles on these topics, I came across this article on the site here. As I read your article, I felt like an expert in this field. I have several articles on these topics posted on my site. Could you please visit my homepage? 온라인카지노


Автор: 온라인카지노사이트 (не зарегистрирован), дата: 18 августа, 2022 - 11:57
#permalink

I accidentally searched and visited your site. I still saw several posts during my visit, but the text was neat and readable. I will quote this post and post it on my blog. Would you like to visit my blog later? 온라인카지노사이트
))))))


Автор: 카지노게임사이트 (не зарегистрирован), дата: 20 августа, 2022 - 06:43
#permalink

I was impressed by your writing. Your writing is impressive. I want to write like you.카지노게임사이트 I hope you can read my post and let me know what to modify. My writing is in I would like you to visit my blog.


Автор: 온라인바카라사이트 (не зарегистрирован), дата: 21 августа, 2022 - 09:26
#permalink

Your ideas inspired me very much. 온라인바카라사이트 It's amazing. I want to learn your writing skills. In fact, I also have a website. If you are okay, please visit once and leave your opinion. Thank you.


Автор: 바카라사이트 (не зарегистрирован), дата: 22 августа, 2022 - 12:41
#permalink

This is the perfect post.바카라사이트 It helped me a lot. If you have time, I hope you come to my site and share your opinions. Have a nice day.
fhffdh


Автор: 카지노게임사이트 (не зарегистрирован), дата: 23 августа, 2022 - 12:29
#permalink

When I read your article on this topic, the first thought seems profound and difficult. There is also a bulletin board for discussion of articles and photos similar to this topic on my site, but I would like to visit once when I have time to discuss this topic. 카지노게임사이트


Автор: 카지노게임사이트 (не зарегистрирован), дата: 24 августа, 2022 - 06:31
#permalink

When I read your article on this topic, the first thought seems profound and difficult. There is also a bulletin board for discussion of articles and photos similar to this topic on my site, but I would like to visit once when I have time to discuss this topic. 카지노게임사이트


Автор: 카지노게임사이트 (не зарегистрирован), дата: 24 августа, 2022 - 06:35
#permalink

When I read your article on this topic, the first thought seems profound and difficult. There is also a bulletin board for discussion of articles and photos similar to this topic on my site, but I would like to visit once when I have time to discuss this topic. 카지노게임사이트


Автор: 온라인카지노사이트 (не зарегистрирован), дата: 24 августа, 2022 - 12:34
#permalink

What a nice post! I'm so happy to read this. 온라인카지노사이트 What you wrote was very helpful to me. Thank you. Actually, I run a site similar to you. If you have time, could you visit my site? Please leave your comments after reading what I wrote. If you do so, I will actively reflect your opinion. I think it will be a great help to run my site. Have a good day.
sfđtgy


Автор: 카지노사이트추천 (не зарегистрирован), дата: 26 августа, 2022 - 09:39
#permalink

That's a great article! The neatly organized content is good to see. Can I quote a blog and write it on my blog? My blog has a variety of communities including these articles. Would you like to visit me later? 카지노사이트추천


Автор: 다낭 VIP마사지 (не зарегистрирован), дата: 29 августа, 2022 - 10:58
#permalink

You ought to be a part of a contest for just one of the finest blogs on the web. I am going to suggest this site. 다낭 VIP마사지 I hope you can read my post and let me know what to modify. My writing is in I would like you to visit my blog.


Автор: 바카라사이트추천 (не зарегистрирован), дата: 6 сентября, 2022 - 12:50
#permalink

That's a really impressive new idea! 바카라사이트추천 It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you.


Автор: 온라인카지노사이트 (не зарегистрирован), дата: 8 сентября, 2022 - 11:15
#permalink

I accidentally searched and visited your site. I still saw several posts during my visit, but the text was neat and readable. I will quote this post and post it on my blog. Would you like to visit my blog later? 온라인카지노사이트


Автор: 바카라사이트추천 (не зарегистрирован), дата: 17 сентября, 2022 - 12:57
#permalink

That's a really impressive new idea! 바카라사이트추천 It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you.


Автор: 온라인카지노사이트 (не зарегистрирован), дата: 21 сентября, 2022 - 04:46
#permalink

Really no matter if someone doesn't be aware of after that its up to other users that they will help, so here it takes place 온라인카지노사이트.


Автор: 카지노사이트 (не зарегистрирован), дата: 21 сентября, 2022 - 04:59
#permalink

What a post I've been looking for! I'm very happy to finally read this post. 카지노사이트 Thank you very much. Can I refer to your post on my website? Your post touched me a lot and helped me a lot. If you have any questions, please visit my site and read what kind of posts I am posting. I am sure it will be interesting.


Автор: 온라인카지노사이트 (не зарегистрирован), дата: 22 сентября, 2022 - 06:05
#permalink

What a nice post! I'm so happy to read this. 온라인카지노사이트 What you wrote was very helpful to me. Thank you. Actually, I run a site similar to you. If you have time, could you visit my site? Please leave your comments after reading what I wrote. If you do so, I will actively reflect your opinion. I think it will be a great help to run my site. Have a good day.
dcxgdss


Автор: nardleo (не зарегистрирован), дата: 23 сентября, 2022 - 12:16
#permalink

Good idea! Today's challenge starts with weaver game


Автор: 온라인카지노 (не зарегистрирован), дата: 24 сентября, 2022 - 07:27
#permalink

Your ideas have inspired me a lot. I want to learn your writing skills. There is also a website. Please visit us and leave your comments. Thank you. 온라인카지노
kkjhhgh


Автор: 바카라사이트 (не зарегистрирован), дата: 25 сентября, 2022 - 11:21
#permalink

Please let me know if you’re looking for a article writer for your site. You have some really great posts and I feel I would be a good asset. If you ever want to take some of the load off, I’d absolutely love to write some material for your blog in exchange for a link back to mine. Please send me an email if interested. Thank you 바카라사이트 I couldn't think of this, but it's amazing! I wrote several posts similar to this one, but please come and see!!
xdffdsd


Автор: 바카라사이트추천 (не зарегистрирован), дата: 26 сентября, 2022 - 12:55
#permalink

That's a really impressive new idea! 바카라사이트추천 It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you.


Автор: 카지노게임사이트 (не зарегистрирован), дата: 27 сентября, 2022 - 06:35
#permalink

It is my first visit to your blog, and I am very impressed with the articles that you serve. Give adequate knowledge for me. Thank you for sharing useful material. I will be back for the more great post. 카지노게임사이트 But by chance looking at your post solved my problem! I will leave my blog, so when would you like to visit it?!


Автор: 카지노사이트추천 (не зарегистрирован), дата: 5 октября, 2022 - 12:55
#permalink

I've been using WordPress on a number of websites for about a year and am worried about switching to another platform. I have heard good things about 카지노사이트추천. Is there a way I can transfer all my wordpress content into it? Any help would be really appreciated!
FHJJ


Автор: 온라인바카라사이트 (не зарегистрирован), дата: 10 октября, 2022 - 09:35
#permalink

We stumbled over here by a different website and thought I might check things out. I like what I see so now i am following you. Look forward to finding out about your web page again. 온라인바카라사이트


Автор: keo nha cai (не зарегистрирован), дата: 11 октября, 2022 - 06:26
#permalink

This is very interesting, You are a very skilled blogger. I've joined your rss feed and look forward to seeking more of your wonderful keo nha cai. Also, I have shared your website in my social networks!


Автор: keonhacai (не зарегистрирован), дата: 11 октября, 2022 - 07:26
#permalink

Really no matter if someone doesn't be aware of after that its up to other users that they will help, so here it takes place keonhacai.


Автор: 바카라사이트추천 (не зарегистрирован), дата: 13 октября, 2022 - 04:51
#permalink

I’m not sure exactly why but this weblog is loading incredibly slow for me. Is anyone else having this problem or is it a problem on my end? I’ll check back later on and see if the problem still exists. 바카라사이트추천


Автор: 바카라게임사이트 (не зарегистрирован), дата: 13 октября, 2022 - 04:51
#permalink

I'm so happy to finally find a post with what I want. 바카라게임사이트 You have inspired me a lot. If you are satisfied, please visit my website and leave your feedback.
sfs


Автор: 카지노사이트추천 (не зарегистрирован), дата: 14 октября, 2022 - 13:24
#permalink

Hello, I am one of the most impressed people in your article. 카지노사이트추천 I'm very curious about how you write such a good article. Are you an expert on this subject? I think so. Thank you again for allowing me to read these posts, and have a nice day today. Thank you.
dggg


Автор: 바카라게임사이트 (не зарегистрирован), дата: 21 октября, 2022 - 05:00
#permalink

I'm writing on this topic these days, 카지노사이트추천 , but I have stopped writing because there is no reference material. Then I accidentally found your article. I can refer to a variety of materials, so I think the work I was preparing will work! Thank you for your efforts.


Автор: 바카라게임사이트 (не зарегистрирован), дата: 22 октября, 2022 - 04:54
#permalink

I'm so happy to finally find a post with what I want. 바카라게임사이트 You have inspired me a lot. If you are satisfied, please visit my website and leave your feedback.


Автор: 바카라게임사이트 (не зарегистрирован), дата: 26 октября, 2022 - 11:59
#permalink

I'm so happy to finally find a post with what I want. 바카라게임사이트 You have inspired me a lot. If you are satisfied, please visit my website and leave your feedback.
ghhg


Автор: 카지노사이트 (не зарегистрирован), дата: 29 октября, 2022 - 09:55
#permalink

What a post I've been looking for! I'm very happy to finally read this post. 카지노사이트 Thank you very much. Can I refer to your post on my website? Your post touched me a lot and helped me a lot. If you have any questions, please visit my site and read what kind of posts I am posting. I am sure it will be interesting.
DXGGHH


Автор: 카지노사이트 (не зарегистрирован), дата: 30 октября, 2022 - 05:22
#permalink

What a post I've been looking for! I'm very happy to finally read this post. 카지노사이트 Thank you very much. Can I refer to your post on my website? Your post touched me a lot and helped me a lot. If you have any questions, please visit my site and read what kind of posts I am posting. I am sure it will be interesting.


Автор: 온라인카지노 (не зарегистрирован), дата: 30 октября, 2022 - 09:40
#permalink

I've been looking for photos and articles on this topic over the past few days due to a school assignment, 온라인카지노 and I'm really happy to find a post with the material I was looking for! I bookmark and will come often! Thanks


Автор: 카지노사이트 (не зарегистрирован), дата: 30 октября, 2022 - 12:26
#permalink

This is the post I was looking for. I am very happy to read this article. If you have time, please come to my site 카지노사이트 and share your thoughts. Have a nice day.
gjnjjn


Автор: 카지노커뮤니티 (не зарегистрирован), дата: 31 октября, 2022 - 09:17
#permalink

First of all, thank you for your post. 카지노커뮤니티 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^


Автор: 카지노사이트 (не зарегистрирован), дата: 31 октября, 2022 - 12:11
#permalink

This is the post I was looking for. I am very happy to read this article. If you have time, please come to my site 카지노사이트 and share your thoughts. Have a nice day.
FHGGG


Автор: 카지노사이트추천 (не зарегистрирован), дата: 6 ноября, 2022 - 13:19
#permalink

Hello, I am one of the most impressed people in your article. 카지노사이트추천 I'm very curious about how you write such a good article. Are you an expert on this subject? I think so. Thank you again for allowing me to read these posts, and have a nice day today. Thank you.
gjj


Автор: 온라인카지노사이트 (не зарегистрирован), дата: 9 ноября, 2022 - 11:55
#permalink

What a nice post! I'm so happy to read this. 온라인카지노사이트 What you wrote was very helpful to me. Thank you. Actually, I run a site similar to you. If you have time, could you visit my site? Please leave your comments after reading what I wrote. If you do so, I will actively reflect your opinion. I think it will be a great help to run my site. Have a good day.
dxggh


Автор: 온라인카지노 (не зарегистрирован), дата: 12 ноября, 2022 - 07:50
#permalink

Your ideas have inspired me a lot. I want to learn your writing skills. There is also a website. Please visit us and leave your comments. Thank you. 온라인카지노
fhjj


Автор: 바카라사이트 (не зарегистрирован), дата: 16 ноября, 2022 - 06:46
#permalink

This is the perfect post.바카라사이트 It helped me a lot. If you have time, I hope you come to my site and share your opinions. Have a nice day.
xdggh


Автор: Diede Ebbers (не зарегистрирован), дата: 16 ноября, 2022 - 21:02
#permalink

Salons is een prachtige landingspagina van schoonheidssalon scheduling software. Het is een intelligent online boekingsplatform dat schoonheidssalon bedrijven helpt een geweldige klantervaring te creëren. Super schoon en netjes ontwerp


Автор: 바카라게임사이트 (не зарегистрирован), дата: 18 ноября, 2022 - 05:40
#permalink

As I am looking at your writing, 바카라게임사이트 I regret being unable to do outdoor activities due to Corona 19, and I miss my old daily life. If you also miss the daily life of those days, would you please visit my site once? My site is a site where I post about photos and daily life when I was free.


Автор: 바카라게임사이트 (не зарегистрирован), дата: 18 ноября, 2022 - 05:41
#permalink

As I am looking at your writing, 바카라게임사이트 I regret being unable to do outdoor activities due to Corona 19, and I miss my old daily life. If you also miss the daily life of those days, would you please visit my site once? My site is a site where I post about photos and daily life when I was free.


Автор: 바카라게임사이트 (не зарегистрирован), дата: 18 ноября, 2022 - 05:41
#permalink

As I am looking at your writing, 바카라게임사이트 I regret being unable to do outdoor activities due to Corona 19, and I miss my old daily life. If you also miss the daily life of those days, would you please visit my site once? My site is a site where I post about photos and daily life when I was free.


Автор: 바카라게임사이트 (не зарегистрирован), дата: 18 ноября, 2022 - 05:41
#permalink

As I am looking at your writing, 바카라게임사이트 I regret being unable to do outdoor activities due to Corona 19, and I miss my old daily life. If you also miss the daily life of those days, would you please visit my site once? My site is a site where I post about photos and daily life when I was free.


Автор: 바카라게임사이트 (не зарегистрирован), дата: 18 ноября, 2022 - 05:42
#permalink

As I am looking at your writing, 바카라게임사이트 I regret being unable to do outdoor activities due to Corona 19, and I miss my old daily life. If you also miss the daily life of those days, would you please visit my site once? My site is a site where I post about photos and daily life when I was free.


Автор: 온라인바카라사이트 (не зарегистрирован), дата: 20 ноября, 2022 - 11:35
#permalink

Your ideas inspired me very much. 온라인바카라사이트 It's amazing. I want to learn your writing skills. In fact, I also have a website. If you are okay, please visit once and leave your opinion. Thank you.
cfhhj


Автор: 카지노커뮤니티 (не зарегистрирован), дата: 23 ноября, 2022 - 09:16
#permalink

First of all, thank you for your post. 카지노커뮤니티 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^


Автор: 카지노커뮤니티 (не зарегистрирован), дата: 23 ноября, 2022 - 09:16
#permalink

First of all, thank you for your post. 카지노커뮤니티 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^


Автор: 카지노커뮤니티 (не зарегистрирован), дата: 23 ноября, 2022 - 09:16
#permalink

First of all, thank you for your post. 카지노커뮤니티 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^


Автор: 카지노커뮤니티 (не зарегистрирован), дата: 23 ноября, 2022 - 09:17
#permalink

First of all, thank you for your post. 카지노커뮤니티 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^


Автор: 카지노커뮤니티 (не зарегистрирован), дата: 23 ноября, 2022 - 09:17
#permalink

First of all, thank you for your post. 카지노커뮤니티 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^


Автор: 카지노커뮤니티 (не зарегистрирован), дата: 23 ноября, 2022 - 09:18
#permalink

First of all, thank you for your post. 카지노커뮤니티 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^


Автор: 카지노커뮤니티 (не зарегистрирован), дата: 23 ноября, 2022 - 09:18
#permalink

First of all, thank you for your post. 카지노커뮤니티 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^


Автор: 카지노커뮤니티 (не зарегистрирован), дата: 23 ноября, 2022 - 09:18
#permalink

First of all, thank you for your post. 카지노커뮤니티 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^


Автор: 카지노사이트추천 (не зарегистрирован), дата: 23 ноября, 2022 - 09:42
#permalink

What an interesting story! I'm glad I finally found what I was looking for 카지노사이트추천.


Автор: 카지노사이트 (не зарегистрирован), дата: 25 ноября, 2022 - 11:48
#permalink

Of course, your article is good enough, 카지노사이트 but I thought it would be much better to see professional photos and videos together. There are articles and photos on these topics on my homepage, so please visit and share your opinions.


Автор: 카지노사이트 (не зарегистрирован), дата: 25 ноября, 2022 - 11:49
#permalink

Of course, your article is good enough, 카지노사이트 but I thought it would be much better to see professional photos and videos together. There are articles and photos on these topics on my homepage, so please visit and share your opinions.


Автор: myrakapoor, дата: 25 ноября, 2022 - 15:20
#permalink

I have you bookmarked your site to check out the new stuff you post. Come and check it out. Mumbai Escorts ||
Borivali Escorts Service ||


Автор: 온라인바카라사이트 (не зарегистрирован), дата: 26 ноября, 2022 - 10:10
#permalink

Your ideas inspired me very much. 온라인바카라사이트 It's amazing. I want to learn your writing skills. In fact, I also have a website. If you are okay, please visit once and leave your opinion. Thank you.


Автор: 카지노사이트 (не зарегистрирован), дата: 27 ноября, 2022 - 09:09
#permalink

I've been searching for hours on this topic and finally found your post. 카지노사이트 , I have read your post and I am very impressed. We prefer your opinion and will visit this site frequently to refer to your opinion. When would you like to visit my site?


Автор: 카지노사이트 (не зарегистрирован), дата: 27 ноября, 2022 - 09:10
#permalink

I've been searching for hours on this topic and finally found your post. 카지노사이트 , I have read your post and I am very impressed. We prefer your opinion and will visit this site frequently to refer to your opinion. When would you like to visit my site?


Автор: 카지노사이트 (не зарегистрирован), дата: 27 ноября, 2022 - 09:10
#permalink

I've been searching for hours on this topic and finally found your post. 카지노사이트 , I have read your post and I am very impressed. We prefer your opinion and will visit this site frequently to refer to your opinion. When would you like to visit my site?


Автор: 카지노사이트 (не зарегистрирован), дата: 29 ноября, 2022 - 06:27
#permalink

I've been searching for hours on this topic and finally found your post. 카지노사이트 , I have read your post and I am very impressed. We prefer your opinion and will visit this site frequently to refer to your opinion. When would you like to visit my site?


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
6 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum