Расширения
Расширение — способ организации JS и CSS кода в 1С-Битрикс: Управление Сайтом и Битрикс24. Расширения помогают организовать код, обеспечивая его модульность и управляемость. Они позволяют объединять файлы JavaScript и CSS в бандлы, что упрощает их загрузку и использование в браузере. Бандлы — это объединенные файлы, которые помогают оптимизировать загрузку ресурсов.
Расположение расширений
Расширения, которые поставляются с продуктами 1С-Битрикс: Управление Сайтом и Битрикс24, расположены в директории bitrix. Клиентские расширения обычно размещаются в папке local.
-
/bitrix/js/<module>/<extension>/ -
/local/js/<module>/<extension>/
Структура
Пример структуры расширения myextension:
-
src— исходные файлы. -
dist— бандлы для браузера. -
bundle.config.js— конфигурационный файл для сборщика. -
config.php— конфигурационный файл экстеншна. -
lang— локализации. -
test— тесты. -
@types— файлы*.d.ts.
Обязательные элементы: src, dist, bundle.config.js, config.php.
Необязательные элементы: директории lang, test, @types.
Если у вас установлен консольный инструмент @bitrix/cli, то структуру расширения можно создать, выполнив команду bitrix create.
Директория src
В директории src размещаются исходные файлы в формате ES6. Из этих файлов на основании данных файла конфигурации и внутренних ссылок будут созданы финальные версии в формате ES5 — бандлы. Они используются для подключения в браузере.
Внутри файла можно использовать import других файлов из текущей директории или импортировать другие CoreJS расширения.
Для импорта переменных и классов из другого файла в текущей директории используйте следующий синтаксис:
-
если в папке
srcесть файлfile.jsс экспортируемым классомSomeClassimport {SomeClass} from "./file"; -
для импорта
file.cssimport './file.css'; -
для импорта CoreJS 2.0
import {Loader} from 'main.loader'; -
для импорта библиотеки из CoreJS 1.0
import "main.date";
Директория dist
В директории dist располагаются файлы, автоматически созданные с помощью сборщика для последующего подключения в браузере. Обычно это файлы <extension>.bundle.js и <extension>.bundle.css.
Файл bundle.config.js
Файл конфигурации сборщика.
-
Базовая конфигурация.
module.exports = { input: './src/app.js', output: './dist/app.bundle.js', };В данном файле конфигурации не указываются файлы CSS. Их необходимо импортировать в файле, который указан в параметре
input— точке входа сборки.// Файл из input — src/app.js import './style.css'; // импорт CSS -
Все параметры.
module.exports = { // Файл, для которого необходимо выполнить сборку. // Необходимо указать относительный путь input: string, // Путь к бандлу, который будет создан в результате сборки. // Обычно это ./dist/<extension_name>.bundle.js // Необходимо указать относительный путь output: string || {js: string, css: string}, // Неймспейс, в который будут добавлены все экспорты из файла, // указанного в input. Например, 'BX.Main.Filter' namespace: string, // Списки файлов для принудительного объединения. // Файлы будут объединены без проверок на дублирование кода. // sourcemap's объединяются автоматически. // Необходимо указать относительные пути concat: { js: Array<string>, css: Array<string>, }, // Разрешает или запрещает сборщику модифицировать config.php. // По умолчанию true (разрешено) adjustConfigPhp: boolean, // Разрешает или запрещает сборщику удалять неиспользуемый код. // По умолчанию true (включено) treeshake: boolean, // Разрешает или запрещает пересобирать бандлы, // если сборка запущена не в корне текущего расширения. // По умолчанию `false` (разрешено) 'protected': boolean, plugins: { // Переопределяет параметры Babel. // Можно указать собственные параметры Babel // https://babeljs.io/docs/en/options // Если указать false, то код будет собран без транспиляции babel: boolean | Object, // Дополнительные плагины Rollup, // которые будут выполняться при сборке бандлов custom: Array<string | Function>, }, // Определяет правила обработки путей к изображениям в CSS. // Доступно с версии 3.0.0 cssImages: { // Определяет правило, по которому изображения должны // быть обработаны: // 'inline' — преобразует изображения в инлайн // 'copy' — копирует изображения в директорию 'output' // По умолчанию 'inline' type: 'inline' | 'copy', // Путь к директории, в которую должны быть скопированы // используемые изображения output: string, // Максимальный размер изображений в кб, которые могут быть // преобразованы в инлайн. // По умолчанию 14кб maxSize: number, // Использовать ли svgo для оптимизации svg. // По умолчанию true svgo: boolean, }, resolveFilesImport: { // Путь к директории, в которую должны быть скопированы // импортированные изображения output: string, // Определяет разрешенные для импорта типы файлов. // По умолчанию ['**/*.svg', '**/*.png', '**/*.jpg', '**/*.gif'] // https://github.com/isaacs/minimatch include: Array<string>, // По умолчанию [] exclude: Array<string>, }, // Определяет правила Browserslist: // false — не использовать (по умолчанию) // true — использовать файл .browserslist / .browserslistrc browserslist: boolean | string | Array<string>, // Включает или отключает минификацию. // По умолчанию отключено. // Может принимать объект настроек Terser: // false — не минифицировать (по умолчанию) // true — минифицировать с настройками по умолчанию // object — минифицировать с указанными настройками minification: boolean | object, // Включает или отключает преобразование нативных JS классов. // По умолчанию значение параметра выставляется автоматически // на основании browserslist transformClasses: boolean, // Включает или отключает создание Source Maps файлов sourceMaps: boolean, // Настройки тестов tests: { // Настройки локализации localization: { // Код языка локализации. По умолчанию 'en' languageId: string, // Включает или выключает автозагрузку фраз в тестах. // По умолчанию включено autoLoad: boolean, }, }, };
Файл config.php
Конфигурационный файл расширения config.php определяет, какие файлы необходимо подключить на странице.
При использовании @bitrix/cli файл config.php будет автоматически создан при сборке и будет обновляться по мере необходимости. Например, если в коде JS появится зависимость, которая не указана в config.php, она будет автоматически добавлена в rel.
-
Базовая конфигурация.
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) { die(); } return [ 'css' => './dist/loader.bundle.css', 'js' => './dist/loader.bundle.js', 'rel' => [ 'main.core' ] ]; -
Все параметры.
... return [ // Путь к `css` файлу или массив путей // Рекомендуем указывать относительный путь 'css' => String | Array<String>, // Путь к `js` файлу или массив путей к `js` файлам // Рекомендуем указывать относительный путь 'js' => String | Array<String>, // Список зависимостей // Необходимо указать имена расширений, которые должны быть // подключены перед подключением текущего расширения // Зависимости подключаются рекурсивно и с учетом указанного порядка 'rel' => String | Array<String>, // Путь к файлу с языковыми фразами или массив путей. // Файл `lang//config.php` подключается автоматически, // здесь его можно не указывать 'lang' => String | Array<String>, // Запрещает подключать `main.core` автоматически как зависимость. // По умолчанию `false` — `main.core` подключается. // При сборке бандла значение параметра устанавливается автоматически, // если в коде нет прямой зависимости на `main.core` 'skip_core' => Boolean, // Обработчик, который вызывается перед подключением расширения на странице. // В качестве первого параметра будет передан массив конфигурации расширения. // Обработчик может модифицировать этот массив и вернуть из функции. // Это полезно, когда необходимо добавить в языковые фразы // какие-то данные с сервера 'oninit' => Function, // Дополнительные языковые фразы. // Это полезно для передачи вычисляемых значений языковых фраз. // Принимает массив. В качестве ключей необходимо указывать идентификаторы языковых фраз 'lang_additional' => Array<string, string>, // Параметр доступен с версии 20.5.100 модуля main. // Параметр позволяет указать настройки, // которые могут быть получены в JS // с помощью метода Extension.getSettings(). 'settings' => Array ];
Директория @types
Директория может содержать файлы <name>.d.ts с описанием публичного JS API расширения на TypeScript. Рекомендуем использовать файлы *.d.ts для описания API библиотек, написанных на ES5. Описывать код ES6 не нужно.
Пример описания расширения main.loader.
declare module 'main.loader'
{
type loaderOptions = {
target?: HTMLElement,
size?: number,
mode?: 'absolute' | 'inline' | 'custom',
offset?: {
top?: string,
left?: string
},
color?: string
};
class Loader
{
constructor(options?: loaderOptions);
readonly layout: HTMLElement;
readonly circle: HTMLElement;
createLayout(): HTMLElement;
show(target?: HTMLElement): Promise<any>;
hide(): Promise<any>;
isShown(): boolean;
setOptions(options: loaderOptions): void;
destroy(): void;
}
}
Директория test
Директория должна содержать вложенные директории и файлы Mocha-тестов. Для каждого файла необходимо создать директорию с именем тестируемого файла и файлом с тестами в формате <sourceName>.test.js.
Если структура src имеет вид:
-
src-
entity-
column.js -
row.js
-
-
app.js
-
Директория test должна иметь следующую структуру:
-
test-
entity-
columncolumn.test.js
-
rowrow.test.js
-
-
appapp.test.js
-
Использование расширений
В PHP загрузите и подключите расширение на странице с помощью метода\Bitrix\Main\UI\Extension::load. Этот метод принимает в качестве параметра имя расширения либо массив имен.
\Bitrix\Main\UI\Extension::load('main.loader');
В JS можно импортировать экспорты расширения или выполнить отложенное подключение.
-
Импорт экспортов расширения.
import {Loader} from 'main.loader';Если вы хотите импортировать старое расширение, которое не поддерживает import ES6, укажите импорт без экспорта расширения.
import "main.date";При импорте расширения в JS сборщик автоматически добавляет это расширение как зависимость в
config.php. -
Отложенное подключение.
import {Runtime} from 'main.core'; Runtime.loadExtension('main.loader').then((exports) => { // Код, который использует `main.loader` // В `exports` будут все экспорты из `main.loader` });Отложенная загрузка полезна, когда функционал используется на странице не сразу. Например, когда пользователь откроет всплывающее окно или выполнит какое-нибудь действие.