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

Автор: A81.7301743598655Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_8843302261696775_C


Автор: A18.3698729036842Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_7883402261612052_C


Автор: A78.3503246654291Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_0663602261698113_C


Автор: A82.3940487059299Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_9893602261694219_C


Автор: A59.0763207511045Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_0743802261670289_C


Автор: A57.1599369545002Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_1553902261663767_C


Автор: A102.787724994589Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_0224002261652256_C


Автор: A60.7374103828333Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_9324002261658271_C


Автор: A18.9790834556334Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_9224102261626548_C


Автор: A100.588407641742Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_8864202261619919_C


Автор: A101.185992127983Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_8334302261684061_C


Автор: A85.8903347980231Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_7724402261637193_C


Автор: A57.7251907065511Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_7134502261678189_C


Автор: A104.938992653042Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_6394602261618951_C


Автор: A8.26663784380071Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_5254702261676838_C


Автор: A24.9989251247607Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_4164802261659354_C


Автор: A110.697261360241Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_4624902261658195_C


Автор: A41.3950097118504Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_5235002261680779_C


Автор: A4.81047629588284Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_7755102261681567_C


Автор: A53.7333760368638Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_8785202261652521_C


Автор: A83.2773869193625Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_2255402261694089_C


Автор: A99.8242287968751Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_1415502261692350_C


Автор: A105.111946080811Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_1555602261658787_C


Автор: A46.4031455616932Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_1215702261666404_C


Автор: A59.1900234008208Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_9975702261624380_C


Автор: A11.1744161141105Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_9185802261616949_C


Автор: A13.3362528621219Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_8065902261674640_C


Автор: A54.7689415847417Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_8580002261656511_C


Автор: A44.352802611189Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_7470102261650163_C


Автор: A84.2201904694084Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:01
#permalink

B_6610202261653704_C


Автор: A75.8072594041005Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_5570302261699353_C


Автор: A16.1250870977528Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4120402261664675_C


Автор: A99.1004579036962Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_2700502261622155_C


Автор: A108.552740640705Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_2760602261667872_C


Автор: A8.3618277234491Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_2350702261680682_C


Автор: A107.132246930385Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_1770802261621376_C


Автор: A12.8724038223736Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4520902261679463_C


Автор: A10.0626991793979Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4391002261667220_C


Автор: A29.2474420547951Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4561102261641442_C


Автор: A29.5032416805625Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_3791202261692199_C


Автор: A71.1697795665823Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_2271302261684080_C


Автор: A12.5010379473679Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_2331402261641539_C


Автор: A67.2223409414291Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4311502261690746_C


Автор: A104.179881494259Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4001602261626428_C


Автор: A72.7033810447901Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4551702261638609_C


Автор: A64.8430678553414Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4481802261633671_C


Автор: A38.0159236618783Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4371902261628315_C


Автор: A43.6595604652539Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_3742002261669742_C


Автор: A87.7861262192018Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_3412102261628907_C


Автор: A3.52550477092154Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_2602202261623132_C


Автор: A10.5284238879103Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_2772302261619292_C


Автор: A45.4893649981823Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_3372402261627702_C


Автор: A31.6270993149374Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_1722502261690197_C


Автор: A5.39630810567178Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_0522602261649462_C


Автор: A106.028748658486Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_9692602261686261_C


Автор: A92.7694058138877Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_8132702261675811_C


Автор: A27.6394935285207Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_7662802261680430_C


Автор: A39.8852017235477Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6522902261697532_C


Автор: A69.5577713556122Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_5983002261625715_C


Автор: A49.9773068230134Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4503102261637360_C


Автор: A21.9274095206056Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4093202261653350_C


Автор: A61.8543257494457Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4443302261612382_C


Автор: A23.6965676627588Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6123402261671761_C


Автор: A56.842512243893Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6503502261683389_C


Автор: A62.07391304872Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6423602261622716_C


Автор: A3.74988190527074Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_5993702261616933_C


Автор: A44.6548425271176Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4953802261640021_C


Автор: A43.9223350274842Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_7963902261673287_C


Автор: A104.317121156026Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_1364102261653099_C


Автор: A1.01171837956645Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_9744102261639109_C


Автор: A93.066423374461Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_8354202261664154_C


Автор: A72.2264101803303Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_7224302261636444_C


Автор: A99.5071443768684Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6384402261695049_C


Автор: A82.1119117713533Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6864502261629834_C


Автор: A103.618394043529Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_5774602261683307_C


Автор: A24.8515365226194Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6334702261619913_C


Автор: A79.8069602767937Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6274802261665689_C


Автор: A41.7374545815401Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_5204902261688812_C


Автор: A25.9235966932029Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_4115002261621848_C


Автор: A109.973238072591Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_2945102261676136_C


Автор: A44.9586973262485Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_1985202261692263_C


Автор: A37.8024462419562Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_0855302261677177_C


Автор: A86.1705892668106Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_9845302261651002_C


Автор: A1.93508460908197Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_8555402261648492_C


