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

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

B_2202602261548477_C


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

B_1682702261575245_C


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

B_0762802261595403_C


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

B_9802802261584335_C


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

B_8592902261588488_C


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

B_9053002261534481_C


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

B_8393102261549401_C


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

B_9183202261570780_C


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

B_9493302261522010_C


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

B_8883402261533764_C


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

B_7943502261575300_C


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

B_9173602261590121_C


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

B_1423802261560413_C


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

B_0593902261530287_C


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

B_9463902261558774_C


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

B_9194002261521034_C


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

B_7524102261536239_C


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

B_6854202261544319_C


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

B_5694302261562315_C


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

B_4414402261544000_C


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

B_3244502261557985_C


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

B_3604602261524622_C


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

B_2004702261592335_C


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

B_1184802261524052_C


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

B_9914802261545666_C


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

B_1985002261521283_C


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

B_0465102261555151_C


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

B_0435202261543172_C


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

B_0715302261516246_C


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

B_9135302261531488_C


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

B_8995402261563879_C


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

B_8795502261589441_C


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

B_8435602261587248_C


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

B_7025702261538448_C


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

B_5985802261592237_C


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

B_4595902261578794_C


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

B_3570002261591579_C


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

B_3500102261587743_C


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

B_2610202261559290_C


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

B_1030302261514837_C


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

B_9640302261577484_C


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

B_1960502261522389_C


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

B_1740602261560943_C


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

B_1110702261563151_C


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

B_1010802261531328_C


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

B_9880802261574838_C


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

B_9700902261515742_C


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

B_0161102261585862_C


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

B_8491102261517490_C


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

B_7051202261546952_C


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

B_5841302261596161_C


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

B_6431402261518075_C


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

B_4921502261539525_C


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

B_3241602261559586_C


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

B_2221702261596832_C


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

B_1431802261570778_C


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

B_0641902261520022_C


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

B_0742002261565769_C


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

B_0802102261537802_C


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

B_9282102261594314_C


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

B_0622302261586006_C


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

B_9372302261589409_C


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

B_9562402261596728_C


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

B_8462502261540644_C


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

B_7032602261594895_C


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

B_7622702261524009_C


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

B_7182802261518714_C


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

B_8572902261593299_C


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

B_9243002261572212_C


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

B_8573102261539528_C


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

B_9793202261569443_C


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

B_9433302261538848_C


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

B_7973402261578414_C


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

B_7153502261593581_C


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

B_6053602261542471_C


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

B_4823702261539512_C


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

B_3813802261563306_C


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

B_3673902261526827_C


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

B_4064002261586649_C


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

B_2614102261533792_C


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

B_1334202261525998_C


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

B_1454302261540689_C


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

B_0204402261513428_C


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

B_9614402261553217_C


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

B_9314502261528262_C


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

B_8344602261550158_C


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

B_8024702261525874_C


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

B_6604802261573337_C


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

B_6354902261537825_C


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

B_6525002261549286_C


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

B_5695102261584446_C


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

B_6415202261524188_C


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

B_6065302261548415_C


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

B_5535402261557778_C


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

B_4745502261514728_C


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

B_4885602261581030_C


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

B_3805702261574585_C


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

B_3045802261572789_C


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

B_1965902261564139_C


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

B_0620002261541210_C


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

B_9780002261522789_C


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

B_1210202261559893_C


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

B_0160302261553036_C


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

B_9510302261568774_C


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

B_0440502261575789_C


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

B_0510602261527082_C


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

B_9620602261574040_C


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

B_9970702261578145_C


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

B_9610802261593181_C


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

B_0371002261567519_C


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

B_0441102261534336_C


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

B_9681102261537362_C


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

B_8281202261537726_C


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

B_7611302261590810_C


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

B_6791402261528325_C


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

B_7401502261540314_C


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

B_6151602261573555_C


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

B_5071702261549305_C


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

B_4131802261561844_C


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

B_3861902261553947_C


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

B_2902002261533923_C


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

B_3132102261532301_C


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

B_2332202261582755_C


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

B_1602302261554798_C


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

