

Visual Studio Code は、2026 年現在でも世界中のデベロッパーが日常的に使用する統合開発環境(IDE)の標準的な選択肢であり続けています。その最大の利点の一つは、柔軟な拡張性です。ユーザーは自身のワークフローに合わせて機能を追加でき、企業レベルでは社内の独自ツールやコンプライアンスルールを反映した拡張機能を開発・配布することができます。しかし、初心者にとって VS Code の拡張機能開発(通称:エクステンション開発)の門戸は、Node.js の環境構築から始まり、VS Code 独自の Extension API の概念理解、さらにはマーケットプレイスへの公開という一連のプロセスにおいて、高いハードルを感じさせるのが現実です。本記事では、2026 年最新のベストプラクティスを踏まえ、Yeoman Generator を使用したプロジェクト生成から、拡張機能の設計、実装、テスト、パッケージング、そして GitHub Actions を用いた自動公開まで、すべての工程を網羅的に解説します。
拡張機能開発を始める際、最も重要なのは「VS Code のアーキテクチャ」を理解することです。単なる Web ページの書き換えではなく、Node.js プロセスとして動作する Extension Host と、エディタ UI を描画する Web Worker 領域が分離して動作しているという点を意識する必要があります。本ガイドでは、この非同期な双方向通信の仕組みを踏まえつつ、具体的なコード例を示しながら解説を進めていきます。また、2026 年時点では TypeScript のモジュールシステム(ESM)が標準に近い形でサポートされているため、CommonJS から ESM への移行についても言及します。
本記事で取り上げる技術スタックは以下の通りです。開発言語には TypeScript 5.x を推奨し、Node.js は LTS バージョンである v20 または v22 を使用します。プロジェクト生成には公式の Yeoman ジェネレーター @vscode/generator-extension(コマンド:yo code)を利用します。API ライブラリとしては、標準的な vscode パッケージに加え、言語サーバー通信を行うための vscode-languageclient 9.x を使用します。パッケージ管理ツールには npm または yarn に対応し、CI/CD には GitHub Actions の最新のワークフロー構文を使用します。これらの具体的なバージョンやツールの組み合わせを指定することで、読者が実際に再現可能な環境構築を支援します。
VS Code 拡張機能の開発を開始するには、まず前提となるランタイム環境を整える必要があります。2026 年現在において推奨される Node.js のバージョンは LTS(Long Term Support)系であり、具体的には v20.10 以上または v22 LTS を使用することを強くお勧めします。これは、ESM モジュールのサポートが完全になり、最新の TypeScript コンパイラとの互換性が保証されているためです。ターミナルに node -v と入力し、バージョンを確認してください。もしバージョンが古すぎる場合、nvm(Node Version Manager)を使用して環境を切り替えるのが安全な方法です。また、パッケージマネージャーとしては npm v9 以上または yarn v4 を使用し、依存関係の管理を安定させます。
プロジェクトの雛形生成には、公式に提供されている Yeoman ジェネレーターである @vscode/generator-extension を利用します。これは yo code というコマンドで起動可能であり、インタラクティブな質問を通じてプロジェクト構造を作成してくれます。まず、ターミナルから任意の開発ディレクトリに入り、以下のコマンドを実行します。
npm install -g yo generator-code
mkdir my-first-extension
cd my-first-extension
yo code
この際、generator-code は最新のテンプレートに基づいて構成されます。質問に対しては、言語に TypeScript を選択し、デバッグ設定を自動で生成するオプションを有効にします。これにより、.vscode/launch.json や .vscode/tasks.json といった開発支援ファイルが事前に用意されます。プロジェクトディレクトリには src/, package.json, tsconfig.json, .gitignore などが生成されます。特に src/ ディレクトリ内にはエントリポイントとなる extension.ts が存在し、ここから拡張機能のロジックを記述していきます。
作成されたプロジェクト構造の詳細な役割について解説します。package.json ファイルは拡張機能のメタデータを定義する重要なファイルであり、拡張機能 ID(例:publisher.extension-name)、バージョン、説明、ライセンス情報などを記載します。また、ここで main 属性にエントリポイントへのパスを指定し、activationEvents でいつ起動すべきかを宣言します。次に、tsconfig.json は TypeScript のコンパイルオプションを管理しており、2026 年推奨の設定では "module": "Node16" または "module": "NodeNext" を採用し、ESM モジュールとして動作する設定を行います。これにより、外部ライブラリのインポートやエクスポートがより標準的な Web デベロッパーの慣習に則った形になります。
{
"compilerOptions": {
"module": "Node16",
"target": "ES2022",
"outDir": "out",
"lib": ["ES2022"],
"sourceMap": true,
"strict": true,
"esModuleInterop": true
}
}
最後に、開発中のコンパイルプロセスについて触れます。VS Code の拡張機能は TypeScript で書かれており、実行時には JavaScript にコンパイルされる必要があります。src/ ディレクトリ内のコードを変更すると、自動的に out/ ディレクトリに生成されるファイルが更新され、拡張機能をデバッグ起動した際に読み込まれる仕組みです。開発中は npm run compile を手動で実行するのではなく、VS Code 内で Ctrl + Shift + B(または Mac では Cmd + Shift + B)を押下してタスクを実行することで、リアルタイムにコンパイルを走らせることができます。また、Watch モードで監視させたい場合は、tasks.json に Watch タスクを追加し、ファイル変更を検知して自動再コンパイルを行う設定も有効な戦略です。
VS Code 拡張機能開発において、最も理解しておかなければならない概念が「Activation Events(アクティベーションイベント)」です。これは、ユーザーがどのような操作を行った際に拡張機能のコードを実行環境に読み込むべきかを定義する仕組みです。無条件で常に起動すると、VS Code のパフォーマンスに悪影響を与えるため、必要な時にのみ起動することが求められます。例えば、特定のファイルが開かれた時(onLanguage:javascript)、特定のコマンドが呼ばれた時(onCommand:my-extension.helloWorld)などに設定します。
2026 年現在では、より効率的な起動のために onStartupFinished イベントも頻繁に使用されます。これは VS Code が完全に起動し終わった後にイベントを発行するもので、初期化コストの高い処理や、エディタの UI 要素を準備したい場合に有用です。また、デフォルトではすべてのアクティベーションイベントに対応しているが、パフォーマンスを最優先する場合、特定の言語サポートのみを提供するといった細かい制御が可能になります。package.json の activationEvents フィールドには配列として記述され、以下のような形式をとります。
"activationEvents": [
"onLanguage:typescript",
"onCommand:my-extension.doSomething",
"workspaceContains:**/.gitignore"
]
次に、「Contribution Points(寄与ポイント)」の概念について理解する必要があります。これは、拡張機能が VS Code の UI や機能にどのように参加するかを宣言する箇所です。例えば、エディタ上に新しいコマンドボタンを追加したり、設定項目を増やしたりします。package.json 内には "contributes" キーがあり、その下に commands, menus, configuration, views など多岐にわたる項目が定義されます。これは拡張機能の可視性を決定づける重要な要素であり、ユーザーが拡張機能を発見しやすさにも直結します。
Extension API の主要な名前空間(ネームスペース)には以下のようなものが存在します。これらは vscode モジュールからインポートして使用します。各名前空間は特定の領域を制御しており、混同しないように注意が必要です。
| 名前空間 | 概要 | 主な用途 |
|---|---|---|
vscode.commands | コマンド登録・実行管理 | メニューやキーボードショートカットのトリガー |
vscode.window | ウィンドウとエディタ制御 | ステータスバー、メッセージ表示、入力ボックス |
vscode.workspace | ワークスペース操作 | ファイルシステムアクセス、設定変更 |
vscode.languages | ランゲージ機能 | 構文強調、自動インデント、診断情報の提供 |
また、拡張機能のライフサイクルには「Activation(起動)」と「Deactivation(停止)」という状態が存在します。VS Code はメモリ効率を高めるため、使用されていない拡張機能を自動的に停止させることがあります。そのため、activate(context) 関数内で初期化処理を行い、dispose() メソッドでリソース解放を行うことが義務付けられています。特に、イベントリスナーやタイマー、外部プロセスの管理は、Deactivation 時に適切にクリーンアップしないとメモリリークの原因となります。この仕組みを正しく実装することは、安定した拡張機能を作る上で不可欠なスキルです。
ここからは具体的な実装に移り、最も基本的な「コマンド登録」の例を見ていきましょう。src/extension.ts の activate 関数内で、vscode.commands.registerCommand を使用して新しいコマンドを作成します。例えば、「Hello World」というメッセージを出力するコマンドを作りたい場合、以下のようなコードになります。
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
const disposable = vscode.commands.registerCommand('my-extension.helloWorld', () => {
vscode.window.showInformationMessage('Hello World!');
});
context.subscriptions.push(disposable);
}
このコードの実行フローを解説します。registerCommand は拡張機能 ID と、そのコマンドが実行された際に呼ばれるコールバック関数を引数に取ります。コールバック関数内では vscode.window.showInformationMessage を呼び出し、メッセージボックスをポップアップ表示させます。重要なのは、context.subscriptions.push(disposable) の部分です。これにより、拡張機能が停止する際に自動的に登録されたコマンドが無効化され、リソースが解放されます。このパターンは、すべての UI 操作やイベントリスナーに対して適用すべき鉄則です。
次に、エディタ内のテキストを直接操作する方法について説明します。vscode.window.activeTextEditor を使用することで、現在フォーカスされているエディタのインスタンスを取得できます。これにより、カーソル位置でのテキスト置換や、選択範囲の編集が可能です。例えば、現在選択されているテキストを大文字に変換するコマンドを作成してみます。
vscode.commands.registerCommand('my-extension.uppercaseSelection', () => {
const editor = vscode.window.activeTextEditor;
if (editor) {
const selection = editor.selection;
const text = editor.document.getText(selection);
const upperCaseText = text.toUpperCase();
editor.edit(editBuilder => {
editBuilder.replace(selection, upperCaseText);
});
} else {
vscode.window.showWarningMessage('エディタがアクティブではありません');
}
});
このコードでは、editor.selection で選択範囲を取得し、editor.document.getText でテキスト内容を抽出しています。その後、editor.edit メソッドを使用して編集操作を定義します。2026 年時点の API では、複数の編集子を一度にまとめて実行できるため、パフォーマンス上の利点があります。また、エラーハンドリングとして if (editor) の分岐を用意し、エディタが開いていない場合に警告メッセージを出すようにしています。これはユーザーエクスペリエンスを向上させるための基本的な配慮です。
ステータスバーへの表示機能も拡張機能開発では頻繁に利用されます。ステータスバーは画面下部に表示され、常に情報を提供できます。vscode.window.createStatusBarItem を使用してアイテムを作成し、テキストやアイコンを設定します。
const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
statusBarItem.text = 'VS Code: 2026';
statusBarItem.tooltip = '現在のバージョン情報です';
statusBarItem.show();
context.subscriptions.push(statusBarItem);
このように作成したステータスバーアイテムは、拡張機能の起動時に常に表示されます。ただし、不要になった場合は dispose() を呼び出してメモリから解放する必要があります。また、StatusBarAlignment.Right で右端配置を指定し、優先度(100)を設定することで、他のステータスバー要素との重なり方を制御できます。
拡張機能の機能をさらに充実させるためには、サイドパネルに表示するツリービューや、独自の HTML コンテンツを表示する Webview の活用が不可欠です。2026 年時点では、Webview API がより強化されており、エディタ内での Web アプリのような体験を提供することが容易になっています。まず、ツリービューの実装について解説します。vscode.TreeDataProvider を実装することで、階層構造を持つデータをサイドパネルにレンダリングできます。
class MyTreeItem extends vscode.TreeItem {
constructor(label: string) {
super(label, vscode.TreeItemCollapsibleState.Expanded);
this.tooltip = `これは ${label} です`;
this.command = { command: 'my-extension.openFile', title: 'Open File' };
}
}
class MyTreeDataProvider implements vscode.TreeDataProvider<MyTreeItem> {
getTreeItem(element: MyTreeItem): vscode.TreeItem | Thenable<vscode.TreeItem> {
return element;
}
getChildren(element?: MyTreeItem): Thenable<MyTreeItem[]> {
if (element) {
return Promise.resolve([]);
}
const items = [new MyTreeItem('ファイル A'), new MyTreeItem('ファイル B')];
return Promise.resolve(items);
}
}
export function activate(context: vscode.ExtensionContext) {
const provider = new MyTreeDataProvider();
vscode.window.registerTreeDataProvider('myExtensionView', provider);
}
このコードでは、MyTreeItem クラスがツリーアイテムのデータと UI 属性を定義し、MyTreeDataProvider クラスがデータの提供ロジックを担当しています。getChildren メソッドは再帰的に呼び出され、階層構造を作成します。また、各アイテムに command を割り当てることで、クリックした際に別の処理を実行できます。
次に Webview の実装です。Webview は HTML, CSS, JavaScript を組み合わせた独自の UI を拡張機能内に表示できる機能です。セキュリティの観点から、外部のリソースを読み込むことは制限されており、ローカルファイルへのアクセスも vscode モジュールを通じて行う必要があります。vscode.window.createWebviewPanel メソッドを使用してパネルを作成します。
const panel = vscode.window.createWebviewPanel('myWebView', 'My Extension Panel', vscode.ViewColumn.Beside, {
enableScripts: true,
});
panel.webview.html = getWebviewContent(panel.webview);
function getWebviewContent(webview: vscode.Webview) {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Extension</title>
</head>
<body>
<h1>Hello from Webview!</h1>
<script>
const vscode = acquireVsCodeApi();
document.addEventListener('DOMContentLoaded', () => {
document.querySelector('button').addEventListener('click', () => {
vscode.postMessage({ command: 'clicked' });
});
});
</script>
</body>
</html>`;
}
この Webview コンテンツでは、acquireVsCodeApi() を使用して VS Code の API にアクセスできるオブジェクトを取得します。これにより、拡張機能本体と Webview 間で双方向通信を行うことができます。ただし、2026 年時点のセキュリティ強化により、インラインスクリプトの実行には慎重な配慮が必要です。外部ライブラリを使用する場合は、必ずコンテンツセキュリティポリシー(CSP)ヘッダーを適切に設定する必要があります。
Webview と拡張機能本体間の通信は postMessage を介して行います。例えば、Webview 内のボタンがクリックされたら、拡張機能側にイベントを送信し、拡張機能側で処理を行います。この双方向通信を実現するには、受信側でも panel.webview.onDidReceiveMessage を使用してメッセージを监听する必要があります。以下に例を示します。
panel.webview.onDidReceiveMessage(message => {
switch (message.command) {
case 'clicked':
vscode.window.showInformationMessage('Webview のボタンがクリックされました');
break;
}
});
このように、ツリービューと Webview を組み合わせることで、複雑な管理画面や設定ツールを VS Code 内で構築することが可能になります。特に、プロジェクトのファイル構成を視覚的に確認したい場合や、外部データを表示するダッシュボードを作成する場合に威力を発揮します。
2026 年現在、VS Code 拡張機能開発において最も高度な領域の一つが Language Server Protocol(LSP)の対応です。LSP は、エディタと言語サーバー間の通信プロトコルを標準化したもので、これによりエディタ側で構文チェック、補完、定義ジャンプなどの機能を提供できます。vscode-languageclient ライブラリを使用して、拡張機能が LSP クライアントとして動作するように設定します。
LSP の基本アーキテクチャは「Client(VS Code 拡張機能)」と「Server(言語処理プログラム)」の双方向通信です。クライアント側では、エディタからの要求をサーバーに転送し、サーバーからの応答を取得して UI に反映させます。実装の難易度は高いですが、vscode-languageclient を使用することで大部分のボイラープレートコードを自動生成・管理できます。
まず、プロジェクトに vscode-languageclient 9.x と node-fetch(または標準モジュール)をインストールします。次に、LSP サーバーのプロセス起動ロジックを記述します。サーバーは独立したプロセスとして動作し、拡張機能から呼び出されます。
let client: LanguageClient;
export function activate(context: vscode.ExtensionContext) {
const serverModule = context.asAbsolutePath(
path.join('server', 'out', 'index.js')
); // サーバーのビルド出力パス
const serverOptions: ServerOptions = {
run: { module: serverModule, transport: TransportKind.ipc },
debug: { module: serverModule, transport: TransportKind.ipc }
};
const clientOptions: LanguageClientOptions = {
documentSelector: [{ scheme: 'file', language: 'typescript' }],
synchronize: { configurationSection: 'myExtension.lspSettings' },
middleware: {
provideHover: async (document, position, token) => {
// カスタムホバーロジック
return null;
}
}
};
client = new LanguageClient('typescript-lsp', 'TypeScript LSP Client', serverOptions, clientOptions);
context.subscriptions.push(client.start());
}
このコードでは、serverModule としてサーバー側の出力先を指定し、TransportKind.ipc を使用してプロセス間通信を行います。documentSelector でどの言語ファイルに適用するかを定義します。また、middleware オプションを使用して、既存の LSP 機能を上書きしたり拡張したりすることが可能です。
LSP が提供する主要な機能について一覧化します。これらを適切に実装することで、ユーザーは IDE を使用しているかのような体験を得ることができます。
| 機能 | 説明 | VS Code API / メッセージ |
|---|---|---|
| Diagnostics | 構文エラーや警告の提供 | textDocument/publishDiagnostics |
| Hover | マウスポインタ表示時にヘルプ | textDocument/hover |
| Completion | 自動補完リストの表示 | textDocument/completion |
| Definition Jump | 定義へのジャンプ移動 | textDocument/definition |
例えば、診断情報を提供する場合は、サーバー側で構文解析を行い、エラー範囲を特定して LSP メッセージとして送信します。クライアント側ではこれを vscode.languages.createDiagnosticCollection を使用してエディタの下部に赤い波線として表示します。このようにして、拡張機能は単なるツールを超えて、開発環境の一部として統合されます。
また、2026 年時点では LSP の仕様も更新されており、より効率的な通信や、大規模プロジェクトへの対応が求められています。例えば、差分アップデートを使用することで、ファイル全体を再解析するのではなく変更部分のみを処理する最適化が可能です。サーバー側の処理速度も重要な要素であり、WASM(WebAssembly)を用いたコンパイルなどにより、拡張機能のレスポンスを高速化するケースが増えています。
高品質な拡張機能を提供するためには、堅牢なテスト戦略が不可欠です。VS Code 公式が提供する @vscode/test-electron を使用することで、実際の VS Code エディタ環境下で拡張機能を自動テストできます。これは、ブラウザのシミュレーションではなく、実際の Electron アプリケーション上で動作するため、信頼性の高い結果を得られます。
テストの実行には、Mocha や Vitest といったユニットテストフレームワークを組み合わせる一般的なアプローチがとられます。@vscode/test-electron は、特定のバージョンの VS Code をダウンロードしてローカルで起動し、その中で拡張機能をロード・実行します。これにより、異なる VS Code バージョン間での動作確認も容易になります。
async function main() {
try {
const extensionDevelopmentPath = path.resolve(__dirname, '../../');
const extensionTestsPath = path.resolve(__dirname, './suite/index');
await runTests({
version: 'stable',
launchArgs: ['--disable-extensions'],
extensionDevelopmentPath,
extensionTestsPath,
});
} catch (err) {
console.error('テスト実行失敗:', err);
process.exit(1);
}
}
main();
このスクリプトを実行すると、npm run test:unit などのコマンド定義に応じて VS Code が自動的に起動・終了します。テストコード内では vscode.window.activeTextEditor のような API を使用して、エディタの状態を検証できます。また、ファイルシステムをモックする必要がある場合、@vscode/test-electron の機能に加え、sinon.js などのライブラリを使用して VS Code の関数をスパーン(Mock)することが可能です。
デバッグにおいては、拡張機能のアクティベーションイベントが正しく発火しているかを確認することが重要です。デバッガー設定ファイル launch.json を使用して、拡張機能をブレークポイント付きで起動できます。特に注意すべきは、拡張ホストプロセスと Web Worker プロセスの違いです。Webview 関連の処理が動かない場合、Web Worker のデバッグ設定を見直す必要があります。
また、パフォーマンステストも重要です。拡張機能の起動時間が遅い場合や、メモリ使用量が増大する場合は、activate 関数内の処理を最適化する必要があります。VS Code DevTools を使用して CPU プロファイリングを行い、ボトルネックとなるコード部分を特定します。2026 年時点では、DevTools の統合度がさらに向上しており、拡張機能開発者向けの専用パネルが用意されていることも事実です。
拡張機能をマーケットプレイスに公開するためには、適切にパッケージ化する必要があります。このプロセスを担うのが vsce([Visual Studio Code Extension CLI)というツールです。npm モジュールとしてインストールし、CLI コマンドを使用して .vsix ファイルを作成します。.vsix は VS Code が認識する拡張機能のアーカイブ形式であり、これによりユーザーはダウンロードしてインストールできます。
パッケージングを行う前に、package.json の内容を確認・更新する必要があります。拡張機能 ID(例:publisher.extension-name)は一意である必要があります。また、バージョン管理には Semantic Versioning(セマンティックバージョニング)に従うのが一般的です。MAJOR.MINOR.PATCH の形式で、互換性のない変更なら MAJOR を、新機能追加なら MINOR を、バグ修正なら PATCH をインクリメントします。
npm install -g @vscode/vsce
vsce package
vsce package コマンドを実行すると、現在のディレクトリ構造から .vsix ファイルが生成されます。このファイルには、すべてのソースコード、アイコン、設定ファイルが含まれます。パッケージサイズが大きくなりすぎると、インストールや更新に時間がかかるため、不要なファイルは.gitignore や.vscodeignore ファイルで除外するのが鉄則です。
2026 年時点の vsce の機能拡張により、以下の詳細情報を記述することが推奨されています。
| フィールド | 説明 | 推奨値 |
|---|---|---|
publisher | パブリッシャー ID | 一意な識別子 |
displayName | マーケットプレース表示名 | 魅力的かつ明確な名前 |
icon | アイコン画像パス | PNG または SVG (1024x1024) |
categories | カテゴリ分類 | Programming, Languages など |
アイコンは正方形の画像(例:1024x1024)を指定し、拡張機能のブランドイメージに合致するものを選びます。また、icon 属性には相対パスまたは絶対パスを指定します。パッケージング時にエラーが発生した場合は、vsce の出力ログを確認し、ファイル権限やパスの問題がないか確認してください。
バージョニング管理は、CI/CD パイプラインと連携させることで自動化することも可能です。Git のタグ付け(例:v1.0.0)をトリガーにして、バージョン番号が自動的に更新される設定が可能ですが、手動で vsce version bump を実行し、コミットを行うのが安全な方法です。
拡張機能の公開を自動化するために、GitHub Actions を使用した CI/CD パイプラインを構築します。これにより、コードがマージされた際に自動的にテストを実行し、パッケージを作成してマーケットプレイスにリリースすることが可能になります。2026 年現在では、セキュリティ強化のため、Secrets の管理がより厳格化されていますが、GitHub Actions での連携は標準的なワークフローとなっています。
.github/workflows/release.yml に以下の YAML ファイルを配置することで、自動公開ワークフローを設定できます。この設定では、Git のタグ(例:v*.*.*)が作成された際に動作します。
name: Release Extension
on:
push:
tags:
- 'v*'
jobs:
publish-extension:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Dependencies
run: npm ci
- name: Package Extension
run: npx vsce package
env:
VSCE_PAT: ${{ secrets.VSCE_PAT }}
- name: Publish Extension
run: npx vsce publish
env:
VSCE_PAT: ${{ secrets.VSCE_PAT }}
このワークフローでは、actions/checkout@v4 を使用してリポジトリをクローンし、setup-node@v4 で Node.js 環境を整えます。その後、依存関係をインストールし、vsce package でアーカイブを作成します。公開には VSCE_PAT という環境変数(Personal Access Token)を使用しますが、これは GitHub レポジトリの Secrets として管理されます。Secrets の設定は、GitHub 設定画面から行い、拡張機能発行に必要な権限を持つトークンを登録します。
CI/CD を構築する際の注意点として、テストステップを必ず含めることが重要です。npm run test:unit をパイプラインに追加し、コードの品質を保証します。また、セキュリティスキャンツール(例:npm audit)を実行し、脆弱な依存関係がないかチェックすることも推奨されます。
拡張機能がパッケージ化され、CI/CD で自動公開が設定されたら、次はマーケットプレイスへの登録です。VS Code Marketplace にアップロードすると、審査プロセスに入ります。2026 年時点では、審査の迅速化が進んでいますが、依然としてポリシー違反がないか厳格にチェックされます。例えば、個人情報収集の明示や、広告表示の制限などがあります。
公開後は、ユーザーからのフィードバックを定期的に確認する必要があります。VS Code Marketplace にはレビュー機能があり、評価スコアが拡張機能の可視性に影響します。また、GitHub の Issues リンクを設定することで、バグ報告を直接受け付けることが可能です。
運用戦略としては、定期的なアップデートによる機能追加やバグ修正が必要です。ユーザーは「最新かつ安定した」ツールを好む傾向があるため、リリースノートを明確に記述し、変更点を伝達します。また、Analytics(使用状況統計)を確認することで、どの機能がよく使われているかを把握し、開発リソースの優先順位を決めることができます。
- **ユーザーフィードバック**: 定期的にレビューをチェックし、不満点や要望を収集する
- **性能監視**: VS Code Marketplace の Analytics を活用してダウンロード数と評価を分析する
- **セキュリティ更新**: 依存関係の脆弱性が発見された場合は、直ちにパッチ適用并发布を行う
2026 年時点では、マルチテナント環境や企業向け拡張機能の需要も高まっており、Enterprise Marketplace への対応を検討することも視野に入れる必要があります。これにより、社内向けのツールを社内マーケットプレイスで管理・配布することが可能になります。
VS Code 拡張機能開発において、初心者や中級者が直面しやすい疑問について、Q&A 形式で解説します。これらの情報は実務経験に基づいた具体的な対処法を含みます。
アクティベーションイベントを設定しないとどうなりますか?
TypeScript の ESM モジュールと CommonJS の違いは何ですか?
import/export 構文を使用します。CommonJS は Node.js 由来の require/module.exports です。2026 年では ESM が推奨され、より高速な起動が可能ですが、一部古いライブラリが CommonJS のみをサポートしている場合があります。拡張機能が VS Code で表示されない場合、どのように確認しますか?
package.json の main パスが間違っている可能性があります。また、activationEvents が正しく定義されているかも要確認です。LSP サーバーの接続が切断される原因は何ですか?
Webview 内の JavaScript が動かない理由は何ですか?
enableScripts: true を指定していないか、または CSP ヘッダーがスクリプト実行を阻害している可能性があります。また、外部リソース(CDN など)へのアクセス制限も確認が必要です。vsce パッケージングでエラーが出る場合どうすればいいですか?
.gitignore や .vscodeignore ファイルを確認し、不要なファイルが含まれていないかチェックします。また、アイコン画像のサイズや形式が要件(1024x1024 PNG)と合致しているかも重要です。テスト実行時に VS Code が起動しない原因は何ですか?
@vscode/test-electron のバージョンが古い場合があります。最新のライブラリに更新し、Node.js バージョンも v20 以上にしてください。また、ネットワーク接続が必要な場合、プロキシ設定の影響を受けることもあります。マーケットプレイス公開の審査に通らない理由は?
複数の言語に対応する拡張機能はどのように作りますか?
activationEvents で各言語を指定し、contributes.languages 内でそれぞれの言語設定を定義します。また、LSP サーバー側で多言語対応のロジックを実装する必要があります。公開後に変更を加える場合、バージョン管理はどうすればいいですか?
package.json の version フィールドと Git タグを同期させることが重要です。本記事では、2026 年時点の最新ベストプラクティスに基づき、VS Code 拡張機能の開発から公開までの全工程を解説しました。開発環境の構築、Extension API の基本概念、具体的な実装例(コマンド・エディタ操作・UI)、LSP 対応、テスト戦略、パッケージング、CI/CD 自動化、そしてマーケットプレイス公開に至るまで、実践的な知識を提供することを心がけました。
以下に本記事の要点をまとめます。
activationEvents と contributionPoints の理解がパフォーマンスと機能性に関わるvscode-languageclient を用いて構文チェックや補完機能を拡張可能@vscode/test-electron とユニット[テストフレームワーク](/glossary/フレームワーク)を併用して品質を保証するvsce を使用し、.vsix ファイルを作成してから公開申請を行うVS Code 拡張機能開発は、ユーザーのワークフローを直接改善できる非常に有意義な活動です。本記事を参考に、ぜひ独自の拡張機能を開発し、コミュニティに貢献してください。

PCパーツ・ガジェット専門
自作PCパーツやガジェットの最新情報を発信中。実測データに基づいた公平なランキングをお届けします。
Visual Studio Codeの初期設定から生産性を最大化する拡張機能・設定・ショートカットまでを完全解説。言語別のおすすめ設定も紹介。
Web開発に必要なPC環境の構築方法を解説。Node.js、Docker、Chrome DevTools、VS Code拡張の設定を紹介。
Chrome拡張機能開発者のpc構成。Visual Studio Code・Manifest V3・AI開発、生産性ツール、ブラウザ拡張、Chrome Web Store販売。
TypeScript/JavaScript開発を快適にするPC環境とツール設定。Node.js、パッケージマネージャ、エディタの最適化を解説。
TypeScriptプロジェクトでモノレポ構成を導入するガイド。TurborepoとNxの比較、パッケージ分割戦略、CI/CDパイプラインの最適化を実践的に解説する。
Playwright を使ったE2Eテストの完全ガイド。セットアップ、テスト作成、ページオブジェクトモデル、CI統合、Visual Regression Testing まで実践的に解説。
その他
NVIDIA Jetson AGX Thor 開発者キット 2000TOPS AIコンピュータ 【NVIDIA正規品】 次世代Grace/Adaアーキテクチャ エッジAI 自律ロボット 機械学習 深層学習 推論マシン
¥860,000CPU
オリジナルピコ開発ボードモジュール RP2040-ゼロマイクロコントローラコア Cortex M0 + プロセッサ
¥535CPU
Waveshare ESP32-C6 ミニ開発ボード 3個 ESP32-C6FH4 ベース、デュアルプロセッサ、160MHzの実行周波数、2.4GHz wi-fi 6 & BLE 5、ESP32開発ボード
¥10,914ゲーミングギア
Waveshare ESP32-C6 1.45インチディスプレイ開発ボード、172×320、262Kカラー、160MHzの実行周波数シングルコアプロセッサ、Wi-Fi 6とBLEをサポート、カラフルなRGB LED付き、AIOTアプリケーションに最適
¥4,844ゲーミングギア
Waveshare ESP32-S3 4.3インチ静電容量式タッチディスプレイ開発ボードB、800×480解像度、5ポイントタッチ、32ビットLX7デュアルコアプロセッサ、最大240MHz周波数、オンボードアンテナ付き
¥8,502無線LANルーター
エレコム メッシュ WiFiルーター 無線LAN 親機+中継器セット WiFi6 11ax 1201+574Mbps IPv6(IPoE)対応 【2021/01/14 ファームウェアVer. 1.15更新】 WMC-2LX-B
¥10,890この記事で紹介したノートパソコンをAmazonで確認できます。Prime対象商品なら翌日届きます。
Q: さらに詳しい情報はどこで?
A: 自作.comコミュニティで質問してみましょう。