Анатомия расширения
Вы смогли запустить базовое расширение. Давайте разберемся, как оно работает изнутри.
Расширение из примера делает 3 основные вещи:
-
Регистрирует событие активации - расширение активируется, когда пользователь запускает команду
helloworld.helloWorld
-
Использует точку вклада - делает команду доступной в палитре команд и привязывает ее к идентификатору команды
helloworld.helloWorld
черезcontributes.commands
-
Использует SDK - привязывает функцию к зарегистрированному идентификатору команды с помощью
commands.registerCommand
Ключевые концепции
Понимание этих концепций имеет решающее значение для написания расширений:
- Contribution Points - статические объявления, которые вы делаете в манифесте расширения
package.json
для расширения функциональности - SDK (Extension API) - набор JavaScript API, которые можно вызывать в коде расширения
Как правило, ваше расширение будет использовать комбинацию Contribution Points и SDK для расширения функциональности.
Структура расширения
Базовая структура расширения:
├── extension.js // Исходный код расширения
├── package.json // Манифест расширения
Манифест расширения
Каждое расширение должно иметь файл package.json
- манифест расширения. Он содержит набор полей, таких как scripts
и devDependencies
, а также поля, специфичные для приложения, такие как publisher
, contributes
. Описания всех полей можно найти в Справочнике по манифесту расширения. Вот некоторые наиболее важные поля:
name
иpublisher
- идентификаторы расширенияmain
- точка входа расширенияactivationEvents
иcontributes
- события активации и точки вклада
{
"name": "my-first-extension",
"displayName": "My First Extension",
"description": "Пример расширения",
"version": "1.0.0",
"publisher": "your-name",
"main": "./extension.js",
"contributes": {
"commands": [
{
"command": "my-first-extension.helloWorld",
"title": "Hello World"
}
]
}
}
Файл расширения
Файл расширения экспортирует две функции: activate
и deactivate
.
activate
выполняется при наступлении зарегистрированного события активацииdeactivate
дает возможность очистить расширение перед его деактивацией
Для многих расширений явная очистка может не потребоваться, и метод deactivate
можно удалить. Однако, если расширению необходимо выполнить операцию во время завершения работы, отключения или удаления расширения, этот метод подходит для этого.
export function activate(sdk, context) {
console.log('Расширение активировано!');
const disposable = sdk.commands.registerCommand(
'my-first-extension.helloWorld',
() => {
sdk.window.showInfoMessage('Hello World from my extension!');
}
);
context.subscriptions.push(disposable);
}
export function deactivate() {
console.log('Расширение деактивировано!');
}