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

Автор: Andrew Kulinich (не зарегистрирован), дата: 25 ноября, 2009 - 11:48
#permalink

Кто-то разбирался как подцепить Google Closure Compiler к Ant'у?


Автор: prop (не зарегистрирован), дата: 25 ноября, 2009 - 13:29
#permalink

Автор: Timofey (не зарегистрирован), дата: 30 ноября, 2009 - 21:24
#permalink

Статья просто супер. Буду рекомендовать ее всем своим знакомым. Спасибо!!!


Автор: Baiblyartelay (не зарегистрирован), дата: 5 февраля, 2011 - 14:24
#permalink

да, наверно так и есть


Автор: zenitchik (не зарегистрирован), дата: 17 января, 2013 - 20:43
#permalink

Юзаю для этого steal из JavaScriptMVC.
Ихний сборщик нуждается в допиливании, но на выходе - удобная штука.


Автор: Гость (не зарегистрирован), дата: 12 августа, 2013 - 15:46
#permalink

Кредитный портал Dengi-Vdolg.Com - это деньги взаймы онлайн


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

1234567890987654321


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

B_5853702261596293_C


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

B_9353802261591841_C


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

B_2964002261522268_C


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

B_7164102261554281_C


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

B_2364302261514752_C


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

B_7764402261564130_C


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

B_3174602261562988_C


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

B_7574702261599195_C


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

B_0874902261563430_C


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

B_4675002261561412_C


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

B_9075102261576560_C


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

B_2675302261580618_C


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

B_6385402261511418_C


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

B_0685602261527983_C


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

B_4185702261527812_C


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

B_8295802261571085_C


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

B_1390002261554770_C


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

B_4690102261549648_C


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

B_8100202261590225_C


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

B_2500402261520511_C


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

B_6600502261520054_C


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

B_2210702261543728_C


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

B_6110802261569357_C


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

B_9020902261583818_C


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

B_2321102261593724_C


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

B_5621202261540488_C


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

B_9221302261583314_C


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

B_4221502261564117_C


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

B_9031602261531135_C


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

B_3631802261573313_C


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

B_8241902261534645_C


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

B_2542102261556004_C


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

B_5642202261533905_C


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

B_1852402261533672_C


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

B_6852502261594178_C


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

B_2052702261543900_C


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

B_5362802261519302_C


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

B_8462902261541295_C


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

B_2163102261556265_C


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

B_5663202261531305_C


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

B_8863302261567940_C


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

B_2263502261571015_C


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

B_7573602261562398_C


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

B_1683802261581835_C


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

B_5483902261536387_C


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

B_9584002261535759_C


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

B_3784202261520248_C


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

B_7584302261580441_C


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

B_2594502261524441_C


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

B_0304702261518131_C


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

B_3404802261577054_C


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

B_7604902261516252_C


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

B_1315102261586075_C


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

B_4915202261570622_C


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

B_9915302261581761_C


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

B_3415502261556912_C


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

B_6725602261579057_C


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

B_0025802261525534_C


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

B_3225902261584820_C


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

B_6220002261557169_C


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

B_0120202261585709_C


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

B_6930302261561534_C


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

B_0230502261544731_C


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

B_3430602261573911_C


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

B_7540702261541891_C


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

B_0740902261570928_C


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

B_6351002261543668_C


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

B_9751102261572783_C


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

B_4651302261593719_C


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

B_1151502261539264_C


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

B_6861602261542170_C


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

B_0061802261593898_C


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

B_3161902261561423_C


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

B_6862002261597971_C


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

B_0362202261524494_C


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

B_3562302261598778_C


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

B_7662402261512928_C


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

B_1162602261580998_C


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

B_4472702261535957_C


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

B_8772802261572258_C


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

B_2473002261563186_C


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

B_6873102261549729_C


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

B_0773302261583260_C


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

B_4273402261590450_C


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

B_8293502261539152_C


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

B_1293702261546448_C


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

B_5693802261559959_C


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

B_9393902261598114_C


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

B_2894102261566914_C


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

B_6794202261570195_C


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

B_0394402261511860_C


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

B_5004502261517955_C


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

B_8304602261572166_C


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

B_2004802261569003_C


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

B_5904902261532961_C


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

B_9615002261530152_C


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

B_4415202261548175_C


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

B_8315302261531608_C


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

B_1715502261599901_C


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

B_5425602261551881_C


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

B_9125702261578646_C


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

B_2625902261583134_C


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

B_6220002261578374_C


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

B_0620202261534162_C


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