B_2662402261553036_C


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

B_2102502261552151_C


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

B_1522602261531242_C


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

B_1532702261547735_C


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

B_2402802261528681_C


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

B_1152902261539126_C


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

B_0273002261565228_C


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

B_9053002261548470_C


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

B_9493102261590353_C


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

B_8823202261556526_C


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

B_8313302261565846_C


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

B_9083402261520296_C


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

B_7813502261543472_C


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

B_6523602261574265_C


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

B_9703702261561870_C


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

B_9843802261588221_C


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

B_8803902261584555_C


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

B_7794002261598061_C


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

B_7204102261555470_C


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

B_5804202261512705_C


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

B_4774302261563634_C


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

B_3534402261512884_C


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

B_2114502261537093_C


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

B_2354602261595061_C


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

B_1434702261559044_C


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

B_1534802261535602_C


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

B_0104902261596542_C


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

B_9924902261521374_C


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

B_9025002261524837_C


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

B_7645102261518221_C


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

B_7325202261584265_C


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

B_8025302261554788_C


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

B_8515402261566952_C


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

B_7485502261527703_C


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

B_7395602261580849_C


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

B_6015702261518787_C


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

B_4495802261523413_C


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

B_4265902261559743_C


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

B_4280002261568028_C


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

B_4090102261525641_C


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

B_3430202261547694_C


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

B_4730302261591125_C


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

B_4240402261525376_C


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

B_4860502261552597_C


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

B_4160602261590261_C


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

B_3180702261552323_C


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

B_2230802261545180_C


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

B_1910902261526033_C


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

B_0971002261561148_C


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

B_0411102261579583_C


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

B_9971102261596027_C


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

B_8991202261536483_C


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

B_7531302261584346_C


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

B_7651402261577651_C


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

B_6821502261525711_C


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

B_5481602261546806_C


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

B_5401702261574801_C


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

B_5421802261532803_C


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

B_5951902261549880_C


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

B_4692002261573394_C


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

B_3782102261561551_C


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

B_3222202261543385_C


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

B_1852302261552814_C


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

B_0652402261561704_C


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

B_1342502261555844_C


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

B_0662602261566728_C


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

B_9642602261521417_C


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

B_8492702261579456_C


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

B_8212802261552993_C


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

B_7412902261550562_C


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

B_7193002261567335_C


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

B_7153102261529872_C


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

B_6293202261578291_C


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

B_5353302261547477_C


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

B_4143402261516802_C


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

B_3053502261560675_C


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

B_2583602261566919_C


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

B_2213702261548711_C


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

B_1713802261558568_C


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

B_0193902261564936_C


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

B_9053902261555670_C


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

B_7554002261531620_C


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

B_7014102261531974_C


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

B_6694202261576395_C


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

B_5414302261560183_C


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

B_3824402261563829_C


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

B_3514502261516220_C


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

B_4004602261511257_C


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

B_2414702261548744_C


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

B_0934802261525023_C


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

B_9384802261538703_C


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

B_9034902261530229_C


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

B_8035002261577659_C


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

B_0365202261561581_C


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

B_0905302261563040_C


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

B_9655302261562969_C


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

B_8125402261516117_C


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

B_7795502261527696_C


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

B_6275602261519486_C


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

B_5165702261574858_C


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

B_4685802261557086_C


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

B_4955902261597020_C


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

B_3720002261592112_C


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

B_3480102261538751_C


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

B_2130202261581793_C


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

B_0680302261597224_C


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

B_9450302261553986_C


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

B_8010402261515189_C


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

B_6840502261571220_C


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

B_5270602261577087_C


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

B_5960702261536254_C


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

B_4460802261511159_C


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

B_4290902261592146_C


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

B_3841002261542066_C


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

B_2591102261571971_C


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

B_1701202261550117_C


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

B_1731302261561746_C


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

B_1461402261544383_C


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

B_1081502261564611_C


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

B_2481602261546584_C


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

B_1051702261569152_C


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

B_0271802261527390_C


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

B_9061802261598861_C


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

B_8481902261582927_C


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

B_8562002261596187_C


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

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

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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