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

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

B_6045202261529286_C


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

B_4555302261533838_C


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

B_3855402261520150_C


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

B_3355502261549281_C


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

B_3155602261586978_C


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

B_1755702261512763_C


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

B_0365802261571207_C


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

B_9965802261548673_C


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

B_9865902261586315_C


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

B_9360002261548183_C


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

B_9860102261574533_C


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

B_8360202261570955_C


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

B_6760302261577863_C


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

B_6370402261586741_C


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

B_5670502261541914_C


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

B_5470602261539066_C


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

B_5770702261586398_C


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

B_6370802261557475_C


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

B_4770902261548860_C


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

B_3771002261568517_C


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

B_3181102261516639_C


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

B_1881202261570675_C


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

B_1281302261583914_C


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

B_0281402261562024_C


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

B_8981402261546394_C


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

B_8791502261582074_C


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

B_9291602261520519_C


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

B_9591702261586475_C


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

B_9691802261581292_C


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

B_8191902261565668_C


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

B_8592002261548288_C


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

B_7892102261513358_C


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

B_6292202261552377_C


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

B_5302302261586663_C


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

B_5002402261511948_C


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

B_3602502261561701_C


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

B_2002602261569875_C


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

B_2402702261548135_C


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

B_1702802261537529_C


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

B_0602902261594810_C


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

B_0503002261584072_C


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

B_8903002261521353_C


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

B_8103102261596786_C


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

B_6613202261558437_C


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

B_5513302261546585_C


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

B_3913402261536189_C


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

B_8513502261572003_C


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

B_7113602261542966_C


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

B_8123702261553495_C


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

B_8023802261541170_C


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

B_7523902261546205_C


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

B_6424002261550288_C


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

B_5134102261534347_C


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

B_3934202261547117_C


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

B_3334302261559007_C


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

B_2834402261574579_C


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

B_3434502261527279_C


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

B_4134602261566457_C


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

B_3934702261532980_C


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

B_3434802261596447_C


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

B_2544902261547855_C


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

B_1845002261522541_C


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

B_0545102261528013_C


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

B_0445202261515391_C


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

B_1455302261526874_C


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

B_0755402261597011_C


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

B_9355402261557500_C


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

B_2555602261580971_C


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

B_1555702261582135_C


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

B_0555802261557075_C


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

B_9655802261534077_C


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

B_0150002261569060_C


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

B_9750002261565946_C


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

B_1060202261584514_C


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

B_9360202261546561_C


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

B_8660302261555052_C


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

B_8360402261579658_C


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

B_8060502261564460_C


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

B_8160602261519950_C


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

B_7970702261543059_C


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

B_7270802261529337_C


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

B_5770902261568006_C


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

B_5971002261543582_C


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

B_4971102261574911_C


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

B_4071202261576643_C


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

B_3771302261586774_C


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

B_3481402261524139_C


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

B_1981502261589446_C


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

B_1281602261549315_C


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

B_0691702261556055_C


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

B_9391702261557945_C


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

B_9391802261572510_C


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

B_8191902261569184_C


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

B_8192002261566174_C


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

B_7292102261589367_C


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

B_5492202261579641_C


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

B_3892302261581262_C


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

B_2492402261518133_C


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

B_0492502261584360_C


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

B_9692502261580412_C


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

B_8492602261566321_C


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

B_8792702261582457_C


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

B_8602802261551761_C


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

B_7602902261594421_C


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

B_6503002261552427_C


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

B_4803102261566758_C


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

B_4403202261515629_C


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

B_8203302261513285_C


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

B_6903402261571618_C


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

B_8603502261555267_C


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

B_7703602261533446_C


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

B_6303702261582606_C


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

B_6003802261536591_C


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

B_4313902261547666_C


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

B_5414002261547209_C


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

B_5714102261572222_C


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

B_4114202261568518_C


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

B_3414302261557732_C


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

B_2314402261565958_C


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

B_1614502261545159_C


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

B_0314602261577499_C


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

B_9324602261585433_C


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

B_7524702261586102_C


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

B_7324802261584816_C


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

