$30 off During Our Annual Pro Sale. View Details »

Vue Language Server から生まれた Volar.js と、それが秘める可能性

mizdra
October 28, 2023

Vue Language Server から生まれた Volar.js と、それが秘める可能性

Vue Fes Japan 2023 で発表したスライドです。

発表概要:
.vue でエディタの補完機能などを効かせるために、Vue Language Server というツールがあります。実はこのコアは Volar.js という OSS に切り出されています。Volar.js は "あらゆる組み込み言語" のためのフレームワークであり、Vue.js 以外にも利用できる汎用性を備えています。このセッションでは Volar.js が一体どういうものなのか、そしてその汎用性がどのような可能性を秘めているのかについてお話します。

mizdra

October 28, 2023
Tweet

More Decks by mizdra

Other Decks in Programming

Transcript

  1. 言語機能ってどうやって実装してるの? • いくつか実装方法はあるが... ◦ Language Server Protocol に則った方法が主流 • Language

    Server Protocol (LSP) ◦ 2016 年に Microsoft が発表 ◦ エディタに言語機能を実装するための標準仕様 8
  2. LSP の基本コンセプト • 『Language Server Protocol の仕様 及び実装方法 (*2)』より ◦

    • エディタとは別に Language Server (LS) がある ◦ これが言語機能を実装してる • エディタは LS を介し、ユーザに言語機能を提供 9 LSPの基礎コンセプトは、IDEがサポートしていた各機能(言語サービスと 呼ばれます)を標準化し、エディタ本体から分離するというものです。 *2: https://zenn.dev/mtshiba/books/language_server_protocol/viewer/02_introduction より引用
  3. Vue.js における Language Server • Vue.js には .vue (Single File

    Component) がある ◦ 独自のファイルフォーマット • .vue 向けの言語機能を提供するために... ◦ Vue.js は独自の Language Server を持ってる 13
  4. Vue.js における Language Server • Vue Language Features ◦ a.k.a.

    Volar ◦ 公式推奨 • 昔の公式推奨は Vetur ◦ お世話になってた人も多いはず • (アンケートタイム) 14
  5. .vue の LS の実装はちょっと特殊 • <template> / <script> / <style>

    ◦ HTMLタグ、JavaScript、CSS が書ける ▪ 当然、HTML や JavaScript の言語機能を使いたい ◦ 3言語ぶんの言語機能の提供が必要 15
  6. 似たようなファイルは他にも • 例: .html / .astro / .svelte • あるファイルの中に組み込まれている言語

    ◦ 「Embedded (Programming) Language 」と呼ぶ ◦ 日本語で「組み込み言語」 16
  7. 組み込み言語向けの LS • VS Code 公式サイトで LS の作り方が解説されてる ◦ https://code.visualstudio.com/api/language-extensi

    ons/embedded-languages ◦ 2つの実装アプローチを紹介 ▪ Language Services ▪ Request Forwarding 17
  8. 組み込み言語向けの LS • VS Code 公式サイトで LS の作り方が解説されてる ◦ https://code.visualstudio.com/api/language-extensi

    ons/embedded-languages ◦ 2つの実装アプローチを紹介 ▪ Language Services ▪ Request Forwarding 18 Vue Language Server は こっち
  9. Language Services アプローチとは • 仮想ファイルを各言語向けの「Service」で処理 ◦ Service: LS のコアを抽出したライブラリの俗称 ▪

    言語機能のロジックだけを提供するやつ。LSP は喋らない。 ▪ 例: vscode-html-languageservice, etc. 20 foo.vue.html -> HTML の Service で処理 foo.vue.ts -> TypeScript の Service で処理
  10. .vue の深淵 その1 26 JavaScript の式が書ける -> foo.vue.1.ts として TypeScript

    の Service で処理 <template> の中にも、 TypeScript の仮想ファイルが隠れてる
  11. Vue.js コミュニティの努力 • 2016/11: Vetur 0.1 (initial release) • 2017/01:

    Scss/Less 対応 • 2017/03: v-* 属性の補完に対応 • 2018/01: import Foo from './Foo.vue' の自動挿入 • 2019/02: {{ … }} 内で props/methods の補完に対応 • 2019/04: {{ … }} 内の型チェック 35
  12. さらなる高みへ • 2020: Vue Language Features (initial release) ◦ Vetur

    とは別実装の LS ▪ 型チェックのパフォーマンス改善 ▪ より多くの言語機能の対応 • 2023/02: Vue Language Features 1.0 ◦ Vue.js 公式の推奨に ◦ コアが Volar.js という OSS に切り出される 36
  13. Volar.js の生まれた背景 • Vetur で直面した課題は... ◦ 「組み込み言語」に共通するもの ◦ Astro や

    Svelte でも困ってる • Vue.js は多大な努力で解決しつつあるが... ◦ 誰もがそれをできる訳ではない 38
  14. Volar.js の生まれた背景 • Volar.js はその解決を手助けする • 面倒な作業を肩代わりしてくれる ◦ フレームワーク固有の、最小限のコードを書くだけ ◦

    あとは Volar.js がやってくれる • そのおかげで... ◦ フレームワーク開発者: 重要なことだけに集中できる ◦ ユーザ: 豊富な言語機能が使える 39
  15. Volar.js 活用事例: typescript-plugin-asset • @mizdra/typescript-plugin-asset ◦ .ts からアセット (画像など) を

    import するのを補助 58 ② Enter で補完 & import文も自動挿入 ① コード補完で suggest されて...
  16. Volar.js 活用事例: typescript-plugin-asset • TypeScript Language Service Plugin として実装 ◦

    TypeScript の LS の挙動をカスタマイズする仕組み ▪ コード補完の候補を書き換えたり 59
  17. Volar.js 活用事例: typescript-plugin-asset • .png に .ts が埋め込まれてると誤認させる ◦ •

    TypeScript の LS が、.png を .ts かのように扱うように ◦ コード補完に出してくれる 60
  18. まとめ • Volar.js は、Vue.js だけじゃない ◦ あらゆる組み込み言語のためのもの • 様々な言語ツールを作れる ◦

    Language Server / Checker / Formatter / … • Astro などで導入が始まってる ◦ 組み込み言語全体の開発体験を変えつつある 63
  19. まとめ • Vue.js 公式ブログ(*3)より (翻訳) ◦ Vue.js コミュニティ発の OSS が、

    コミュニティを超えて影響していく 64 *3: https://blog.vuejs.org/posts/volar-a-new-beginning より Viteが Vue エコシステムから生まれ、最終的に Web 開発エコシステム全 体のユーザーを結びつける独自のコミュニティに成長したのと同様に、 Volar.js も同じ道をたどることを望んでいます。