Noumen docs
Extension APIНачало работы

Анатомия расширения

Вы смогли запустить базовое расширение. Давайте разберемся, как оно работает изнутри.

Расширение из примера делает 3 основные вещи:

  1. Регистрирует событие активации - расширение активируется, когда пользователь запускает команду helloworld.helloWorld

  2. Использует точку вклада - делает команду доступной в палитре команд и привязывает ее к идентификатору команды helloworld.helloWorld через contributes.commands

  3. Использует 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('Расширение деактивировано!');
}