Blockly состоит из более чем сотни файлов TypeScript. Перед использованием их необходимо скомпилировать в JavaScript с помощью компилятора TypeScript tsc
. Это создаёт такое же количество файлов .js
, подходящих для локального тестирования, но загрузка такого количества файлов через Интернет вызывает медленную загрузку для конечных пользователей. Для ускорения загрузки Blockly используется компилятор Closure Compiler , который сжимает (минифицирует) их и объединяет в полдюжины файлов («пакетов» или «кусков»), общий размер которых более чем вдвое меньше размера несжатых файлов.
При этом код, использующий новейшие функции ECMAScript, которые могут быть совместимы не со всеми браузерами, транслируется в формат ES6, который, как правило, совместим с большинством распространённых браузеров. Поэтому важно предоставлять конечным пользователям только минифицированный код.
Репозиторий google/blockly содержит только исходный код. Ранее он также содержал продукты сборки, но с 2019 года минифицированные пакеты публикуются в виде пакета blockly
NPM , а с 2022 года также прикрепляются к каждому релизу GitHub в виде .tgz
файла. Поэтому нет необходимости собирать Blockly, если только вы не занимаетесь непосредственно самим Blockly, в частности, файлами в каталогах core
, blocks
, generators
или msg
.
Процесс сборки, тестирования и публикации Blockly автоматизирован с помощью скриптов npm для запуска задач Gulp . На этой странице описаны основные скрипты и их назначение.
Сжатый и несжатый режим
Загрузка Blockly непосредственно из отдельных .js
файлов, сгенерированных компилятором TypeScript, называется «несжатым режимом». Поскольку это позволяет избежать нескольких медленных этапов сборки, это ускоряет цикл «редактирование-компиляция-запуск». Это также облегчает отладку, поскольку исполняемый код JavaScript практически так же легко читается, как и исходные коды TypeScript, что устраняет необходимость в картах исходного кода.
Загрузка Blockly из минифицированных пакетов называется «сжатым режимом». Это лучший способ протестировать изменения в Blockly при использовании его в качестве зависимости другого пакета, поскольку тестируется (неопубликованная версия) npm-пакета blockly
.
Примечание: в некоторых местах блочного репозитория термины «нескомпилированный режим» и «скомпилированный режим» используются как синонимы «несжатого режима» и «сжатого режима» соответственно. Раньше такое использование имело смысл, поскольку Closure Compiler использовался для сжатия (минификации) кода, но теперь компилятор TypeScript требуется всегда, даже в несжатом режиме, поэтому такая альтернативная терминология может сбивать с толку и не рекомендуется.
Быстрый старт
Если вы внесли локальные изменения и хотите убедиться, что они не нарушили сборку или какие-либо тесты, запустите
npm test
для сборки Blockly и запуска его тестового набора.
Если вы хотите протестировать локальные изменения в браузере, запустите
npm start
Это скомпилирует Blockly и откроет веб-браузер, указывающий на игровую площадку Blockly, на которой будет работать Blockly в несжатом режиме.
Любые измененные файлы в
core/
,blocks/
иgenerators/
автоматически перекомпилируются; перезагрузите вкладку браузера, чтобы увидеть изменения.Чтобы собрать локально модифицированную версию Blockly и протестировать ее в сжатом режиме как зависимость другого пакета npm, выполните:
npm run package
для сборки пакета Blockly, затем
cd dist && npm link
чтобы указать npm, где найти скомпилированные файлы, а затем
cd
в каталог вашего проекта перед запускомnpm link blockly
чтобы ваш пакет использовал свежескомпилированную версию Blockly вместо опубликованного пакета
blockly
.
Подробный справочник по сценарию
В этом разделе перечислены основные scripts
в файле package.json
Blockly с пояснениями того, что они делают.
Эти скрипты генерируют файлы в двух местах:
- Файлы в подкаталоге
build/
являются промежуточными файлами, используемыми для локального тестирования или принимаемыми более поздними частями конвейера сборки. - Файлы в подкаталоге
dist/
формируют содержимое опубликованного пакета npm.
Ни один из каталогов не отслеживается в блочном репозитории git.
clean
npm run clean
очищает все предыдущие сборки, удаляя каталоги build/
и dist/
. Полезно для исправления нестандартных ошибок сборки, особенно вызванных переименованием исходного файла.
messages
npm run messages
обновляет файлы сообщений в msg/json/
с учетом всех изменений, внесенных в msg/messages.js
, и должен запускаться после каждого изменения этого файла.
langfiles
npm run langfiles
генерирует скомпилированные языковые файлы в build/msg/
из файлов сообщений в msg/json
.
tsc
npm run tsc
запускает компилятор TypeScript для содержимого каталогов core/
, blocks/
и generators/
и выводит отдельные файлы .js
в build/src/
.
minify
npm run minify
запускает closure-make-deps
и closure-calculate-chunks
, чтобы определить, как разделить скомпилированные файлы .js
на фрагменты (минифицированные пакеты), после чего запускает closure-compiler
для создания фрагментов следующим образом:
- Содержимое
build/src/core/
станетdist/blockly_compressed.js
. - Содержимое
build/src/blocks/
станетdist/blocs_compressed.js
. - Содержимое
build/src/generators/javascript/
(плюсbuild/src/generators/javascript.js
) становитсяdist/javascript_compressed.js
. - И то же самое для
dart
,lua
,php
иpython
.
Сгенерированные chuk используют оболочку для обеспечения совместимости с универсальным определением модулей, поэтому перед включением в пакет не требуется дополнительная обработка.
build
npm run build
запускает задачи minify
и langfiles
. Этого должно быть достаточно для загрузки плейграунд-зоны Blockly в сжатом или несжатом виде.
package
npm run package
запускает задачи clean
и build
, а затем:
- Применяет UMD -оболочку к файлам в
build/msg/
, помещая упакованные версии вdist/msg/
. - Добавляет различные дополнительные файлы поддержки в
dist/
, с UMD-оболочками, где это применимо.
publish
Команда npm run publish
используется командой Blockly для публикации пакета blockly
npm. Она зависит от внутренней инфраструктуры Google, поэтому бесполезна для сторонних разработчиков.
lint
npm run lint
запускает ESLint , выполняя статический анализ исходного кода Blockly для поиска проблем.
test
npm test
(или npm run test
) запускает задачу package
, а затем различные автоматизированные тесты (включая запуск ESLint). Эта команда должна запускаться (и проходить) для любого кода, отправленного в виде запроса на извлечение (pull request) в блочном репозитории.