Автор: A72.0109474088531Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_7625502261652357_C


Автор: A65.3380290234927Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6925602261699438_C


Автор: A27.284855364589Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_7675702261643151_C


Автор: A38.9401730136015Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_7075802261653683_C


Автор: A29.5916942870244Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6835902261684731_C


Автор: A71.9709519306198Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_6380002261662628_C


Автор: A2.48559315875173Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_5540102261643336_C


Автор: A19.2751813761424Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:02
#permalink

B_5270202261680759_C


Автор: A23.4722708263434Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_5030302261626598_C


Автор: A51.8032833128236Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4040402261691629_C


Автор: A29.348816400161Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2590502261658029_C


Автор: A59.6801157023292Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2630602261619553_C


Автор: A83.6244648273569Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2820702261640688_C


Автор: A100.075374373002Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2950802261637932_C


Автор: A66.1897761120927Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_1790902261639828_C


Автор: A42.2754168568645Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_0611002261674685_C


Автор: A24.0581689523533Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_9111002261692544_C


Автор: A74.9450973349158Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_8341102261670353_C


Автор: A68.3115612999536Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_7071202261651601_C


Автор: A23.1188025518786Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_5761302261698231_C


Автор: A30.2278628221247Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_5751402261651302_C


Автор: A69.8820034547243Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4301502261660712_C


Автор: A48.6816763223615Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4341602261653043_C


Автор: A101.365994613385Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_3721702261679432_C


Автор: A31.979380461853Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_3991802261623111_C


Автор: A92.4838711938355Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_3781902261691932_C


Автор: A59.4072949562687Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2222002261627325_C


Автор: A73.7155070132576Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_3082102261637215_C


Автор: A31.0432548983954Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4992202261627495_C


Автор: A105.775609383127Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_6592302261636455_C


Автор: A68.9775303960778Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_6342402261671902_C


Автор: A51.5692634743173Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_7122502261682163_C


Автор: A98.0900015223306Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_7982602261648702_C


Автор: A101.514617482899Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_6502702261680982_C


Автор: A39.9376666154712Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_5412802261668186_C


Автор: A54.0947565394454Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_5062902261632981_C


Автор: A53.1656625112519Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4343002261644408_C


Автор: A1.61285360064358Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4253102261694787_C


Автор: A100.114211669192Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4793202261625436_C


Автор: A51.0479880245402Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4043302261680032_C


Автор: A25.0980074771214Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_3483402261622641_C


Автор: A0.551896460819989Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_3973502261612896_C


Автор: A85.5300549224485Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_3073602261648058_C


Автор: A72.5532942304853Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4413702261634227_C


Автор: A59.9677244487684Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4023802261679899_C


Автор: A103.462366293417Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_5253902261668519_C


Автор: A78.9503391268663Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_4674002261646923_C


Автор: A65.5698611761909Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_3164102261630518_C


Автор: A50.0949488785118Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2814202261697613_C


Автор: A95.9453700087033Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_1904302261679788_C


Автор: A41.3190833246335Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2724402261643828_C


Автор: A7.66241245740093Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2754502261663626_C


Автор: A54.93706232775Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_1924602261656019_C


Автор: A22.1546376580372Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_1934702261641595_C


Автор: A64.8830793311354Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2644802261616178_C


Автор: A54.8910193580668Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_3594902261662992_C


Автор: A56.5438055321574Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2995002261659073_C


Автор: A25.8722236154135Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_2145102261637273_C


Автор: A14.7312735971063Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_1155202261683385_C


Автор: A48.1569570552092Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_0455302261675182_C


Автор: A64.6106547508389Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_9585302261638877_C


Автор: A59.943818148924Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_9285402261648112_C


Автор: A58.1487091204617Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_8855502261645850_C


Автор: A49.0178355979733Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_7535602261657375_C


Автор: A41.1129993104842Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_6835702261685668_C


Автор: A58.967905825004Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_7975802261633889_C


Автор: A75.3521467382088Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_1780002261682229_C


Автор: A110.820981351659Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_1770102261687170_C


Автор: A94.0537799759768Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_1220202261620541_C


Автор: A77.1984937568195Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:03
#permalink

B_0980302261665713_C


Автор: A51.2621184757445Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_0790402261652833_C


Автор: A36.5368143722881Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_9400402261695981_C


Автор: A10.851882056566Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_9350502261628672_C


Автор: A4.2118939908687Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_7980602261649582_C


Автор: A104.620832054643Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_6440702261680088_C


Автор: A42.3726440866012Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5890802261615242_C


Автор: A37.571425416274Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_7540902261638429_C


Автор: A27.9933678412344Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_6281002261690333_C


Автор: A6.82564451289363Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5871102261681066_C


Автор: A41.075788855087Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5191202261662919_C


Автор: A8.44141323608346Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5021302261694644_C


Автор: A38.3916741090361Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_4451402261635161_C


Автор: A46.5824369955808Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_4111502261694780_C


Автор: A4.74282075092196Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5141602261623493_C


Автор: A70.5514604842756Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5961702261662510_C


