Дата последнего изменения: 25.10.2024
bitrix/js/<module>/<extension> bitrix/modules/js/<module>/<extension> local/js/<module>/<extension>
Обязательные элементы: src, dist, bundle.config.js, config.php.
Необязательные элементы (директории): lang, test, @types.
Если у вас установлен @bitrix/cli
, то структуру расширения можно
создать
Для создания расширения ("экстеншна"):
1) Перейдите в директорию local/js/{module}
2) Выполните команду bitrix create
3) Ответьте на вопросы мастера
Подробнее...
, выполнив команду bitrix create
.
src |
В директории src следует располагать исходные файлы в формате ES6. Из файлов в данной директории на основании данных файла конфигурации и внутренних ссылок будут созданы финальные версии для подключения в браузере (бандлы) в формате ES5.
Внутри файла вы можете использовать import других файлов из текущей директории или импортировать другие CoreJS расширения.
Для импорта переменных и классов из другого файла в текущей директории используйте следующий синтаксис:
import {SomeClass} from "./file";
import './file.css';
import {Loader} from 'main.loader';
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.
module.exports = { // Файл, для которого необходимо выполнить сборку. // Обычно это './src/<extension>.js // Необходимо указать относительный путь input: string, // Путь к бандлу, который будет создан в результате сборки // Обычно это ./dist/<extension>.bundle.js // Необходимо указать относительный путь output: 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>, }, };
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
Mocha (Мока) — JavaScript тест-фреймворк, который можно запускать как на node.js, так и в браузере, удобен для асинхронного тестирования. Тесты Mocha запускаются серийно, позволяя гибко и точно создавать отчеты.
Подробнее...
-тестов. Для каждого файла должна создаваться директория с именем тестируемого файла и вложенным в нее файлом с тестами в формате <sourceName>.test.js.
Например, при такой структуре в `src`
директория test должна иметь следующую структуру:
\Bitrix\Main\UI\Extension::load('main.loader');
Метод \Bitrix\Main\UI\Extension::load
принимает в качестве параметра имя расширения, либо массив имен.
import {Loader} from 'main.loader';
Если вы хотите импортировать старое расширение (не поддерживающие import ES6, например, main.date), укажите импорт без экспорта расширения:
import "main.date";
Когда вы импортируете расширение в JS, сборщик автоматически добавляет это расширение как зависимость в config.php.
import {Runtime} from 'main.core'; Runtime.loadExtension('main.loader').then((exports) => { // Код, который использует `main.loader` // В `exports` будут все экспорты из `main.loader` });
Отложенная загрузка может быть полезна когда ваш функционал используется на странице не сразу, а например только тогда, когда пользователь откроет попап или выполнит какое-нибудь действие.