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

freeeのエンジニアとReactチュートリアルを学ぼう

kemuridama
December 18, 2024

 freeeのエンジニアとReactチュートリアルを学ぼう

kemuridama

December 18, 2024
Tweet

More Decks by kemuridama

Other Decks in Programming

Transcript

  1.   2 メイン業務 - 2018 年新卒 - 2017 年から内定者インターンとして join

    - 会計基盤チーム所属 - 主にフロントエンド周り - freee会計の技術的負債の返済 - JavaScript -> TypeScript - 実装の標準化 その他の活動 - freee Tech Night 運営リーダー - Dev Branding / Dev Releationship - freee 技術の⽇運営 - その他 - 社内イベント運営 - 株主総会運営 (~2022) - 社内スタジオ構築 SNS - X (Twitter): @_kemuridama kemuridama フリー株式会社 エンジニア / DevRel Ryo Ochiai プロフィール画像の トリミング⽅法
  2.   3 ▼略歴 • 熊本県出⾝ 🏯 • 2022年04⽉1⽇⼊社 ▼業務 •

    新卒⼊社してから、ファイルボックスと呼ばれる ファイルストレージ機能をメインで担当 • 現在会計のリアーキテクトを担当するチームで、 機能のマイクロサービス化をやっています! ⾃⼰紹介(@piro) piro フリー株式会社 エンジニア Hiroki Iwashita
  3.   6 • 細かい説明を省くもの ◦ Web サービスの仕組み ◦ HTML/CSS の事前知識

    ◦ JavaScript の書き⽅ • やらないこと ◦ ローカル開発環境の構築 ◦ タイムトラベルの実装 ◦ TypeScript による開発 やらないこと 全体での説明を省くだけなので 分からないことは恥ずかしがらず 気軽に freee のエンジニアに 聞いてね!
  4.   12 HTML / CSS / JavaScript の 3 つを学べば

    最低限 Web サイトを作ることができる!
  5.   15 • UI (User Interface) を作るための JavaScript ライブラリ •

    コンポーネントと呼ばれるパーツを実装し、それを組み合わせることで UI を表現する • JSX (JavaScript XML) と呼ばれる HTML のタグっぽいものを組み合わせて構造化する • 仮想 DOM という仕組みを使ってレンダリングの効率化を図っている • freeeでは基本的にフロントエンドには React を採⽤しています React
  6.   24 • ブラウザが最初に読む JavaScript ファイル • 必要な module の読み込みや

    div#root に対して component を描画する処理が書かれている src/index.js
  7.   28 • まず public/index.html が読まれる • 次に src/index.js と

    src/styles.css が読まれる ◦ ⾃動的に src/index.js を読む命令が HTML に挿⼊されている (⼀旦意識しなくてよい) • 実際のプログラムである src/index.js の処理を追ってみる ブラウザはどうやって表⽰している?
  8.   29 src/index.js の処理を追ってみる 外部 module (ライブラリ) の import import

    ライブラリや別のファイルに書かれて いる module を読み込むための宣⾔
  9.   31 src/index.js の処理を追ってみる div#root に対して component を描画するための root を作成する

    document.getElementById() タグに書かれている id 属性を元に element を取得する関数
  10.   32 src/index.js の処理を追ってみる root に対して実際に <App> component を描画する StrictMode

    開発環境専⽤のバグを発⾒しやすく するための挙動や⾮推奨なコードを 警告してくれるようになる
  11.   33 • Square() 関数が宣⾔されている ◦ これ⾃体が React のコンポーネントになる (関数コンポーネント,

    functional component) ◦ コンポーネントは関数で書く⽅法の他に class で書く⽅法がある (クラスコンポーネント) • JSX は HTML タグのような書き⽅をするが HTML ではなく JavaScript src/App.js <button> という JSX 要素を 1 つ返している export 他のファイルからその module (今回はコ ンポーネント) を扱えるようにする宣⾔
  12.   40 • コンポーネントは単⼀の JSX 要素を返す必要があります • 別の複数の JSX 要素を返したい場合は別の

    JSX 要素で囲む必要があります エラー 複数の JSX 要素を返してしまっている
  13.   41 • 複数の JSX 要素を別の JSX 要素で囲むときにフラグメントという特殊な要素を使います React.Fragment <>

    と </> で囲んだことにより 複数の JSX 要素が⼊れ⼦になった 1 つの JSX を返すようになった
  14.   43 • 3 × 3 の盤⾯を作るにはボタンを 3 つごと 3

    段になるようにする必要がある ◦ <button> を 3 つごと <div> で囲ってあげることで表現する ボタンを 3 つごと段組みする これで 1 段
  15.   45 • 実は <div> や <button> には className という属性

    (HTML で⾔う class 属性) ついている ◦ これらは src/styles.css にスタイルが記述されている • JSX では属性のことを Props と呼ぶ スタイルシートを覗く
  16.   49 • もともとは 1 つのマス (Square) の意味を持つコンポーネントだった ◦ 今は盤⾯すべて

    (Board) の意味を持つコンポーネントに役割が変わった コンポーネントの名前を変える
  17.   55 • Props と呼ばれる属性を外 (Board コンポーネント) から受け取れるようにする Props を受け取る

    value という props を受け取れるようにする 受け取った props を使うようにする
  18.   57 • JSX の中で JavaScript の記法を使うためには波括弧「{}」で囲む必要がある ◦ 今回は value

    という変数を JSX 内で使えるように波括弧「{}」で囲む Props を受け取る value を波括弧「{}」で囲った
  19.   71 マスを押したら「×」を表⽰する • useState() を使ってコンポーネント内に状態 (state) を扱えるようにする ◦ useState()

    は「初期値」を引数に、返り値として「状態」と「状態を更新するための関数」を配列で返す useState を import する useState() を使って状態を定義 クリックされたときに状態を「X」に変える props を削除
  20.   74 現在の状況 • Board コンポーネントが Square コンポーネントを 3 ×

    3 で描画している • マス (Square コンポーネント) を押したら「×」が表⽰される ◦ Square コンポーネントは状態を持っているが、Board コンポーネントは状態を持っていない ◦ 要するに盤⾯全体の状態を取得することができないため勝者を判定することができない ゲームとして成⽴させるには • Board コンポーネントがすべてのマスの状態を持ち、盤⾯全体の状態を取得できるようにする ◦ ゲームの勝者を判定することが容易になる • Square コンポーネントは親である Board コンポーネントから状態をもらって表⽰するだけでよい 状況の整理
  21.   75 Board に状態を持たせる (state のリフトアップ) • ⼦コンポーネントである Square コンポーネントから親である

    Board コンポーネントに状態を移動する ◦ これを React チュートリアルでは「state のリフトアップ」と呼んでいる 盤⾯上の 9 つのマスの状態を定義 それぞれのマスの状態を prop として渡してあげる
  22.   76 Square から状態を取り除く • Square コンポーネントでは状態を持つ必要がなくなったので削除して props として受け取る •

    同様にクリックされたときの処理も Board コンポーネントから渡すので削除して props として受け取る
  23.   77 マスが押されたときの処理の実装 • 左上から数えて i 番⽬ (0 始まり) のマスがクリックされたときに

    squares[i] に「X」を代⼊して状態を更新する マスがクリック されたときの処理 handleClick(i) を Square に渡す
  24.   78 handleClick(i) • 元の squares を破壊しないように slice() で配列をコピーしたうえで状態の更新を⾏う ◦

    immutability (不変性) という考え⽅で処理が書かれている 状態をコピーする 配列の i 番⽬に「X」を代⼊する 状態を state に更新する
  25.   81 Board コンポーネントを⾒直す • onClick には関数を渡す必要があるため「() =>」を前につけて関数として prop を渡してあげる

    アロー関数 JavaScript では function キーワー ドを使った関数宣⾔の他に「=>」を 使った関数の宣⾔⽅法がある アロー関数を使って関数として渡してあげる
  26.   87 バグを修正する • squares[i] に◯か×が⼊っている場合 (要するに null ではない場合) は

    handleClick(i) の処理を中断する ◦ 関数の処理を早い段階で切り上げる早期リターンと呼ばれる⼿法を使う すでに squares[i] に値が⼊ってる場合は return する
  27.   90 ◯と×ゲームの勝者とは • たて‧よこ‧ななめのどれかがすべて⾃分のマークになっていたら勝ちとなる 0 1 2 3 4

    5 6 7 8 たて • 0, 3, 6 • 1, 4, 7 • 2, 5, 8 よこ • 0, 1, 2 • 3, 4, 5 • 6, 7, 8 ななめ • 0, 4, 8 • 2, 4, 6 squares の中⾝を それぞれの勝利パターンで調べて、 すべての要素が◯か×の どちらかだったら、 そのプレイヤーの勝利と判定する
  28.   97 React Tutorial を最後まで完了する • タイムトラベルの追加 より快適な開発環境へ • ローカル開発環境を構築する

    • TypeScript を導⼊する ⾒た⽬にこだわる • CSS などによる装飾を加える React Deepdive • React Hooks とは • React と jQuery の違い After work 今後は何を学ぶといい?など ⼩さな悩みでも ぜひ相談してください!
  29.   98 今後も⼀緒に学習しませんか? 「freee Tech community for Students」を開設します!!!! • どんなコミュニティ?

    ◦ 学⽣が安⼼してweb開発、プログラミングを学習できるコミュニティです。 ◦ (ベータ版ですので、どんなコミュニティにするか?⼀緒に考えてくれる⽅も 募集中!) • 何ができるの?? ◦ freeeのエンジニアや学⽣同⼠で学びの共有や困りごとの相談ができます ◦ ⼀緒に学習できる仲間も⾒つけていただけます ◦ 不定期でコミュニティ限定のイベントも開催予定です • どこでやるの?? ◦ slackです! • どうやって参加するの? ◦ QRコードからお申し込みください!