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

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

B_5572002261533652_C


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

B_4592102261599265_C


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

B_3372202261557006_C


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

B_3682302261547088_C


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

B_3062402261562868_C


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

B_2512502261585457_C


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

B_2082602261512598_C


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

B_3052702261554326_C


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

B_5142802261561829_C


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

B_4772902261564813_C


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

B_3473002261538325_C


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

B_4123102261576651_C


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

B_3203202261546117_C


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

B_3773302261542221_C


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

B_2993402261569095_C


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

B_2593502261549910_C


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

B_2243602261563922_C


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

B_2313702261582781_C


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

B_3413802261593801_C


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

B_4223902261515200_C


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

B_3224002261550007_C


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

B_2214102261595867_C


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

B_1264202261530187_C


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

B_9794202261579784_C


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

B_8894302261593860_C


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

B_1044502261566503_C


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

B_0874602261544380_C


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

B_9894602261565272_C


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

B_8584702261576406_C


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

B_7924802261514104_C


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

B_6984902261558264_C


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

B_6105002261516353_C


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

B_5655102261525031_C


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

B_3410202261555637_C


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

B_2270302261586078_C


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

B_2240402261524760_C


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

B_1590502261562193_C


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

B_1540602261573997_C


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

B_0450702261535632_C


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

B_0320802261551574_C


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

B_9490802261592194_C


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

B_8270902261515201_C


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

B_6791002261596426_C


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

B_7331102261571917_C


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

B_6541202261590131_C


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

B_5751302261523808_C


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

B_7371402261588316_C


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

B_8571502261578542_C


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

B_7501602261541822_C


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

B_6571702261571620_C


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

B_5291802261585666_C


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

B_5491902261594937_C


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

B_5082002261567848_C


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

B_4562102261565096_C


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

B_3432202261567450_C


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

B_3002302261544181_C


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

B_1972402261549255_C


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

B_2612502261512527_C


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

B_1742602261569877_C


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

B_0862702261525382_C


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

B_0552802261518281_C


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

B_9922802261514336_C


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

B_9112902261599923_C


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

B_8313002261573047_C


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

B_6933102261595539_C


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

B_7083202261576850_C


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

B_7173302261576651_C


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

B_6363402261581560_C


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

B_5003502261591793_C


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

B_3913602261513247_C


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

B_2693702261558912_C


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

B_2033802261522472_C


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

B_0963902261521879_C


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

B_0764002261550688_C


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

B_0614102261588747_C


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

B_0104202261558715_C


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

B_8954202261556047_C


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

B_8344302261596721_C


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

B_7034402261544737_C


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

B_5804502261511216_C


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

B_4584602261528258_C


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

B_3914702261580900_C


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

B_3434802261557937_C


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

B_2324902261514199_C


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

B_1845002261580696_C


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

B_1345102261582461_C


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

B_1585202261599519_C


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

B_1075302261536343_C


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

B_0305402261563630_C


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

B_0775502261522071_C


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

B_9815502261572758_C


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

B_8575602261540180_C


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

B_7575702261532456_C


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

B_8105802261547005_C


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

B_7425902261574350_C


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

B_6190002261577675_C


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

B_4920102261539399_C


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

B_4430202261579939_C


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

B_3560302261583096_C


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

B_4700402261537856_C


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

B_3590502261515380_C


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

B_2770602261594356_C


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

B_1410702261567492_C


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

B_0530802261553252_C


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

B_0430902261560283_C


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

B_0591002261559020_C


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

B_9781002261598593_C


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

B_8651102261589190_C


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

B_7461202261560740_C


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

B_6721302261547590_C


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

B_7001402261552901_C


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

B_6301502261527684_C


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

B_5201602261591424_C


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

B_5621702261583077_C


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

B_6101802261540074_C


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

B_6311902261577648_C


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

B_6442002261576676_C


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

B_5982102261584901_C


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

B_5332202261599416_C


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

B_5132302261596164_C


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

B_3522402261546654_C


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

B_2562502261514761_C


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

B_2562602261566619_C


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

B_2612702261571077_C


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

