Расширения
Расширение — способ организации 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с экспортируемым классомSomeClass
- для импорта
file.css
- для импорта CoreJS 2.0
- для импорта библиотеки из CoreJS 1.0
Директория dist
В директории dist располагаются файлы, автоматически созданные с помощью сборщика для последующего подключения в браузере. Обычно это файлы <extension>.bundle.js и <extension>.bundle.css.
Файл bundle.config.js
Файл конфигурации сборщика.
- Базовая конфигурация.
В данном файле конфигурации не указываются файлы CSS. Их необходимо импортировать в файле, который указан в параметре input — точке входа сборки.
- Все параметры.
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.
- Базовая конфигурация.
<?php 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 имеет вид:
Директория test должна иметь следующую структуру:
test/
├── entity/
│ ├── column/
│ │ └── column.test.js
│ └── row/
│ └── row.test.js
└── app/
└── app.test.js
Использование расширений
В PHP загрузите и подключите расширение на странице с помощью метода\Bitrix\Main\UI\Extension::load. Этот метод принимает в качестве параметра имя расширения либо массив имен.
В JS можно импортировать экспорты расширения или выполнить отложенное подключение.
- Импорт экспортов расширения.
Если вы хотите импортировать старое расширение, которое не поддерживает import ES6, укажите импорт без экспорта расширения.
При импорте расширения в JS сборщик автоматически добавляет это расширение как зависимость в config.php.
- Отложенное подключение.
import {Runtime} from 'main.core';
Runtime.loadExtension('main.loader').then((exports) => {
// Код, который использует `main.loader`
// В `exports` будут все экспорты из `main.loader`
});
Отложенная загрузка полезна, когда функционал используется на странице не сразу. Например, когда пользователь откроет всплывающее окно или выполнит какое-нибудь действие.