TSKaigi サイドイベント - Deno で VSCode 拡張機能を作る際の4つの壁 - 2025.05.29

696 Views

May 29, 25

スライド概要

profile-image

Webエンジニアをやってます。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

TSKaigi サイドイベント Deno で VSCode 拡張機能を作る際の4つの壁 2025.05.29, Thu. Akasaka Kouki | koukibuu3

2.

⾃⼰紹介 経歴 SES企業でWebエンジニアとして7年勤務。 前職では、ほぼPHPを書いていた元PHPer 2025年5⽉に any に⼊社しました 🙌 TSKaigi にも CfP 送っていましたが、今⽇は 違うテーマで話します。 Akasaka Kouki @ koukibuu3 / こうきぶー 出⾝ 墨⽥区 趣味 コーヒー、DIY、ゲーム実況 ©any, inc. All rights reserved. 2

3.

⽬次 ❏ VSCode 拡張機能について ❏ 何を作りたかったか ❏ Deno で VSCode 拡張機能を作るということ ❏ 壁① ~ ④ ❏ まとめ ©any, inc. All rights reserved. 3

4.

VSCode 拡張機能について ©any, inc. All rights reserved. 4

5.

VSCode 拡張機能について VSCode Marketplace からインストールできる。 ● Code Spell Checker ● Gitlens ‒ Git supercharged ● ESLint ● Deno ● etc, ... ©any, inc. All rights reserved. 5

6.

VSCode 拡張機能について 最低限必要なもの ● package.json ○ 実⾏ファイルのパスや提供するコマンドや機能の⼀覧など ● extension.js (ファイル名はなんでも可) ○ 実⾏ファイルの本体 Visual Studio Code | Your First Extension https://code.visualstudio.com/api/get-started/your-first-extension ©any, inc. All rights reserved. 6

7.

VSCode 拡張機能について なんだ、Deno でいけるじゃん ©any, inc. All rights reserved. 7

8.

VSCode 拡張機能について (ちなみに)私の Deno の経験 ● Deno x Flesh で⼩さなAPIサーバーを個⼈作成 ● Deno 2.0 のときに変更点を少し素振り ©any, inc. All rights reserved. 8

9.

VSCode 拡張機能について ✕ ほぼ素⼈ 初⾒ ©any, inc. All rights reserved. 9

10.

なにが作りたかったか ©any, inc. All rights reserved. 10

11.

©any, inc. All rights reserved. 11

12.

©any, inc. All rights reserved. 12

13.

何を作りたかったか TSDoc をサポートする拡張機能を作ったら役に⽴つんじゃないか。 ©any, inc. All rights reserved. 13

14.

何を作りたかったか TSDoc を解析してなんやかんやしたい ● ファイル内の TSDoc を⼀覧表⽰ ● ファイル内の TSDoc 記述率、スコアの表⽰ ● TSDoc が書かれていない関数を検出して記述をスマートに補助 ● コンテキストを把握してAIで TSDoc を提案、評価 ● etc, ... ©any, inc. All rights reserved. 14

15.

何を作りたかったか できたもの ©any, inc. All rights reserved. 15

16.

Deno で VSCode 拡張機能を作るということ ©any, inc. All rights reserved. 16

17.

Deno で VSCode 拡張機能を作るということ Deno VSCode 拡張機能 ESM(ES module) CJS(Common JS) ※ VSCode 1.77 以降では限定的だが ESMサポート モジュールシステムの違いをどう乗り越えるか ©any, inc. All rights reserved. 17

18.

Deno で VSCode 拡張機能を作るということ 壁① ESM にビルドして VSCode 拡張機能として動かす 壁② CJS にビルドして VSCode 拡張機能として動かす 壁③ ts-morph を使⽤したコードをビルドして動かす 壁④ Deno API を使⽤したコードをビルドして動かす ©any, inc. All rights reserved. 18

19.

! ポイント --extensionDevelopmentPath、outFiles にビルド済みの本体と package.json を 配置する。⌘ + Shift+P >「デバッグを実⾏」で拡張機能をデバッグする。 ©any, inc. All rights reserved. 19

20.

©any, inc. All rights reserved. 20

21.

壁① ESM にビルドして VSCode 拡張機能として動かす ©any, inc. All rights reserved. 21

22.

壁① ESM にビルドして VSCode 拡張機能として動かす VSCode 1.77 以降では ESM 形式がサポートされている。 じゃあ ESM でビルドすればいいじゃん。 ©any, inc. All rights reserved. 22

23.

! ポイント ● ● denoPlugins を指定することで Deno 互換の import ルールを解決できる。 import * as vscode from "vscode"; は解決できないため external に指定する。 ©any, inc. All rights reserved. 23

24.

! ポイント ● ● ● main に実⾏ファイルのパスを指定。 type に module を指定。 contributes に機能として登録したいものを記載する。 ○ Extension Guides | Visual Studio Code Extension API を参照 ©any, inc. All rights reserved. 24

25.

壁① ESM にビルドして VSCode 拡張機能として動かす ©any, inc. All rights reserved. 25

26.

Deno で VSCode 拡張機能を作るということ OK 壁① ESM にビルドして VSCode 拡張機能として動かす 壁② CJS にビルドして VSCode 拡張機能として動かす 壁③ ts-morph を使⽤したコードをビルドして動かす 壁④ Deno API を使⽤したコードをビルドして動かす ©any, inc. All rights reserved. 26

27.

壁② CJS にビルドして VSCode 拡張機能として動かす ©any, inc. All rights reserved. 27

28.

! ポイント ● format には "cjs" を指定する。 ©any, inc. All rights reserved. 28

29.

! ポイント ● type の module 指定を削除。 ©any, inc. All rights reserved. 29

30.