B_6024902261515277_C


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

B_4425002261557704_C


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

B_3025102261577982_C


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

B_1425202261537025_C


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

B_0525302261588210_C


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

B_0625402261590686_C


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

B_9925402261562891_C


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

B_8525502261516213_C


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

B_8525602261579109_C


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

B_7725702261552806_C


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

B_8235802261568265_C


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

B_6735902261536587_C


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

B_5430002261597726_C


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

B_3640102261561326_C


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

B_3340202261533636_C


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

B_1540302261543249_C


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

B_1240402261550003_C


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

B_0040502261588215_C


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

B_1150602261518378_C


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

B_0550702261566504_C


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

B_3250802261540261_C


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

B_2750902261540899_C


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

B_1651002261519358_C


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

B_0751102261551394_C


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

B_9051102261588742_C


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

B_8851202261536519_C


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

B_9151302261539493_C


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

B_8651402261539172_C


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

B_7951502261549024_C


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

B_6551602261561220_C


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

B_5751702261516728_C


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

B_4051802261537814_C


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

B_2451902261533085_C


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

B_0762002261522285_C


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

B_9862002261572480_C


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

B_8262102261511869_C


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

B_7972202261567297_C


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

B_6872302261584835_C


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

B_6572402261586302_C


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

B_5172502261564848_C


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

B_4072602261591643_C


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

B_4472702261580275_C


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

B_4482802261542395_C


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

B_3482902261561418_C


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

B_1983002261566574_C


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

B_0983102261535004_C


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

B_9683102261530978_C


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

B_8283202261594900_C


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

B_6683302261557754_C


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

B_5183402261578299_C


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

B_5283502261551657_C


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

B_4583602261516214_C


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

B_3693702261517191_C


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

B_2093802261519446_C


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

B_1093902261565394_C


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

B_9793902261535861_C


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

B_9694002261595031_C


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

B_8194102261522510_C


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

B_6494202261523036_C


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

B_5724302261576996_C


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

B_5724402261593162_C


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

B_5024502261546203_C


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

B_4824602261588115_C


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

B_4124702261598796_C


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

B_4724802261542564_C


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

B_6424902261572121_C


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

B_5725002261557123_C


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

B_4525102261540843_C


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

B_4025202261586710_C


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

B_3225302261556481_C


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

B_1525402261554649_C


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

B_2925502261530617_C


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

B_2125602261572315_C


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

B_2235702261579444_C


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

B_0735802261575291_C


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

B_9135802261514557_C


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

B_7335902261557292_C


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

B_6630002261530797_C


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

B_6230102261515304_C


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

B_5730202261566191_C


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

B_5840302261596741_C


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

B_6240402261581167_C


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

B_0740702261593258_C


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

B_9340702261513125_C


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

B_9740802261550067_C


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

B_8140902261570144_C


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

B_6651002261585410_C


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

B_4951102261582215_C


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

B_3251202261528042_C


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

B_4361502261547564_C


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

B_4761602261596840_C


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

B_3461702261538291_C


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

B_2061802261514734_C


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

B_0561902261519723_C


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

B_0362002261530481_C


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

B_9262002261578123_C


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

B_8562102261551036_C


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

B_7562202261597430_C


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

B_6062302261570315_C


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

B_5072402261570035_C


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

B_3272502261512107_C


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

B_1672602261532215_C


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

B_2072702261520975_C


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

B_1672802261559629_C


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

B_1382902261579035_C


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

B_0683002261562096_C


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

B_1083102261568874_C


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

B_0483202261557105_C


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

B_9183202261597903_C


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

B_8893302261582660_C


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

B_7693402261556918_C


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

B_6293502261538115_C


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

B_5903602261564421_C


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

B_4803702261521330_C


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

B_5513802261551486_C


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

B_4813902261596570_C


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

B_5114002261580564_C


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

B_3714102261599980_C


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

B_3814202261540143_C


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

B_3414302261513543_C


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

B_3814402261526994_C


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

B_2214502261569510_C


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

B_1914602261522070_C


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

B_1314702261555016_C


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

B_0614802261598715_C


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

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

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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