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

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

B_1722802261511488_C


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

B_0512902261593711_C


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

B_9562902261515508_C


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

B_8653002261539299_C


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

B_7453102261594945_C


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

B_6123202261524573_C


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

B_4923302261598858_C


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

B_3793402261520865_C


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

B_3833502261553142_C


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

B_2323602261550730_C


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

B_1193702261589700_C


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

B_0513802261541201_C


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

B_0743902261548062_C


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

B_0484002261545902_C


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

B_1274102261590692_C


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

B_2644202261566631_C


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

B_3854302261577929_C


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

B_4134402261558508_C


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

B_4204502261593136_C


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

B_3684602261533514_C


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

B_4374702261547084_C


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

B_3534802261537599_C


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

B_2264902261583713_C


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

B_1945002261543875_C


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

B_1005102261599069_C


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

B_0495202261569129_C


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

B_9655202261537271_C


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

B_0155402261534284_C


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

B_0065502261572259_C


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

B_8975502261549209_C


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

B_7865602261537064_C


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

B_6615702261538364_C


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

B_5945802261585974_C


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

B_5435902261577686_C


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

B_5240002261512360_C


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

B_5710102261522348_C


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

B_4370202261590063_C


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

B_3600302261555956_C


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

B_2640402261567927_C


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

B_2460502261545285_C


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

B_2170602261513028_C


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

B_1820702261589711_C


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

B_0730802261576697_C


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

B_0360902261572205_C


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

B_9160902261599247_C


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

B_9011002261531939_C


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

B_8891102261539746_C


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

B_8911202261580290_C


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

B_9401302261586089_C


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

B_9631402261527388_C


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

B_8361502261588246_C


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

B_7021602261545222_C


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

B_7471702261511993_C


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

B_6191802261593425_C


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

B_6051902261543592_C


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

B_5302002261596298_C


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

B_4472102261574174_C


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

B_6222202261518026_C


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

B_4892302261546218_C


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

B_4382402261595713_C


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

B_3062502261580659_C


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

B_1822602261535047_C


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

B_2502702261542890_C


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

B_1482802261511410_C


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

B_0422902261557962_C


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

B_9672902261543738_C


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

B_0433102261520188_C


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

B_0293202261563456_C


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

B_9363202261580873_C


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

B_7923302261566620_C


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

B_7773402261554639_C


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

B_7823502261594058_C


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

B_6683602261577571_C


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

B_6943702261548621_C


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

B_7543802261565263_C


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

B_7983902261571157_C


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

B_7154002261587066_C


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

B_8454102261540962_C


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

B_8724202261515244_C


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

B_8394302261531522_C


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

B_7454402261558695_C


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

B_6354502261551865_C


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

B_7174602261525477_C


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

B_6564702261548327_C


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

B_5874802261527601_C


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

B_6964902261542188_C


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

B_5805002261577836_C


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

B_5265102261518040_C


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

B_4125202261542122_C


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

B_2935302261519335_C


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

B_1595402261581962_C


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

B_0895502261543519_C


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

B_0705602261560731_C


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

B_0275702261576433_C


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

B_9075702261562959_C


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

B_7755802261599273_C


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

B_6895902261559094_C


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

B_6710002261580824_C


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

B_5950102261542329_C


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

B_4670202261545908_C


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

B_3730302261511232_C


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

B_2350402261522815_C


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

B_1390502261593896_C


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

B_0940602261553095_C


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

B_0810702261539889_C


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

B_9520702261590538_C


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

B_8100802261554816_C


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

B_7340902261541500_C


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

B_5991002261525418_C


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

B_4621102261512143_C


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

B_4321202261594292_C


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

B_4061302261520275_C


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

B_3081402261536115_C


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

B_3201502261544061_C


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

B_3391602261564073_C


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

B_3581702261538729_C


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

B_3611802261595146_C


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

B_4731902261555130_C


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

B_4382002261595492_C


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

B_4202102261583740_C


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

B_3062202261549437_C


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

B_2172302261517496_C


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

B_2102402261564892_C


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

B_2632502261566854_C


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