B_1242802261575897_C


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

B_0232902261564248_C


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

B_0113002261590460_C


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

B_8663002261590887_C


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

B_9963102261550683_C


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

B_8723202261559532_C


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

B_7523302261569429_C


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

B_5973402261526187_C


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

B_4733502261521440_C


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

B_4193602261562227_C


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

B_2623702261519682_C


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

B_1443802261582082_C


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

B_0333902261515481_C


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

B_8913902261560756_C


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

B_8164002261527845_C


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

B_7894102261587900_C


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

B_7154202261561181_C


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

B_7354302261517322_C


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

B_6214402261561179_C


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

B_4944502261587051_C


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

B_3904602261581704_C


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

B_2744702261561261_C


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

B_1454802261556429_C


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

B_1214902261563459_C


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

B_0535002261524727_C


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

B_0385102261551751_C


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

B_0085202261546176_C


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

B_9515202261547723_C


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

B_8735302261548850_C


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

B_7355402261546911_C


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

B_7365502261535482_C


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

B_7185602261566367_C


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

B_6665702261549721_C


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

B_5825802261582557_C


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

B_4955902261554989_C


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

B_4870002261523749_C


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

B_6300102261526499_C


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

B_5730202261523671_C


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

B_2860502261525835_C


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

B_1440602261562111_C


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

B_0700702261588030_C


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

B_0890802261531337_C


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

B_2180902261582582_C


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

B_1431002261593263_C


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

B_0121102261554003_C


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

B_9141102261572644_C


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

B_9851202261524904_C


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

B_8771302261560544_C


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

B_7401402261513446_C


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

B_6011502261561160_C


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

B_5151602261584653_C


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

B_4171702261549589_C


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

B_2531802261558878_C


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

B_1321902261513163_C


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

B_0332002261576241_C


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

B_9722002261537896_C


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

B_9212102261546291_C


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

B_8602202261546702_C


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

B_7692302261569610_C


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

B_6172402261581344_C


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

B_5362502261511711_C


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

B_4222602261526910_C


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

B_3482702261559667_C


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

B_2772802261527771_C


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

B_1482902261559222_C


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

B_0453002261567881_C


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

B_9753002261546558_C


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

B_8833102261523110_C


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

B_7183202261538850_C


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

B_5963302261512449_C


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

B_6483402261557888_C


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

B_6003502261544245_C


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

B_5193602261557041_C


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

B_5503702261512381_C


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

B_5123802261544638_C


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

B_5443902261596816_C


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

B_5394002261519425_C


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

B_5224102261572733_C


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

B_4074202261590915_C


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

B_3534302261541822_C


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

B_2454402261549916_C


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

B_1184502261577343_C


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

B_0684602261542125_C


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

B_1244702261520425_C


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

B_0274802261551430_C


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

B_0734902261583374_C


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

B_9484902261598902_C


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

B_7915002261568268_C


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

B_7785102261569705_C


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

B_7125202261568597_C


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

B_6875302261549779_C


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

B_6585402261541399_C


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

B_5275502261545406_C


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

B_5065602261515912_C


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

B_4385702261586597_C


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

B_4085802261550484_C


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

B_2885902261576299_C


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

B_1830002261592647_C


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

B_2470102261539324_C


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

B_1250202261599800_C


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

B_0170302261566312_C


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

B_9790302261572945_C


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

B_0450502261588448_C


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

B_1020602261540621_C


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

B_0510702261571303_C


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

B_9650702261511425_C


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

B_0500902261577995_C


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

B_0441002261582178_C


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

B_9241002261571198_C


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

B_9341102261569820_C


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

B_9031202261545720_C


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

B_8291302261597188_C


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

B_7611402261532973_C


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

B_6201502261534706_C


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

B_5451602261578987_C


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

B_4361702261538353_C


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

B_4141802261537645_C


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

B_2771902261570441_C


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

B_3432002261547028_C


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

B_2892102261526856_C


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

B_1472202261557673_C


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

B_9962202261567547_C


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

B_3532402261581146_C


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

B_2332502261523030_C


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

B_1782602261515466_C


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

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

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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