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

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

B_8102802261615811_C


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

B_6512902261677395_C


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

B_5573002261628514_C


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

B_5053102261651266_C


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

B_3993202261631718_C


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

B_3053302261632696_C


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

B_2813402261624312_C


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

B_1893502261643414_C


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

B_2903602261690571_C


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

B_1913702261636665_C


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

B_2133802261638345_C


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

B_1013902261658912_C


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

B_0084002261641358_C


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

B_0404102261677152_C


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

B_9374102261612317_C


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

B_8194202261670152_C


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

B_7334302261698816_C


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

B_5864402261634279_C


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

B_4314502261675409_C


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

B_3234602261650756_C


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

B_4004702261644562_C


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

B_5224802261639039_C


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

B_3844902261613073_C


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

B_3125002261673023_C


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

B_2455102261631543_C


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

B_1255202261691323_C


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

B_1025302261614213_C


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

B_0545402261665064_C


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

B_0025502261684858_C


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

B_9315502261620094_C


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

B_9325602261682629_C


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

B_9445702261635665_C


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

B_8635802261675155_C


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

B_0060002261681523_C


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

B_8710002261642345_C


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

B_9970102261662603_C


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

B_8840202261636955_C


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

B_7730302261614149_C


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

B_8520402261637324_C


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

B_8550502261690907_C


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

B_7250602261675038_C


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

B_7090702261649196_C


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

B_5950802261689084_C


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

B_6180902261659931_C


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

B_6301002261669164_C


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

B_5931102261642585_C


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

B_4731202261637779_C


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

B_4441302261691578_C


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

B_6351402261668582_C


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

B_7111502261634823_C


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

B_5811602261666702_C


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

B_6201702261654818_C


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

B_6011802261633975_C


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

B_5491902261628301_C


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

B_4362002261698293_C


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

B_8312102261648185_C


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

B_9142202261686934_C


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

B_8712302261645204_C


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

B_7902402261672622_C


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

B_7982502261682935_C


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

B_8512602261688161_C


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

B_8732702261653329_C


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

B_9732802261631391_C


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

B_9182902261650285_C


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

B_9503002261689942_C


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

B_8313102261670383_C


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

B_8413202261671083_C


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

B_7293302261631089_C


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

B_7843402261640024_C


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

B_6613502261635043_C


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

B_7703602261635544_C


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

B_8283702261639054_C


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

B_7333802261675742_C


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

B_7083902261632702_C


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

B_8874002261641391_C


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

B_9854102261698330_C


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

B_8624202261626951_C


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

B_8494302261627393_C


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

B_9394402261681399_C


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

B_0334602261683295_C


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

B_1724702261637604_C


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

B_2444802261645554_C


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

B_1354902261625396_C


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

B_0145002261634845_C


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

B_0655102261675810_C


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

B_1455202261632090_C


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

B_1375302261673666_C


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

B_0865402261663835_C


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

B_1005502261628242_C


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

B_9665502261645113_C


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

B_9125602261628999_C


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

B_8605702261687880_C


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

B_8675802261611527_C


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

B_8335902261636563_C


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

B_7640002261624400_C


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

B_6930102261619202_C


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

B_6710202261672587_C


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

B_6840302261672563_C


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

B_6140402261687746_C


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

B_8710502261627484_C


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

B_7210602261644510_C


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

B_6700702261668614_C


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

B_8940802261656914_C


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

B_9700902261615170_C


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

B_8691002261634895_C


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

B_8581102261695105_C


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

B_8081202261679177_C


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

B_7131302261613625_C


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

B_6561402261671117_C


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

B_5621502261617314_C


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

B_5451602261652866_C


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

B_5631702261651194_C


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

B_5401802261684937_C


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

B_5271902261654710_C


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

B_4762002261633619_C


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

B_4412102261639500_C


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

B_3262202261634472_C


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

B_3492302261653408_C


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

B_3292402261628811_C


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

B_3032502261686732_C


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

B_2402602261629128_C


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

B_1422702261647651_C


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

B_3192802261647803_C


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

B_1672902261619804_C


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

B_1493002261697961_C


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

B_1173102261626794_C


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