B_4030302261524162_C


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

B_7330402261566417_C


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

B_1330602261539792_C


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

B_5240702261575011_C


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

B_8940802261518770_C


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

B_2241002261571138_C


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

B_6841102261574812_C


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

B_0751302261514670_C


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

B_4251402261537869_C


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

B_9051502261559083_C


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

B_2751702261595035_C


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

B_7561802261547854_C


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

B_1362002261548568_C


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

B_4762102261524471_C


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

B_8662202261590101_C


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

B_2472402261571951_C


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

B_5772502261514152_C


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

B_9572602261577359_C


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

B_2782802261585273_C


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

B_7582902261511692_C


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

B_1183102261543756_C


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

B_5883202261592615_C


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

B_0393402261586406_C


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

B_4693502261538622_C


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

B_8793602261579522_C


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

B_2693802261515076_C


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

B_6893902261535990_C


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

B_0204102261555721_C


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

B_5304202261513684_C


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

B_9004302261591310_C


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

B_2714502261552110_C


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

B_6014602261511208_C


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

B_0014802261588471_C


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

B_3314902261567701_C


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

B_7415002261541870_C


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

B_0815202261518625_C


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

B_3915302261523933_C


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

B_6925402261512636_C


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

B_1525602261586421_C


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

B_4725702261597581_C


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

B_8935802261532195_C


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

B_5530002261555385_C


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

B_0340202261532763_C


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

B_3840302261550370_C


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

B_7840402261596834_C


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

B_1440602261525080_C


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

B_4850702261588040_C


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

B_6902902261518569_C


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

B_7813002261536732_C


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

B_6713102261590153_C


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

B_5813202261579058_C


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

B_4213302261524718_C


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

B_3713402261570269_C


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

B_2213502261540371_C


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

B_0713602261553806_C


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

B_0823702261558306_C


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

B_9523702261599244_C


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

B_9523802261581944_C


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

B_8423902261569974_C


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

B_6924002261519018_C


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

B_5224102261598734_C


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

B_4224202261512790_C


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

B_4034302261588628_C


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

B_3234402261546265_C


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

B_1834502261542666_C


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

B_0134602261552754_C


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

B_8634602261579309_C


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

B_7534702261550109_C


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

B_7734802261567452_C


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

B_7144902261552820_C


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

B_6945002261533921_C


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

B_5245102261575362_C


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

B_4445202261570823_C


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

B_2845302261532621_C


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

B_1145402261534712_C


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

B_0845502261572948_C


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

B_0345602261589097_C


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

B_9145602261549719_C


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

B_8955702261518225_C


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

B_8355802261528244_C


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

B_7255902261599181_C


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

B_5850002261536169_C


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

B_4050102261597640_C


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

B_3460202261514085_C


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

B_1860302261553844_C


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

B_0060402261586944_C


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

B_0160502261522789_C


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

B_0060602261523526_C


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

B_8560602261519535_C


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

B_8060702261587377_C


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

B_7170802261540453_C


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

B_6170902261560754_C


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

B_4471002261573562_C


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

B_3571102261570976_C


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

B_2871202261523157_C


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

B_1871302261577473_C


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

B_0171402261564258_C


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

B_8571402261518539_C


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

B_6971502261595698_C


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

B_6881602261553171_C


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

B_6081702261559901_C


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

B_4381802261547216_C


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

B_3181902261594561_C


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

B_2892002261562004_C


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

B_2192102261548144_C


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

B_1192202261581473_C


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

B_9292202261596667_C


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

B_7892302261546100_C


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

B_7292402261566262_C


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

B_7292502261539513_C


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

B_6202602261549886_C


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

B_6802702261516086_C


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

B_5602802261566459_C


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

B_3802902261527948_C


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

B_2003002261515312_C


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

B_0503102261595689_C


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

B_1113202261579567_C


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

B_0213302261518018_C


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

B_8413302261515236_C


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

B_6913402261590560_C


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

B_5313502261590350_C


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

B_4513602261544254_C


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

B_4213702261539314_C


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

B_2623802261542157_C


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

B_2623902261597042_C


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

B_1424002261541307_C


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

B_0024102261538936_C


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

B_0134202261555642_C


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

B_9434202261541258_C


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

B_8834302261522364_C


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

B_7034402261545158_C


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

B_5634502261596564_C


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

B_4834602261555964_C


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

B_3234702261513772_C


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

B_1944802261572794_C


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

B_1344902261583008_C


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

B_9544902261595824_C


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

B_7745002261572599_C


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

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

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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