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

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

B_9811902261537582_C


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

B_9772002261551354_C


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

B_9742102261540962_C


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

B_8872202261526308_C


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

B_8712302261531272_C


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

B_8552402261540603_C


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

B_8142502261584091_C


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

B_7622602261546165_C


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

B_7192702261522276_C


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

B_6582802261538304_C


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

B_5082902261525341_C


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

B_3623002261557989_C


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

B_2783102261553649_C


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

B_1273202261582179_C


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

B_2293302261539846_C


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

B_1243402261514970_C


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

B_0563502261544179_C


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

B_9373502261550114_C


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

B_8213602261519792_C


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

B_0643902261514471_C


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

B_0524002261514941_C


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

B_9304002261583060_C


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

B_8644102261573309_C


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

B_7504202261547144_C


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

B_6794302261580456_C


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

B_6384402261588682_C


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

B_5054502261525172_C


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

B_3754602261556373_C


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

B_4324702261538345_C


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

B_4014802261591772_C


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

B_3004902261524135_C


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

B_2575002261588770_C


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

B_1485102261534678_C


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

B_0755202261532156_C


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

B_1585302261552335_C


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

B_0945402261529879_C


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

B_9515402261542841_C


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

B_8825502261590599_C


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

B_7735602261599368_C


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

B_7205702261587730_C


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

B_7455802261559388_C


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

B_7245902261550732_C


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

B_7050002261592929_C


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

B_0650202261550457_C


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

B_9180202261533869_C


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

B_7750302261561632_C


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

B_8430402261541459_C


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

B_7550502261595525_C


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

B_6750602261592370_C


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

B_5500702261564251_C


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

B_5060802261576387_C


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

B_5540902261514372_C


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

B_5351002261578362_C


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

B_4621102261588318_C


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

B_3521202261514332_C


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

B_3721302261576150_C


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

B_3231402261564557_C


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

B_3371502261556925_C


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

B_2591602261523611_C


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

B_1991702261529219_C


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

B_1101802261555492_C


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

B_0101902261566457_C


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

B_0172002261538216_C


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

B_9102002261572994_C


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

B_9232102261577102_C


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

B_7932202261589493_C


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

B_6982302261513725_C


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

B_5842402261521355_C


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

B_4442502261568509_C


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

B_4282602261518639_C


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

B_3512702261546855_C


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

B_3212802261527377_C


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

B_2332902261588049_C


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

B_1503002261567518_C


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

B_2143102261586678_C


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

B_1933202261553512_C


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

B_2263302261512198_C


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

B_1413402261569930_C


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

B_0733502261589558_C


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

B_0173602261584476_C


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

B_1223702261518374_C


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

B_0293802261550461_C


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

B_9193802261550196_C


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

B_8683902261544386_C


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

B_7734002261512420_C


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

B_7694102261579634_C


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

B_6724202261592704_C


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

B_5484302261579369_C


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

B_4534402261527019_C


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

B_3794502261576115_C


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

B_3034602261537805_C


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

B_2074702261529280_C


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

B_1224802261583024_C


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

B_9784802261593140_C


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

B_8814902261574600_C


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

B_7715002261561959_C


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

B_6315102261592497_C


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

B_9045202261571097_C


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

B_7805302261546606_C


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

B_6625402261589048_C


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

B_5715502261580186_C


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

B_7805602261553859_C


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

B_8465702261571548_C


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

B_8435802261551412_C


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

B_7515902261540742_C


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

B_7060002261598545_C


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

B_5990102261575915_C


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

B_6360202261535282_C


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

B_5320302261557850_C


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

B_4260402261591952_C


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

B_3730502261594745_C


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

B_3530602261511805_C


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

B_2760702261543466_C


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

B_2750802261521760_C


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

B_1590902261532352_C


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

B_2491002261560886_C


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

B_1101102261573565_C


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

B_9501102261568146_C


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

B_8721202261566508_C


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

B_7671302261533729_C


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

B_6791402261543809_C


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

B_6161502261568136_C


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

B_7031602261515912_C


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

B_6771702261552444_C


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

