Репозиторий библиотеки содержит набор исходных модулей, каждый из
которых реализует отдельный криптографический примитив или
вспомогательную функциональность: генерацию случайных чисел,
симметричное шифрование, хэш-функции, режимы работы блочных шифров,
кодировки и утилиты работы с битовыми массивами. Основная идея сборки
заключается в объединении этих модулей в единый файл
sjcl.js, пригодный для использования в браузере или
Node.js.
Исходная структура проекта организована так, чтобы отделить «ядро»
библиотеки от расширяемых компонентов. Каталог core
содержит базовые реализации криптографических алгоритмов и утилит.
Каталог test используется для модульного тестирования.
Каталог build содержит инструменты сборки и
конфигурационные файлы, определяющие, какие части библиотеки попадут в
итоговый бандл.
Сборка библиотеки опирается на минимальный набор внешних инструментов, которые используются только на этапе компиляции:
make (для автоматизации последовательности
сборки)Важным моментом является отсутствие runtime-зависимостей: итоговый файл не требует сторонних библиотек и полностью самодостаточен.
Сборка начинается с формирования списка исходных файлов. Этот список определяется конфигурацией, где явно перечислены модули ядра и дополнительные компоненты.
Каждый модуль представляет собой JavaScript-файл, который не предполагает использования системы import/export в классическом виде. Вместо этого применяется последовательная конкатенация файлов с соблюдением порядка зависимостей.
Ключевая роль принадлежит скрипту упаковки (packager), который:
sjclПроцесс базовой сборки ориентирован на получение читаемой версии библиотеки. Он используется для отладки и разработки.
Последовательность операций включает:
buildcoresjcl.jsНа этом этапе код остаётся не минифицированным, с сохранением структуры и отступов. Это упрощает диагностику ошибок и анализ внутренней логики.
Гибкость библиотеки обеспечивается возможностью выбора компонентов, которые попадут в сборку. Это реализуется через конфигурационные списки, где указываются:
Такой подход позволяет формировать как минимальные сборки для ограниченных сред, так и расширенные версии с полным набором функций.
Для production-сборки применяется дополнительный этап оптимизации. Он заключается в пропуске итогового файла через Java-based Closure Compiler.
Процесс включает:
генерацию промежуточного sjcl.js
передачу файла в Closure Compiler
применение агрессивной минификации:
Результатом является компактный файл, пригодный для использования в веб-приложениях с ограниченной пропускной способностью.
Система сборки обычно поддерживает несколько предустановленных режимов:
Каждый режим управляется параметрами скриптов в каталоге
build, что позволяет автоматизировать процесс через
make или аналогичные утилиты.
Файл автоматизации сборки описывает последовательность целей, среди которых:
Makefile обеспечивает детерминированность процесса: один и тот же набор исходников всегда приводит к идентичному результату при одинаковых условиях окружения.
Одной из ключевых особенностей сборки является формирование
глобального объекта sjcl. Все модули подключаются внутрь
этого пространства имён, что предотвращает загрязнение глобальной
области видимости JavaScript.
Механизм упаковки автоматически:
Это позволяет использовать библиотеку без конфликтов с другими скриптами в браузере.
После формирования сборки обычно выполняется прогон тестового набора. Тесты проверяют:
Тестирование может запускаться как на исходных модулях, так и на собранной версии, что позволяет выявлять ошибки на этапе упаковки.
При сборке из исходников часто возникают характерные проблемы:
Каждая из этих проблем обычно проявляется либо на этапе упаковки, либо при запуске тестов.
Для ускорения разработки применяется инкрементальный режим, при котором пересобираются только изменённые модули. Это достигается за счёт:
Такой подход снижает время итерации при изменении отдельных криптографических компонентов.
Собранный файл представляет собой единый JavaScript-документ, внутри которого:
sjclФайл не содержит внешних зависимостей и может быть загружен как
обычный скрипт в браузере или подключён через require в
Node.js при соответствующей обёртке.