B_2373202261690317_C


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

B_1043302261660476_C


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

B_0833402261650231_C


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

B_0073502261647662_C


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

B_9443502261654245_C


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

B_0973702261631035_C


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

B_0183802261696750_C


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

B_1163902261617045_C


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

B_2104002261614074_C


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

B_0834102261633475_C


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

B_0374202261671825_C


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

B_1324302261686586_C


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

B_9984302261661853_C


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

B_8934402261628734_C


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

B_8454502261694996_C


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

B_8384602261632270_C


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

B_7534702261640358_C


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

B_6944802261692624_C


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

B_6214902261668692_C


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

B_6105002261687544_C


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

B_5695102261627379_C


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

B_9325202261649692_C


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

B_1085402261654095_C


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

B_0585502261689377_C


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

B_1165602261648778_C


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

B_0205702261651013_C


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

B_9365702261659707_C


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

B_8265802261667746_C


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

B_0590002261614212_C


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

B_9390002261650705_C


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

B_8510102261630938_C


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

B_8950202261674944_C


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

B_8300302261646390_C


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

B_7930402261651862_C


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

B_7320502261624915_C


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

B_6410602261682626_C


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

B_6150702261643527_C


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

B_7210802261658125_C


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

B_8880902261622053_C


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

B_8851002261622377_C


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

B_8281102261664009_C


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

B_3591302261687874_C


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

B_2881402261624006_C


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

B_1531502261697501_C


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

B_1071602261662348_C


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

B_0031702261671213_C


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

B_0021802261698706_C


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

B_9511802261672249_C


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

B_8221902261635041_C


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

B_8502002261648365_C


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

B_8012102261657858_C


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

B_7182202261681377_C


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

B_6172302261694275_C


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

B_6222402261669815_C


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

B_5792502261675004_C


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

B_5032602261624290_C


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

B_4482702261675967_C


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

B_4702802261621363_C


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

B_4642902261686665_C


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

B_4183002261679571_C


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

B_3083102261629362_C


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

B_3073202261629501_C


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

B_4093302261660409_C


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

B_4453402261665700_C


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

B_3043502261635189_C


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

B_2793602261622966_C


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

B_2313702261697184_C


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

B_1283802261630798_C


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

B_1913902261617243_C


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

B_2724002261658764_C


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

B_1724102261628107_C


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

B_0794202261673744_C


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

B_0464302261618423_C


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

B_9354302261699509_C


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

B_8814402261654018_C


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

B_8444502261696987_C


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

B_8144602261632316_C


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

B_8114702261694116_C


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

B_6674802261645142_C


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

B_5594902261680144_C


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

B_5185002261696970_C


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

B_3695102261625755_C


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

B_2575202261647011_C


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

B_2385302261645409_C


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

B_1865402261658906_C


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

B_1195502261633491_C


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

B_1215602261639432_C


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

B_0925702261656010_C


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

B_0655802261627064_C


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

B_0305902261621269_C


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

B_9075902261613236_C


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

B_8190002261699469_C


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

B_7120102261675771_C


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

B_6280202261691667_C


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

B_5030302261674316_C


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

B_6020402261698867_C


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

B_0410702261650305_C


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

B_4970902261681209_C


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

B_6351002261684788_C


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

B_6001102261671944_C


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

B_5591202261698516_C


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

B_8111302261676533_C


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

B_0761502261623047_C


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

B_9981502261628968_C


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

B_0681702261630784_C


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

B_9811702261628136_C


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

B_0861902261649609_C


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

B_2202002261614813_C


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

B_7502102261682919_C


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

B_8132202261688898_C


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

B_7632302261646742_C


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

B_1212502261630464_C


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

B_1072602261667384_C


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

B_0052702261627866_C


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

B_1052802261688159_C


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

B_1652902261629947_C


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

B_0803002261622052_C


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

B_0533102261626244_C


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

B_9613102261665688_C


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

B_8513202261646384_C


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

B_7793302261672899_C


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

B_0503502261693343_C


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

B_2353602261649956_C


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

B_2683702261630366_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
Антиспам
1 + 4 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Реклама
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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