Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Prettier のしくみ

Prettier のしくみ

2019年7月30日のginzajsのLT資料です

208355d7af69fa84a78048f78077048a?s=128

sosukesuzuki

July 30, 2019
Tweet

More Decks by sosukesuzuki

Other Decks in Programming

Transcript

  1. Prettier のしくみ ginza.js 2019/07/30

  2. 自己紹介 - 鈴木颯介(Suzuki Sosuke) - GitHub(@sosukesuzuki) - Twitter(@__sosukesuzuki) - Ubie,

    inc インターン(フロントエンドエンジニア) - Boostnoteメンテナ - Prettier コントリビュータ - 筑波大学情報科学類
  3. Prettier - JavaScriptで書かれたコードフォーマッター - JS / TS / HTML /

    CSS / YAML / GraphQL などに 対応
  4. フォーマット例

  5. 使い方①ーCLI

  6. 使い方②ーNode.js

  7. 使い方③ーBrowser(ESM)

  8. Prettier のすること もとのテキスト フォーマットされたテ キスト

  9. Prettier のすること もとのテキスト AST(抽象構文木) Doc フォーマットされたテ キスト パース プリント① プリント②

  10. パース PrettierはもとのテキストをパースしてAST(抽象構文木)を作る パーサーは外部ライブラリに依存する - JavaScript → @babel/parser - TypeScript →

    @typescript-eslint/typescript-estree - Markdown → remark.js - など 作ったASTはprinterと呼ばれる関数にわたされる
  11. Prettier の扱うAST パーサーに外部のものを使うので当然ASTも外部のものを扱う。 - JavaScript/TypeScript: ESTree - Markdown: mdast -

    など ESLint ルールや Babel プラグインなどを作ったことがある人は printer のコードを理解 しやすいかも。
  12. プリント① ASTから、Docと呼ばれる Prettier がコードを整形するために使う中間形式への変換を 行う。 それぞれのASTごとに異なる関数が用意されている。 - JavaScript/TypeScript: src/language-js/printer-estree.js -

    Markdown: src/language-markdown/printer-markdown.js ASTの各ノードの種類に応じてSwitch文で分岐させて具体的なフォーマットを決定する 実際にテキストの整形が行われるのはここ
  13. Doc コードを整形するために使う中間形式 AST とは違って整形対象の言語に依存しない テキストに近いかたちをしていて、次のような情報を含む - どこにインデントが入るか - どこに改行が入るか -

    など どの言語のASTから変換されたDocでも同一のアルゴリズムでテキストに変換される
  14. プリント② Docから文字列に変換する ここで変換された文字列が最終的なフォーマット結果 - src/doc/doc-printer.js (printDocToString) どの言語のコードから変換されたDocでもこの関数を使ってテキストに変換される

  15. まとめ もとのテキスト AST(抽象構文木) Doc フォーマットされたテ キスト パース プリント① プリント②

  16. まとめ もとのテキスト AST(抽象構文木) Doc フォーマットされたテ キスト パース プリント① プリント②

  17. ありがとうございました