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

もう俺には関係なくないTypeScript/Our TypeScript

dojineko
August 23, 2021

もう俺には関係なくないTypeScript/Our TypeScript

@fukuoka.ts #3

dojineko

August 23, 2021
Tweet

More Decks by dojineko

Other Decks in Technology

Transcript

  1. もうオレには関係なくない TypeScript :|| 2021-08-23 fukuoka.ts @dojineko

  2. どじねこ @dojineko GMOペパボ / よろず屋

  3. 今日お話する内容

  4. TypeScriptが便利なのはわかったよ

  5. でも、業務でレガシーを抱えてる オレにはあまり関係ないもんな...

  6. 実務で使えるやり方ってないんだろうか...

  7. やりましょう

  8. もくじ ➔ これまでのTypeScript ➔ 理想と現実 ➔ TypeScriptを学ぶとは ➔ 気軽に使える武器たち

  9. はじめるまえに • おはなしすること ◦ TypeScriptの簡単な現状 ◦ お仕事で使うための取り組み方 ◦ 便利な武器へのポインタ •

    おはなししないこと ◦ TypeScriptの新機能 ◦ TypeScriptの細かな言語仕様 ◦ 具体的なコードについて
  10. これまでのTypeScript

  11. 拡大するTypeScript • 2012年に登場したTypeScriptは、JavaScriptによるアプリケーション 開発シーンの拡大により、2018年頃より急速にシェアを伸ばしている GitHubにおける言語ランキングの推移 (https://octoverse.github.com/)

  12. 型定義の拡充 • 2021年現在においては型情報の提供が豊富に行われており TypeScriptで実装されたモジュールも増えてきている • 星の数ほどあるモジュールのどれが継続的に メンテナンスされているかの一つの指標になる 型定義が含まれるパッケージは npm で

    TSのアイコンが表示されます
  13. • 「TypeScript」という言語仕様となり、Microsoftの実装した「tsc」 以外にも、「swc」(Rust) や「babel」といったトランスパイル速度に 特化した実装や、統合的な開発体験を意識した「rome」も出てきてい る 言語仕様にもなったTypeScript

  14. 実行環境としてのTypeScript • TypeScript を前提とした実行環境 Deno が登場した • ちょっと古い話題だと ts-node が

    production ready になった ※ 個人的には Deno をとても推しています
  15. ツールなどの対応 • 各種フレームワークやツールでTypeScriptを最初からサポートする アップデートが提供されており、特別な設定を行わず型を使用した 開発が可能になってきた。 ◦ Next.js、Nuxt.js などのフロントエンドフレームワーク ◦ Nest.js

    などのフルスタックフレームワーク ◦ Vite のTypeScriptテンプレート
  16. これまでのTypeScript - まとめ ➔ TypeScriptが言語仕様として見られるようになってきており、 開発規模拡大時に障壁になるトランスパイル時間を 削減、高速化する実装が出てきている ➔ 2019年頃までに比較してフレームワークやツールが積極的に TypeScriptをサポートするようになり、導入の敷居が低くなった

    ➔ 単なるJavaScriptへのトランスパイルの利用にとどまらず、 そのまま実行できる環境も出てきた
  17. 理想と現実

  18. 考えうる理想 • TypeScriptを取り巻く環境はより良くなってきており、 比較的導入しやすい状態になってきたと言えそう • 新規開発であれば技術選定の候補には必ず入れてもいいような状態 • 「よーしパパ、TypeScriptで開発始めちゃうぞ〜!」

  19. 立ちふさがる現実 • 現実は...理想には...程遠いことが...あまりにも多すぎる... ◦ 一番導入しやすそうな新規開発ってそんなに機会は無い ◦ 20年近く積み上げられたレガシーなシステムの存在 ▪ 例: PHP

    と jQuery のアプリ ▪ 例: Ruby on Rails と CoffeeScript のアプリ ◦ 課せられたミッションはそれらの運用と保守 ▪ 運用と保守 • 運用と保守 ◦ 運用と保守 ▪ 運用と保守
  20. やっぱオレには関係ないじゃん... 休みはゲームして遊びたいし...

  21. ちょっとまって! 休みはゲームで遊ぼう

  22. 現実は分解して認識しよう • TypeScript は JavaScript のスーパーセット ◦ つまり、今あるアプリ資産を捨てる必要はない ◦ 手を加えるところからTypeScriptにしていけるということ

    • TypeScriptで開発するメリットを把握しておく ◦ 今ある現実をより良くするための手段と理解しておく ▪ 型による整合性チェックができる ▪ コード品質が上がる ▪ モチベーションの向上 など
  23. 課題の分解例 1 • 例: PHP と jQuery のアプリ ◦ jQuery

    を使っているコードはTypeScriptでも書ける ▪ 拡張子を「js」を「ts」に変えてビルドするだけで良い ▪ より簡単には「js」のままでも型推論や補完を使える ◦ jQuery は TypeScript の型定義が提供されている ◦ 今あるコードを全て「ts」にしてもいいし、手を加える部分だ け「ts」にするという戦略も取れる
  24. 課題の分解例 2 • 例: Ruby on Rails と CoffeeScript のアプリ

    ◦ CoffeeScript は JavaScript を出力する ◦ JavaScript にさえなれば TypeScript としても扱える ▪ decaffeinate などでざっと変換するとよい ◦ Rails の場合は Webpacker 組み合わせることもあるが、 これは無理して使わなくても良い ▪ 素朴に tsc でビルドして配置するだけでもいい ▪ webpack や rollup で別途ビルドするやり方も
  25. 脱線タイム: TypeScriptにするメリットとは? • 開発体験の向上 ◦ VSCodeなど対応している環境を使えば、コード補完つかえる • コード品質の向上 ◦ 無視されがちな

    undefined や null の可能性をチェックできる • テスト工数の削減 ◦ ビルド時にある程度間違いを事前に検知できる • モチベーションの向上 ◦ 見落とされがちだが人間が開発している以上は、 人間の気持ちの状態は開発速度に大きく影響する。
  26. ちょっと古いけどこれらのスライドも参考に見てくれるとうれしいです https://speakerdeck.com/dojineko

  27. 脱線タイム: レガシーに対しての接し方 • 本当に一切触らなくていいなら何もしないでおこう ◦ なにも手を入れないで済むのはそれはそれで理想状態 • 継続的に手を入れる必要があるものなら端っこから改善していこう ◦ 手を入れやすいようにしていかないと開発速度は必ず鈍化する

    ▪ 将来の自分、チームメンバーを苦しめることになる • 見てると「アレ」な実装はあるので「今までありがとう」を意識しよう ◦ パラダイムの変化や機能の改善、技術水準の変化に起因する ◦ 感謝しつつも、適切に対処することが大切
  28. 理想と現実 - まとめ ➔ いきなりTypeScriptを実務に活かそうとすると、新規開発はともか く、継続案件ではなかなかないという現実に立ちふさがれる ➔ TypeScriptはJavaScriptのスーパーセットであるという特性を 使えば、システムの保守運用でも活用するシーンは大いにある ➔

    開発品質を上げるために、モチベーションを上げるために、 未来に負債を残さないためにやっていきましょう
  29. TypeScriptを学ぶとは

  30. うわ しんどそう... 必要なことはJSとTSを別々に学ぶのではなく...

  31. TSがJSを内包したモノであると理解すること 一石二鳥!

  32. TypeScriptの歩き方 • TypeScriptはJavaScriptのスーパーセット • JavaScriptの構文はすべてTypeScriptで使用可能 • TypeScriptを学ぶとはすなわちJavaScriptも同時に学ぶこと ◦ JavaScriptがわかればTypeScriptで覚えることは比較的僅か ◦

    学習量が二倍あるということではなく 1つ覚えれば2つの知識として使えるお得なセット!
  33. 具体的な手段の例 • やりたいことドリブンでとにかく手を動かす ◦ やってみるのが一番早い • JavaScript Primerを見る ◦ https://jsprimer.net/

    • TypeScript Handbookを見る ◦ https://www.typescriptlang.org/docs/handbook/intro.html • 本を読む ◦ 体系的に一気に覚えてしまいたいときは効率が良い ◦ 本の知識はその時点のスナップショットになる
  34. 気軽に使える武器たち

  35. そのまえに「気軽に使える」とはなんだろう? • 気軽に使うために必要なこととは? ◦ 手がかからないこと ▪ とりあえず入れればなんとかなりそうなもの ◦ すぐ使えること ▪

    複雑な設定を必要とするものは職人が必要になる ◦ 過剰に「簡単」でないこと ▪ 「簡易さ」と「単純さ」は異なる
  36. 脱線タイム:「気軽に使える」を理解しよう • 「気軽に使える」仕組みには様々な工夫がされている ◦ 一方でそれらが割り切った要素があることを理解して使おう ◦ 例えば... ▪ 内部で使われてるライブラリに細かい設定ができないかも? ▪

    依存関係の理由で一部の最新の機能を使えないかも? • 割り切りは悪いことではなく、単に使い方があってないということ ◦ 別の手段を模索するのも一つの手 ◦ 使う前にかならず評価しよう
  37. フロントエンドの場合

  38. Vite (https://ja.vitejs.dev/) • Vue.js を作った Evan You 氏が作成したフロントエンドツール ◦ バンドラではなくそれらをベースにした開発ツール

    • ES Moduleをベースとしておりビルドが高速 (rollupによるもの) ◦ require ではなく import を使用する • JSを活用したペライチのページをまるごと作ったり 既存のJS資産をESMに対応させればビルドも可能 • TypeScript向けのテンプレートが存在していてすぐ使える • React、Vue、Svelte など好きなものが使える
  39. Vite で React を使用する場合の設定例 (テンプレートより) ViteにReact用のプラグインを 設定しているだけだがこれが全て

  40. • ランディングサイトをReactやVueで楽しつつ作りたい ◦ テンプレートを使ってすぐに開発に取りかかれる ◦ CSS Modulesなども最初から使える状態 • すでにある小規模なReactやVueアプリのビルドを整理したい ◦

    ビルド処理を整理してViteに移譲してメンテナンス性を上げる • 今動いている JavaScript を TypeScript に移行したい ◦ 細かな設定をせずビルド環境を用意できる ◦ 必要であれば内部の rollup の設定もできる Viteの活用例
  41. Svelte (https://svelte.dev/) • フロントエンドコンパイラ ◦ VueやReactと異なりSvelteでビルドした結果は ほぼ純粋なJavaScriptとして出力される • バンドルサイズが比較的小さい (※

    諸説あり) • 仮想DOMを使わない • 実装にはTypeScriptも使用できる • 書き味はVueに近い (※ 個人の感想です)
  42. Svelteで作ったコンポーネントのサンプル https://svelte.dev/examples#nested-components

  43. • Chromeの拡張のポップアップ画面をSvelteで作る ◦ ビルド結果のサイズが小さく高速なメリットを活かす • React と Vue を横断して使えるコンポーネントを作る ◦

    サイズが小さく、場合によっては単独でも使える点を活かす Svelteの活用例
  44. ちょっと宣伝 (TS+Vite+Svelte) • TypeScript と Vite、Svelteを組み合わせて、 Chromeの拡張機能を作ったときのお話があるそうです! • @litencatt のLTに乞うご期待

  45. Next.js / Nuxt.js • フロントエンドの完全な新規開発や、リプレース案件の候補に • 必要であればWebAPIを作るための仕組みも備わっている • 開発元やコミュニティによる進化が継続している ◦

    TypeScriptのサポートもある • ※取り上げると膨大になるので今回は割愛...
  46. フロントエンド以外の場合

  47. Deno • TypeScript の実行環境 (=TSをそのまま実行できます) • Rust+TS製、swcによるトランスパイルが行われているため高速 • Node.js 向けのライブラリもCDNを経由することで使用できる

    • 1コマンドでインストールできるので、環境構築が楽 • VSCode向けの拡張機能を入れればDeno向けのコード補完もOK • 標準APIに準拠しておりMDNに互換性情報が載るようになった
  48. ts-node • Node.jsでTypeScriptを直接実行するためのライブラリ • Node.jsの資産をすべてそのまま使用可能 • 型チェックをONにしても実用上問題ない速度で動作する • Node.jsの互換性情報はMDNに載っている

  49. MDNにおけるDenoとNode.jsの互換性リスト対応の様子 (例: TextDecoder)

  50. Denoやts-nodeの活用例 • 手元で使う便利ツールをts-nodeやDenoで作る ◦ TypeScriptの学習の機会を作りたいときなど ▪ 「とりあえずShellScriptにするか」とかの代替にしたり ◦ チームにじわじわと普及させていきたいときなどに •

    WebAPIサーバーの実装に ◦ ts-nodeならExpressが使える ◦ DenoならDeno deployをつかうと本番環境の構築もかんたん
  51. clasp (https://github.com/google/clasp) • Google製のGoogle App Script(GAS)開発ツール • Node.js上で動作する • TypeScriptでGASを作成しデプロイできる

    • GAS向けの型情報がつかえる • Jestなどでテストできる
  52. 気軽に使える武器たち - まとめ • 今ある資産を活かしながら TypeScriptのメリットを活用する手段はたくさんある • ツールは活用シーンに合わせて評価しよう • JavaScript/TypeScriptはフロントエンドだけでなく

    サーバーサイドや手元の環境、GASなど 活用シーンはいろいろある!
  53. まとめ

  54. 今回のまとめ • TypeScriptは新規開発だけでなく、既存資産に対しての組み込みや 運用効率化にも活用できる • 最近では、TypeScriptを前提とした簡単に使える仕組みが増えてき ており、導入や置き換えにかかるコストがかなり低下している • TypeScriptを触っていればJavaScriptも完全に理解できる...かも?

  55. Happy TypeScript!!

  56. None