10年もののjQueryフロントエンドを良くしていくための道筋

47.8K Views

August 24, 24

スライド概要

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

あなたにとってのjQueryはなんですか? ● キャリア黎明期を形作った技術? ● ブラウザ間の差異を吸収してくれた福音? ● prototype.jsからの移行に苦しめられた思い出? ● あるいは、全く知らない過去の技術?

2.

私にとってjQueryは青春でした

3.

10年ものの フロントエンドを 良くしていくための道筋 菅原 政行 @plageoj

4.

菅原 政行(@plageoj) 株式会社Faber Company (ファベルカンパニー) 新卒入社2年目 自称SRE、なんでもやります https://plageoj.me/

5.

プロダクトについて デジタルマーケティング支援SaaS B2B、内製Webサービス ● SEO(情報収集、順位監視) ● アクセス分析 Java/JSP + jQuery 2015年リリース

6.

開発チームについて 日本4名・ベトナム20名規模で一緒に開発しています

7.

このセッションの考え方 主張すること: ● レガシー資産を尊重する ● メンテナンス性を確保する ● 将来的な移行に耐えられるコードベースにする 主張しないこと: ● jQueryを捨てて移行する ● E2Eテストをモリモリ書いて動作を保証する

8.

についておさらい

9.

ブラウザ間の差異を吸収 例えば document.getElementsByClass Name もIE8までは 使えなかった jQueryではIE8でも $(".") で 要素を選択できる(1.x系まで) ref: caniuse

10.

拡張可能なAPI $ という独自オブジェクトをグローバル名前空間にもつ → 当時流行っていた Prototype と比較して機能拡張がし やすかった → 多数のプラグインが公開されリッチなフロントエンド を作りやすくなった

11.

Ajaxインターフェースを提供 XHR jQuery

12.

なぜ私たちは jQuery を使い続けるのか ● 自動テストがない ○ 全体に及ぶような変更を避ける必要 ● サービス全体を通して MPA である ○ ほとんどのルートがログイン必須 ○ 細かいパフォーマンスチューニングが不要 →重厚なフレームワークはいらなかった

13.

抱えていた課題 ● どこからでもDOM操作ができ、🍝 に ● 野良のプラグインが入って管理不能に ● バンドラーが不在 ○ 読み込み順の問題 ○ グローバル変数ありすぎ問題 ○ テストができない問題

14.

リファクタリングの方向性 1. 命名をよくする 2. Linter が活躍できる環境を作る ● グローバル変数への依存を整理する ● スタイルを統一する ● 粛々とエラーに対応する 3. コードベースを<管理可能>に

15.

管理可能なコードとは ● Readable ● Reliable ● Maintainable ● Testable

16.

命名をよくする

17.

なぜ命名から? ● 「良い命名」は難しいが、「明らかに悪い命名」は わかりやすい ○ スペルがおかしい ○ 命名規則に従っていない ○ 共通語彙を使っていない ……など ● 命名の変更はデグレードしにくい ● ある程度機械的に検出できる→Traceability

18.

“supper admin” cspell を導入しエディタ拡張・CIで追跡 対応状況をトレースして進捗を説明

19.

Linter が活躍できる環境を作る

20.

グローバルありすぎ問題に立ち向かう ESLint を導入。グローバル変数を global に移動 何が入っているかを把握する → バンドラー導入後に import へ置き換えを想定

21.

jQuery × ESLint ESLint の jQuery globals を使うと簡単に対応できる バージョン違いに注意!

22.

バンドラーを入れて global を減らす Webpack を導入 ● 多数のページから呼ばれるユーティリティ関数から順 に import して使うように移行 ● ESLint の警告も減ってうれしい ● その気になれば TypeScript も使える

23.

型チェックの導入 TypeScript を導入 ● TypeScript に書き直したくなる気持ちをこらえる ● CheckJs オプションを使う ● 型エラーはほどほどに対処する ● jQueryプラグインの型定義を自前で作る

24.

コードベースを管理可能にする

25.

管理可能なコードとは ● Readable ● Reliable ● Maintainable ● Testable

26.

取り組み順序 1. 使っていないコードは消す 2. 使っているライブラリを棚卸し 3. アップデート 4. 型情報の追加

27.

不要コードの削減 ● 未使用機能を閉鎖する ● Unreachable なコードを削除する ● 使っていないライブラリを削除する

28.

CDN移行 ● 直接ソースコードを置いているライブラリがあった ● npm で公開されているものは 1. CDN から読み込む 2. package.json にバージョンを記載する 3. 将来的に npm へ移行したい ● そうでないものは廃止も検討

29.

ライブラリの管理 とにかく package.json に現行バージョンを書く ● 何のライブラリを使っているか把握する ● バージョンアップの調査を npm に任せる ● 脆弱性チェックを Dependabot に任せる

30.

開発環境のモダナイズ

31.

依存関係の切り離し SSR部分をフロントエンドに寄せる ● jQuery の責任が増えてきた ○ 用意された HTML の一部を書き換える役割から ページの大部分を組み立てる役割へ

32.

DOMを宣言的っぽく組み立てる 1. DOMを一カ所で追加 2. そこまでは変数で持つ 3. 属性をオブジェクトで 与える 4. イベントハンドラは in-placeで書く

33.

DOMを宣言的っぽく組み立てる JSPへの移行イメージ

34.

DOMを宣言的っぽく組み立てる 気軽にXSSを埋め込めて危険 原則使わない

35.

テストの導入 Webpack移行により、jest / jsdom によるテストを導入 DOM操作にかかわるテストが記述できるようになった

36.

モダナイズをやりたくなったら

37.

ツールの選定に対して考えたこと ● ピンポイントで問題を解決できるものを ● トレースができるものを ● 多少古くても文献があるものを

38.

全部やらない vs. 全部やる 変更行数が万単位に及ぶような、超巨大な PR を 許容するか? ● コマンド一発の機械的な変更なら、アリ ● 人間の手が入っているなら、やめたほうがいい

39.

どうやって全員の関心にしていくか マージブロック 定期的な周知 定期的な監視 ツールの整備 ドキュメントの整備 方向性を決める

40.

jQueryフロントエンドを良くしていくために ● ツールに指摘してもらってレベルを上げよう ● 低コストで始めて Quick win を得よう ● 根気と責任をもって改善を続けよう

41.

プロセスやツールよりも個人と対話を コードベースの改善にはゴールも正解もない チームで語り合って行き先を決めよう ぜひ話しかけてください! @plageoj