壁② CJS にビルドして VSCode 拡張機能として動かす ©any, inc. All rights reserved. 30

31.

Deno で VSCode 拡張機能を作るということ OK 壁① ESM にビルドして VSCode 拡張機能として動かす OK 壁② CJS にビルドして VSCode 拡張機能として動かす 壁③ ts-morph を使⽤したコードをビルドして動かす 壁④ Deno API を使⽤したコードをビルドして動かす ©any, inc. All rights reserved. 31

32.

壁③ ts-morph を使用したコードをビルドして動かす ©any, inc. All rights reserved. 32

33.

壁③ ts-morph を使⽤したコードをビルドして動かす TypeScript ファイルの内容を⾒て、解析を⾏いたい。 ⽅法1: ts-morph を使ってコード解析を⾏う。 抽象構⽂⽊(AST)操作が直感的に⾏える。 ⽅法2: TypeScript Compiler API を使う。 抽象構⽂⽊(AST)に対する深ぼった知識が必要。 柔軟性は⾼いが利⽤する上でのハードルも⾼い。 ©any, inc. All rights reserved. 33

34.

壁③ ts-morph を使⽤したコードをビルドして動かす TypeScript ファイルの内容を⾒て、解析を⾏いたい。 ⽅法1: ts-morph を使ってコード解析を⾏う。 抽象構⽂⽊(AST)操作が直感的に⾏える。 ⽅法2: TypeScript Compiler API を使う。 抽象構⽂⽊(AST)に対する深ぼった知識が必要。 柔軟性は⾼いが利⽤する上でのハードルも⾼い。 ©any, inc. All rights reserved. 34

35.

©any, inc. All rights reserved. 35

36.

壁③ ts-morph を使⽤したコードをビルドして動かす ESM ビルドの場合 ©any, inc. All rights reserved. 36

37.

壁③ ts-morph を使⽤したコードをビルドして動かす ts-morph は ESM/CJS 対応のはずだが、CJSベースのモジュールのためか、 require("fs") のような CJS 形式の記述が ts-morph 内に残っている。 そのため、 ESM にビルドした VSCode 拡張だと ts-morph は動かない ©any, inc. All rights reserved. 37

38.

壁③ ts-morph を使⽤したコードをビルドして動かす CJS ビルドの場合 ©any, inc. All rights reserved. 38

39.

壁③ ts-morph を使⽤したコードをビルドして動かす ts-morph は ESM/CJS 対応のはずだが、CJSベースのモジュールのためか、 require("fs") のような CJS 形式の記述が ts-morph 内に残っている。 そのため、 CJS にビルドした VSCode 拡張であれば ts-morph は動く ©any, inc. All rights reserved. 39

40.

Deno で VSCode 拡張機能を作るということ OK 壁① ESM にビルドして VSCode 拡張機能として動かす OK 壁② CJS にビルドして VSCode 拡張機能として動かす 壁③ ts-morph を使⽤したコードをビルドして動かす 壁④ Deno API を使⽤したコードをビルドして動かす ギリ OK ©any, inc. All rights reserved. 40

41.

壁④ Deno API を使用したコードをビルドして動かす ©any, inc. All rights reserved. 41

42.

壁④ Deno API を使⽤したコードをビルドして動かす Deno API とは Deno.readTextFile("./example.txt") Deno.mkdir とか とか、Deno グローバルで⽣えているAPI であり、 Denoランタイム限定で動く。 VSCode 拡張機能は Node.js 実⾏環境で実⾏されるのでムリ ©any, inc. All rights reserved. 42

43.

©any, inc. All rights reserved. 43

44.

©any, inc. All rights reserved. 44

45.
[beta]
壁④

Deno API を使⽤したコードをビルドして動かす

Deno の URL import
import { Project } from "https://deno.land/x/[email protected]/mod.ts";
のように URL import で取得する Deno ⽤の ts-morph は別物のため、

esbuild を⽤いたビルド時にパス解決を⾏うことができない

©any, inc. All rights reserved.

45

46.

まとめ ©any, inc. All rights reserved. 46

47.

まとめ OK 壁① ESM にビルドして VSCode 拡張機能として動かす OK 壁② CJS にビルドして VSCode 拡張機能として動かす OK 壁③ ts-morph を使⽤したコードをビルドして動かす NG 壁④ Deno API を使⽤したコードをビルドして動かす ギリ ©any, inc. All rights reserved. 47

48.

まとめ ● Deno で拡張機能の処理を書く場合、CJS にビルドする必要がある ※対応モジュールを選ばず、限定的なサポートであればESMでも可 ● URL import や JSR のモジュール、Deno API 等、Deno "らしい" 機能は特に使えない。 ● ESM/CJS のモジュールシステム間のしっかりとした理解が必要。 Deno で VSCode 拡張を書くメリットはほとんど無い ※ 2025/5 現在の状況です。 ©any, inc. All rights reserved. 48

49.

まとめ ● VSCode の拡張機能⾃体は、⾮常に簡単に作成できることが分かった。 ○ ○ 公式ドキュメントが⾮常にしっかりしている。 https://code.visualstudio.com/api/get-started/your-first-extension ● ts-morph は AST に深い造詣がなくても利⽤できてとても良い。 ● Deno で TypeScript を書き始めるための設定が何も要らないのが良い。 ● ESM only / CJS ベースのモジュールなど、理解が深まった。 ● TSDoc を解析する拡張機能⾃体の可能性は感じた。 ©any, inc. All rights reserved. 49

50.

©any, inc. All rights reserved. 50

51.

ありがとうございました。 https://x.com/koukibuu3 Engineer Culture Deck https://github.com/koukibuu3 https://speakerdeck.com/any_tech/ engineer-culture-deck-v3-dot-0 ©any, inc. All rights reserved. 51