B_1642602261577413_C


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

B_0942702261588557_C


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

B_0842802261513596_C


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

B_1252902261550048_C


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

B_0953002261569388_C


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

B_9403002261550863_C


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

B_8263102261572644_C


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

B_7453202261530334_C


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

B_8033302261511835_C


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

B_8173402261553398_C


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

B_6873502261525905_C


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

B_6933602261537425_C


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

B_5913702261551120_C


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

B_5293802261532919_C


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

B_3933902261580208_C


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

B_3124002261578533_C


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

B_4174102261528283_C


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

B_3784202261574199_C


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

B_2764302261512255_C


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

B_3954402261572778_C


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

B_4704502261520670_C


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

B_4674602261547808_C


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

B_3894702261534014_C


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

B_2784802261539516_C


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

B_1974902261551576_C


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

B_1945002261538599_C


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

B_1635102261523723_C


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

B_0525202261572766_C


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

B_1195302261544634_C


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

B_4205402261586164_C


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

B_3475502261589008_C


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

B_2005602261523206_C


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

B_1085702261544804_C


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

B_2475802261560074_C


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

B_1255902261550312_C


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

B_0140002261560192_C


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

B_9450002261556895_C


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

B_8000102261531103_C


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

B_7250202261540068_C


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

B_6340302261554115_C


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

B_5250402261540301_C


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

B_4470502261540299_C


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

B_3510602261536383_C


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

B_4490702261572059_C


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

B_3550802261512663_C


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

B_3490902261580826_C


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

B_2441002261511139_C


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

B_2801102261536693_C


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

B_2331202261514502_C


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

B_1221302261592078_C


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

B_9761302261552612_C


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

B_0181502261543161_C


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

B_0371602261554080_C


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

B_9751602261517044_C


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

B_8661702261586347_C


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

B_8431802261535310_C


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

B_9171902261580628_C


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

B_8432002261547024_C


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

B_9352102261526972_C


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

B_8762202261530321_C


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

B_7822302261577492_C


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

B_6542402261560584_C


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

B_5072502261587517_C


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

B_4262602261568492_C


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

B_2922702261512565_C


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

B_1842802261588713_C


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

B_0902902261572506_C


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

B_9642902261536062_C


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

B_9193002261535966_C


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

B_9753102261563640_C


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

B_8923202261533943_C


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

B_8023302261551645_C


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

B_6973402261532136_C


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

B_6713502261555107_C


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

B_5623602261540103_C


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

B_4293702261578249_C


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

B_4443802261519321_C


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

B_4133902261533679_C


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

B_4844002261549461_C


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

B_5104102261514996_C


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

B_4014202261531156_C


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

B_2934302261532243_C


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

B_1804402261525168_C


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

B_2514502261597540_C


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

B_2064602261599801_C


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

B_0574702261539763_C


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

B_9644702261594651_C


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

B_8304802261596998_C


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

B_7884902261597805_C


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

B_6615002261589375_C


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

B_6735102261536329_C


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

B_5795202261545148_C


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

B_5315302261553474_C


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

B_4535402261580718_C


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

B_4435502261567627_C


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

B_3405602261587424_C


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

B_4115702261533779_C


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

B_4595802261574196_C


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

B_3235902261533090_C


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

B_3670002261578542_C


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

B_4350102261556766_C


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

B_6010202261555706_C


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

B_5440302261586768_C


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

B_5020402261583364_C


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

B_5020502261593048_C


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

B_3700602261585096_C


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

B_3770702261515938_C


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

B_3540802261534948_C


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

B_2530902261548001_C


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

B_1311002261527667_C


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

B_1251102261589844_C


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

B_0351202261586402_C


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

B_9611202261544186_C


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

B_9561302261528072_C


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

B_8471402261586608_C


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

B_8431502261527579_C


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

B_7421602261518485_C


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

B_6081702261554227_C


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

B_5201802261538093_C


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

B_3971902261537178_C


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

B_2802002261540195_C


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

B_2192102261586701_C


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

B_2112202261520089_C


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

B_1002302261579940_C


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

B_2512402261530351_C


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

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

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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