Slide 1

Slide 1 text

pixivのフロントエンド開発の これまでとこれから yto (ユト)

Slide 2

Slide 2 text

2021年新卒入社 pixiv事業本部 小説チーム (〜2023.12) → コミュニティユニット (〜現在) フロントエンドエンジニア・たまに PdMをやっています yto (ユト)

Slide 3

Slide 3 text

話すこと 1. pixivのフロントエンドのこれまで ● PHP の世界に React / Vue.js が入り、 Next.js の世界ができるまで 2. pixivのフロントエンドの現在 ● Next.js 化プロジェクトの進行と得られた恩恵 3. Next.js化プロジェクトの課題 4. pixivのフロントエンドのこれから ※説明のため、意味が大きく変わらない範囲で話が簡略化されている箇所があります。

Slide 4

Slide 4 text

pixivのフロントエンド のこれまで

Slide 5

Slide 5 text

www.pixiv.netの誕生 PHPで実装されていた (2007年〜) https://www.itmedia.co.jp/news/articles/0803/19/news059.html

Slide 6

Slide 6 text

スマートフォン版touch.pixiv.netの誕生 デスクトップPC版 (www.pixiv.net) とは別ドメイン touch.pixiv.net で リリース PHPで実装されていた (2010年〜) https://www.pixiv.co.jp/news/press-release/article/878/

Slide 7

Slide 7 text

サービスの拡大・UIの進化 複雑なロジック・アニメーション等 のリッチな UI が実装されていく PHP + Smarty + js, css (+ jQuery等)

Slide 8

Slide 8 text

デスクトップ版・スマホ版のドメイン統合 www.pixiv.net に統一 フロントエンドの実装は別 れたまま → UserAgent によって出 し分ける (2018年)

Slide 9

Slide 9 text

SPAの世界に移行 デスクトップ版が React, スマホ版が Vue.js を導入 し、それぞれが SPA 化さ れた (2018年〜)

Slide 10

Slide 10 text

SPAの世界に移行 二重実装のつらさを緩和 するためにコードの共通 化が行われるように 共通のロジック・定数などをパッケージ化

Slide 11

Slide 11 text

主要ページのレスポンシブ化 (2020年〜)

Slide 12

Slide 12 text

Next.js の世界の誕生 新規のリポジトリで Next.js プロジェクトを作成し、実装を リプレイスしていく取り組み (2022年〜)

Slide 13

Slide 13 text

pixivのフロントエンドのこれまで

Slide 14

Slide 14 text

pixivのフロントエンド の現在

Slide 15

Slide 15 text

SPA (React, Vue.js) 世界の課題 ● ビルドやテストにかかる時間を短縮したいが、複雑な設 定ファイルに手を入れるのが難しい 1から設定されたビルドシステム

Slide 16

Slide 16 text

SPA (React, Vue.js) 世界の課題 内部に存在する複数のフロントエンドプロジェクトと、そ れをまとめる yarn workspaces ● 影響範囲が広くてライブラリアップデートが難しい ● デプロイロック待ちの発生 関係者が多い大きなモノレポ

Slide 17

Slide 17 text

SPA (React, Vue.js) 世界の課題 ● あらゆる機能改修をそれぞれ実装する必要がある ○ → ダッシュボード・リクエスト機能等をレスポンシブ で作ったことで、開発速度の違いが明らかに ● 新規開発者の学習コストもそれぞれかかる デスクトップ版とスマホ版の二重実装

Slide 18

Slide 18 text

新規のNext.jsプロジェクトで pixivのフロントエンドを リプレイスする

Slide 19

Slide 19 text

ねらい ● pixivのフロントエンド開発者が、フロントエンド開発に 対してオーナーシップを持てるようにする ○ ライブラリのアップデート、新しいライブラリの導入ができる ○ ビルドが遅かったら改善できる ○ テストやデプロイのフローを改善できる ○ バックエンド・他プロジェクトとデプロイがかち合わない なぜ新規のリポジトリ?

Slide 20

Slide 20 text

ねらい ● 既存の React 実装が移行しやすい ● 広く普及したフレームワークに乗ることができる ○ pixiv固有のビルドシステムを理解しなくても公式の丁寧なド キュメントを読めばいい ○ 社内でも利用実績が増えていて、知見が共有しやすい なぜNext.js?

Slide 21

Slide 21 text

キックオフ〜最初のリリースまで エンジニア2名を中心に、2022年3月末〜 8月のおよそ4ヶ月でリクエスト機能が Next.js に 全体に関わる実装を移植 → ページごとに移植

Slide 22

Slide 22 text