Автор: A94.1572217799257Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5341802261699003_C


Автор: A95.5599323536735Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5021902261624868_C


Автор: A53.772562488215Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5452002261695317_C


Автор: A77.2920706998557Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_7802102261692007_C


Автор: A15.8387126962189Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_8352202261695535_C


Автор: A43.6546870758757Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_7262302261694873_C


Автор: A76.3201604022179Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_6532402261630983_C


Автор: A69.875882643275Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5752502261689984_C


Автор: A1.1305871300865Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_4612602261619044_C


Автор: A30.8586132754572Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_3822702261695258_C


Автор: A37.1017070033122Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_2692802261670229_C


Автор: A71.0959855068941Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1302902261639322_C


Автор: A69.5754326626193Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1813002261660876_C


Автор: A21.6618357987609Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1173102261621454_C


Автор: A18.0238865255378Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1563202261629216_C


Автор: A104.067794236355Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_0333302261630695_C


Автор: A67.3944218948018Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_8903302261686346_C


Автор: A40.4066214098129Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_8473402261678972_C


Автор: A51.0784613618162Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_7333502261656196_C


Автор: A57.5811063889414Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5913602261675263_C


Автор: A56.5782276566606Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5203702261639340_C


Автор: A96.535051234765Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5863802261619041_C


Автор: A66.7624273533002Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_6593902261614718_C


Автор: A65.3418347113766Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5764002261629650_C


Автор: A12.492432913743Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5604102261640140_C


Автор: A70.7222550425213Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_5004202261676010_C


Автор: A10.3201621896587Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_4144302261661531_C


Автор: A107.332562027732Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_3354402261650392_C


Автор: A48.2481311853044Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_3904502261656261_C


Автор: A40.5296932803467Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_3384602261613161_C


Автор: A88.5618468001485Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_3384702261687377_C


Автор: A48.6410984192044Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_2664802261690213_C


Автор: A32.3435708752368Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1644902261622975_C


Автор: A25.0159306868445Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1525002261650120_C


Автор: A75.8729540461209Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1305102261690177_C


Автор: A66.1445762836374Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_3905202261637209_C


Автор: A25.3676607578527Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_2815302261625661_C


Автор: A97.0240485949907Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1775402261661341_C


Автор: A35.8514310861938Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_2625502261636030_C


Автор: A103.107664837036Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1465602261641084_C


Автор: A56.0168674369343Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_1005702261622883_C


Автор: A55.7023949611466Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_0305802261689266_C


Автор: A50.0933362261858Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_9115802261660003_C


Автор: A73.0237019858323Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_8285902261669923_C


Автор: A89.1611498482525Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_8160002261632477_C


Автор: A99.4081006099004Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_6680102261675902_C


Автор: A42.0449264317285Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:04
#permalink

B_6660202261662702_C


Автор: A45.950032022316Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_5450302261682008_C


Автор: A23.221994106425Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_4160402261647765_C


Автор: A80.2948134366889Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_4510502261632156_C


Автор: A71.7689563916065Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_3620602261645737_C


Автор: A69.0432899845764Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_5440702261647805_C


Автор: A88.571385765681Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_7890802261624720_C


Автор: A7.35394364129752Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_7350902261660955_C


Автор: A30.114455313189Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_6061002261692696_C


Автор: A40.7418162832037Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_5291102261616190_C


Автор: A69.5284385229461Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_5341202261630616_C


Автор: A22.6487672890071Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_5651302261679300_C


Автор: A90.8676003436558Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_6021402261660948_C


Автор: A80.4262049950194Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_4791502261655188_C


Автор: A98.2138461603317Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_4571602261619429_C


Автор: A109.934779057978Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_4101702261687794_C


Автор: A72.4686459421646Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_3341802261686484_C


Автор: A23.3678248717915Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_2291902261643696_C


Автор: A109.974371780176Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_0742002261617974_C


Автор: A38.5539278306533Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_1632102261674340_C


Автор: A82.7494965686928Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_1772202261638364_C


Автор: A96.5456763028633Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_2142302261652503_C


Автор: A43.5868651459459Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_1242402261635251_C


Автор: A76.0195045983419Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_1252502261689156_C


Автор: A14.9936708339956Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_1372602261698482_C


Автор: A75.686792577384Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_0402702261687281_C


Автор: A39.9771848805249Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_0472802261681092_C


Автор: A54.3294982581865Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_9162802261661064_C


Автор: A27.3218583168928Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_7972902261699980_C


Автор: A23.911646337714Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_7093002261678382_C


Автор: A69.1955724447034Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_8233102261651405_C


Автор: A97.1519362481777Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_6833202261622857_C


Автор: A95.205454449635Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_5903302261690939_C


Автор: A6.12059260066599Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_5243402261685005_C


Автор: A13.4441337177996Гость (не зарегистрирован), дата: 26 февраля, 2014 - 16:05
#permalink

B_5403502261629013_C


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

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
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
Антиспам
2 + 6 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Реклама
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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