B_6031802261520535_C


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

B_5701902261575594_C


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

B_5312002261599979_C


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

B_5712102261520094_C


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

B_4832202261567752_C


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

B_3692302261552076_C


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

B_3052402261599243_C


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

B_1952502261524096_C


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

B_1452602261590313_C


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

B_0662702261522679_C


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

B_9492702261583415_C


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

B_0902902261514034_C


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

B_9642902261533154_C


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

B_0673102261535630_C


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

B_9753102261573968_C


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

B_9733202261558902_C


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

B_8613302261573036_C


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

B_7803402261511793_C


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

B_6603502261557119_C


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

B_5483602261514072_C


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

B_4443702261540008_C


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

B_4303802261530776_C


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

B_4253902261561956_C


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

B_4694002261559439_C


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

B_4794102261567976_C


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

B_4094202261572335_C


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

B_4274302261590073_C


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

B_3724402261548712_C


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

B_2964502261511627_C


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

B_2064602261592296_C


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

B_1114702261520738_C


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

B_9974702261562731_C


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

B_8904802261599153_C


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

B_7394902261598294_C


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

B_6615002261567199_C


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

B_5015102261579686_C


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

B_3315202261517250_C


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

B_1745302261596966_C


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

B_0315402261521003_C


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

B_8735402261589917_C


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

B_7945502261548319_C


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

B_6465602261566153_C


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

B_5325702261546116_C


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

B_5305802261567089_C


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

B_4675902261557747_C


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

B_3320002261563543_C


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

B_3200102261559782_C


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

B_1570202261562646_C


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

B_9990202261513844_C


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

B_8770302261530993_C


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

B_8250402261529509_C


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

B_8290502261543331_C


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

B_7390602261569344_C


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

B_5710702261595293_C


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

B_4910802261527099_C


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

B_3250902261539334_C


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

B_1561002261598383_C


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

B_0511102261523839_C


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

B_9401102261548165_C


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

B_7891202261528330_C


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

B_6871302261514326_C


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

B_5301402261550939_C


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

B_4501502261554438_C


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

B_2961602261582730_C


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

B_1481702261584159_C


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

B_0401802261524424_C


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

B_9941802261581370_C


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

B_1892002261561445_C


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

B_0862102261535518_C


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

B_0192202261543942_C


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

B_8902202261543554_C


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

B_9732302261554251_C


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

B_8092402261526034_C


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

B_7162502261511504_C


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

B_5592602261584401_C


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

B_5102702261561844_C


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

B_5482802261593521_C


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

B_6392902261595052_C


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

B_6283002261594834_C


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

B_5793102261562794_C


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

B_5053202261587401_C


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

B_4313302261594519_C


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

B_4773402261528151_C


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

B_5033502261584078_C


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

B_3853602261583298_C


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

B_2453702261574680_C


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

B_1403802261558103_C


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

B_0673902261555104_C


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

B_9523902261513973_C


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

B_9374002261548683_C


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

B_8094102261512297_C


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

B_7144202261570908_C


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

B_5874302261536391_C


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

B_5554402261530925_C


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

B_3884502261572685_C


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

B_2744602261554636_C


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

B_1194702261582218_C


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

B_9824702261565774_C


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

B_8744802261559154_C


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

B_7824902261529939_C


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

B_8255002261545705_C


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

B_8065102261547489_C


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

B_7055202261582296_C


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

B_5965302261554746_C


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

B_4885402261516844_C


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

B_4695502261531427_C


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

B_5275602261518596_C


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

B_5035702261593009_C


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

B_4595802261522709_C


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

B_3845902261537132_C


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

B_6110002261539011_C


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

B_5300102261529738_C


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

B_4150202261543526_C


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

B_4590302261546833_C


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

B_3690402261531091_C


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

B_6420502261589605_C


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

B_3160702261591934_C


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

B_1940802261561134_C


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

B_0640902261570359_C


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

B_9520902261554624_C


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

B_0211102261587779_C


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

B_1351202261527639_C


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

B_2381302261570960_C


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

B_1211402261547190_C


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

B_9891402261554540_C


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

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

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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