https://inside.pixiv.blog/2022/08/15/120000

Slide 23

Slide 23 text

現在まで 移行された既存ページの例 ● デスクトップ版のイラスト・マンガ・小説投稿画面 ● pixiv小説の「FACTORYでつくる」ページ ● 設定画面(デザインリニューアル含む) ● お知らせページ(デザインリニューアル含む) 新規開発は Next.js, 既存ページは徐々に移行

Slide 24

Slide 24 text

得られた恩恵

Slide 25

Slide 25 text

● デプロイフローの改善 ○ before: ロックをとって手動ビルドしてデプロイ ○ after: MR をマージしたら CI が自動でデプロイ ● ビルド時間の改善 ○ before: 本番ビルド 〜10分、開発ビルド 〜1分 ○ after: 本番ビルド 〜5分、開発ビルド 〜5秒 コードベースに改善を入れやすくなった

Slide 26

Slide 26 text

コードベースに改善を入れやすくなった ● 新しいライブラリへの置き換え ○   styled-components →   Tailwind Css ○   Redux →   TanStack Query

Slide 27

Slide 27 text

全てが最高になった!

Slide 28

Slide 28 text

……わけではない

Slide 29

Slide 29 text

Next.js移行 (リプレイス) の課題

Slide 30

Slide 30 text

課題1: 3つの世界が4つの世界に pixivには150ほどのページが存在し、新規 開発も積極的に行われている 移行期間が長引くほど、 Smarty / React / Vue.js / Next.js の4つの世界を並行して開 発し続けることに

Slide 31

Slide 31 text

課題1: 3つの世界が4つの世界に 当初の見積もりの2倍程度の 時間がかかってしまった 小説投稿画面 Next.js 移行時の反省

Slide 32

Slide 32 text

課題1: 3つの世界が4つの世界に ● Class Component を Function Component に全て書き換え ● 表紙画像生成の状態の持ち方を整理 →時間をかけて完璧な実装を目指すより、まずは 移行を終わらせることを目指したほうが良い 小説投稿画面 Next.js 移行時の反省

Slide 33

Slide 33 text

課題2: pixiv内の他ページとの遷移 Next.js で新規実装されたページ ↔ React / Vue.js で実装 されたページが非 SPA 遷移になる ● 遷移・ブラウザバックに時間がかかる ● 遷移前後の状態が保たれない

Slide 34

Slide 34 text

課題2: pixiv内の他ページとの遷移 ホーム ( ) で作品を眺める → 続きが気になって作品ページ ( ) に飛ぶ → 読み終わってブラウザバックすると作品の 並びが変わり、スクロール位置もリセット pixivの「ホーム」タブ実装時の課題

Slide 35

Slide 35 text

課題2: pixiv内の他ページとの遷移 BFCache (Back/forward Cache) が有効になるようにし て、ブラウザバック時にキャッシュから高速に元のページ の状態を復元 pixivの「ホーム」タブ実装時の課題 https://web.dev/articles/bfcache#optimize-your-pages-for-bfcache

Slide 36

Slide 36 text

課題2: pixiv内の他ページとの遷移 BFCache が有効な場合 BFCache が無効になり そうな場合

Slide 37

Slide 37 text

課題3: ページサイズの増加と表示速度の低下 Next.js 化したページでは ● TTFB (Time to first bite) が悪化 ● LCP (Largest Contentful Paint) が改善 しており、初期に移行していた要素数の少ないページでは 恩恵のほうが大きかった

Slide 38

Slide 38 text

課題3: ページサイズの増加と表示速度の低下 コンテンツが多いページでは最初に 降ってくる HTML のサイズが大きい → TTFB の悪化によって体感できる程 度にページ速度が低下

Slide 39

Slide 39 text

課題3: ページサイズの増加と表示速度の低下 検討中の改善 ● 初回アクセスで表示するコンテンツ量 の調整 ● 翻訳データの遅延読み込み

Slide 40

Slide 40 text

pixivのフロントエンド のこれから

Slide 41

Slide 41 text

スマホ版「ホーム」タブのリリース 今年7/1から段階的リリース開始 🎉 pixivの中でアクセス数が多いページの1つ → ここまでに話したような課題も見えてきた スマホ版pixivのトップページが Next.js に [pixiv] お知らせ - モバイル版pixivのトップページに新しいタブが追加されます

Slide 42

Slide 42 text

pixivのフロントエンドのこれから ● ページ速度の改善 ● 4つの世界を1つの世界に ○ 作品詳細画面など主要ページの Next.js 化 より速く、より多くの価値をユーザーに 届けられるフロントエンド開発

Slide 43

Slide 43 text

END