Дата последнего изменения: 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`
});
Отложенная загрузка может быть полезна когда ваш функционал используется на странице не сразу, а например только тогда, когда пользователь откроет попап или выполнит какое-нибудь действие.