Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2021新春Reactが怖くなくなる話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
asazu taiga
January 04, 2021
Programming
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2021新春Reactが怖くなくなる話
社内勉強会用
asazu taiga
January 04, 2021
More Decks by asazu taiga
See All by asazu taiga
Jotaiで作ったフォームをApollo_Clientで投げたらいい感じだった件.pdf
asazutaiga
1
1k
副業やってみた
asazutaiga
0
380
Hydrationから知るAstro, Qwik
asazutaiga
0
760
(LT)ApolloClientとGraphQL Code Generatorの話
asazutaiga
0
120
Other Decks in Programming
See All in Programming
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
3.8k
New "Type" system on PicoRuby
pocke
1
720
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
370
OSもどきOS
arkw
0
470
JavaDoc 再入門
nagise
0
300
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
460
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
120
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
460
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
150
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
680
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
41
2.6k
Building an army of robots
kneath
306
46k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
The Pragmatic Product Professional
lauravandoore
37
7.3k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
320
Amusing Abliteration
ianozsvald
1
200
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
360
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Transcript
2021年新春 Reactが怖くなくなる話 1 1
⽬標:Reactが怖くなくなくなる 社内での再利⽤性を考慮して初⼼者向けに寄せた資料です。 すでに実務でReactを使われている⽅には物⾜りないかもしれませんが、 なるべく2020年末の最新状況に合わせた記述を意識しましたので、 情報収集の⼊り⼝にしていただければ幸いです。 2 2
アジェンダ 3 3
導⼊ 「Reactってこんなもの」のイメージを共有します。 Reactってどんなイメージですか? 2020年末のReactエコシステム 4 4
やってみよう create-react-appでテンプレートを⽣成して観察してみましょう。 Start with create-react-app ★Hands On 各ディレクトリの役割 コンポーネント志向 5
5
コンポーネントとReact hooks 実装する際にまず知っておく必要がある要素について紹介します。 関数コンポーネントとクラスコンポーネント 基本のフック - useState(), useEffect(), useContext() ★Hands On
6 6
React開発における「React以外」の話 実際にWebアプリケーションを作る際に必要になる 「React以外のもの」の紹介です。 スタイリング - CSS in JS vs CSS
Module 7 7
おまけ:成果物紹介 Next.js x firebaseでつくる俳句管理アプリ「季語別俳句帖」※未完成 8 8
Reactってどんなイメージですか? 9 9
1 0 1 0
アサヅは最初こんな印象を持ちました SPAを作れるやつ なんか難しそう フロントエンドのつらみをいろいろ解消してくれる? 部品単位で開発できて効率よさそう AndroidのViewとかに相当するものを作っていくイメージかな? 1 1 1 1
遠からず 1 2 1 2
例えばこんな「部品」 const MyComponent = () => ( <p>Hello, World!</p> )
export default MyComponent 1 3 1 3
JSの中にHTML…? 不気味 これと何が違うんだろう… function createMyComponent() { return '<p>Hello, World!</p>' }
Reactの怖さ(Vanilla JSとの⼤きな違い)= JSX 1 4 1 4
JSX ≠ HTML ⽂字列ではありません HTMLそのものでもありません JSXはJSにコンパイルされます 1 5 1 5
ex. Babelによるコンパイル結果 const MyComponent = () => ( <p>Hello, World!</p>
) ↓ import {jsx as _jsx} from 'react/jsx-runtime'; const MyComponent = () => ( _jsx('p', { children: 'Hello World!' }) ) ※React 17〜 FYI: https://ja.reactjs.org/blog/2020/09/22/introducing-the-new- jsx-transform.html ※16以前は React.createElement() が呼ばれてました 1 6 1 6
なんだ、ただのJavaScriptじゃん。 怖くないですね 1 7 1 7
ちなみに JSXそのものは、Reactとは全く別の仕様として存在しています。 FYI: https://facebook.github.io/jsx/ 専⽤のbable plugin等を利⽤すれば Vue.js等でもJSXを利⽤することができます。 1 8 1
8
で、こいつはどうやったら表⽰できるのよ こいつ↓ const MyComponent = () => ( <p>Hello, World!</p>
) 1 9 1 9
ReactDOM.render() の引数に渡す <html> <body> <div id="hello-world"></div> </body> </html> import ReactDOM
from 'react-dom' import MyComponent from './components/MyComponent' const element = <MyComponent></MyComponent> ReactDOM.render(element, document.getElementById('hello-world')) ※ react-dom は react コアとは切り離されたパッケージとして提供されている →React Native等への応⽤が可能となっている 2 0 2 0
実⾏結果 <html> <body> <div id="hello-world"> <p>Hello, world!</p> </div> </body> </html>
※だいぶ省略しています 2 1 2 1
Reactには他にもこんな特徴があります 宣⾔的UI 「あるべき姿」を宣⾔し表現する(対:命令的) 仮想DOM DOM構成をJSのオブジェクトで表現し、 仮想DOMツリーの変更差分をレンダリングする 関数型プログラミングとの親和性 UI=f(state) という考え⽅ 詳しくはggってください、、、
2 2 2 2
2020年末のReactエコシステム 2 3 2 3
2 4 2 4
いっぱいあってよくわからない というか書ききれていないです まだある 無限にある 2 5 2 5
2 6 2 6
Start with create-react-app ※せっかくなのでTypeScriptも触りましょう Android経験者なら強⼒な型補完に良さを感じると思います $ npm i -g create-react-app
$ create-react-app sample-app --template typescript 2 7 2 7
各ディレクトリの役割 実際にモノを⾒ながら説明します 2 8 2 8
「コンポーネント志向」という考え⽅ 2 9 2 9
コンポーネントとは 「部品」、「構成要素」 構造、⾒た⽬、振る舞いを1つのセットとして捉える → HTML, CSS, JavaScript 3 0 3
0
(フロントエンドにおける) コンポーネント志向とは コンポーネントをいっぱいつくって ページを構築しよう!という考え⽅ 3 1 3 1
コンポーネント志向のメリット(私⾒) 1コンポーネント1ファイルなので読みやすい テストしやすい 変更に強い 再利⽤性が⾼い ローカルな状態管理がしやすい OOPの基本知識が設計に活かしやすい 3 2 3
2
コンポーネント志向の課題(私⾒) コンポーネント内でのUIとロジックの密結合 →ロジックの使いまわしが難しい 多くのコンポーネント志向ライブラリはView層にしか関⼼を持たず、 「それ以外」は実装者にゆだねられがち ・ ビジネスロジックをどう実装するか ・ コンポーネント間の状態管理をどうするか → 多くのコンポーネント志向SPAライブラリは、 これらの課題を個別に解消するエコシステムを持っている
3 3 3 3
3 4 3 4
コンポーネントとReact hooks 3 5 3 5
コンポーネント クラスコンポーネント class Welcome extends React.Component { render() { return
<h1>Hello, {this.props.name}</h1>; } } 関数コンポーネント const Welcome: React.VFC<Props> = (props) => { return <h1>Hello, {props.name}</h1>; } ※ React.VFC = VoidFunctionalComponent (関数コンポーネントの型の⼀種 @types/react 18^ ) 3 6 3 6
2020年末、どちらを選択するか? 記述的にシンプルな関数コンポーネントが第⼀候補 クラスコンポーネントの優位性であった state 、 Lifecycle はhooksの登場で関数コンポーネントでもほぼ実現可能に 基本的に関数コンポーネントでよさそう 3 7
3 7
関数コンポーネントの表現⼒を ⾼めてくれた「hooks」とは? 3 8 3 8
hooks導⼊の経緯 https://ja.reactjs.org/docs/hooks-intro.html#motivation 典型的な React アプリを React DevTools で⾒てみると、おそらくプロバイダや らコンシューマやら⾼階コンポーネントやらレンダープロップやら、その他諸々の抽象 化が多層に積み重なった『ラッパー地獄』を⾒ることになるでしょう。
フックを使えば、ステートを持ったロジックをコンポーネントから抽出して、単独でテス トしたり、また再利⽤したりすることができます。フックを使えば、ステートを持ったロ ジックを、コンポーネントの階層構造を変えることなしに再利⽤できるのです。 3 9 3 9
ルール 呼び出しは関数コンポーネントのトップレベル or カスタムhooksのトップレベルのみ カスタムhooksを⾃作する場合、命名規則 useXXX 遵守 4 0 4
0
useState const [state, setState] = useState(initialState) ステートフルな値とそれを更新するための関数を返却する 4 1 4
1
ボタンを押してカウントアップするコンポーネント import { useState, useEffect } from 'react' const Counter:React.VFC
= () => { const [count, setCount] = useState(0) return ( <> <div>{count}回クリックされました︕</div> <button onClick={() => setNumber(count + 1)}>ボタン</button> </> ) } ボタンを押される →stateが更新される →stateの変更にもとづいて再レンダリングされる 4 2 4 2
※ <></> = <React.Fragment> 「レンダリングされない括る専⽤要素」と思っておけばひとまずOK 4 3 4 3
useEffect useEffect(functionWhenUpdated) 副作⽤(再レンダリング等)を契機に実⾏する処理 第⼆引数を⽤いて実⾏タイミングを制御可能(説明略) 4 4 4 4
ボタンを押してカウントアップするコンポーネント② import { useState, useEffect } from 'react' const Counter():React.VFC
= () => { const [count, setCount] = useState(0) useEffect(() => { document.title = `${count}回クリックされたページ`; }) return ( <> <div>{count}回クリックされました︕</div> <button onClick={() => setCount(count + 1)}>ボタン</button> </> ) } 再レンダリング(副作⽤)を契機に、ページのタイトルが変更される 4 5 4 5
※ 副作⽤がある関数 ≒ 純粋でない関数 ≒ 同じ引数を渡しても同じ結果が返ってくるとは限らない関数 レンダリングが発⽣した = 結果が前回と異なる =
副作⽤が⽣じている → 副作⽤フックが実⾏される 4 6 4 6
useContext const contextValue = useContext(contextKey) Context API(後述)から値を取得 4 7 4
7
Contextの値をもとに表⽰⾊を設定するボタン import {useContext} from 'react' import ThemeContext from '../contexts/theme-context' //
context定義ファイル const ThemedButton():React.VFC = () => { const theme = useContext(ThemeContext) return ( <button style={{ background: theme.background, color: theme.foreground }}> テーマカラーで配⾊されたボタンです︕ </button> ) } 4 8 4 8
ContextAPIによる Theme の提供 React.createContext() Context.Providerコンポーネント const themes = { light:
{ foreground: "#000000", background: "#eeeeee" }, dark: { foreground: "#ffffff", background: "#222222" } } const ThemeContext = React.createContext(themes.light) // 初期値 export default ThemeContext 4 9 4 9
import ThemeContext from './contexts/ThemeContext' import ThemeButton from './components/ThemeButton' const App:
React.VFC = () => { return ( <ThemeContext.Provider value={themes.dark}> <ThemeButton /> </ThemeContext.Provider> ) } <ThemeContext.Provider> の⼦孫要素として表現されたコンポーネントは、 value に設定された値をContext APIを通じて参照できる value の値が変更されると再レンダリングされる 5 0 5 0
きみだけのhooksを作ろうのコーナー 例えば、boolean値をtoggleさせることができる useBool import {useState} from 'react' const useBool =
() => { const [bool, setBool] = useState(false) const toggleBool = setBoolean(!bool) return [bool, toggleBool] } export default useBool ちょっとだけ使い勝⼿がよくなる・安全になる薄いhooksも全然OKだと思います 5 1 5 1
React開発におけるReact以外の話 ※状態管理の話も⼊れたかったんですが、今回は未完です。。すみません 5 2 5 2
スタイリング 2020年末現在、有⼒な選択肢は⼤きく分けて2つ CSS in JS CSS Modules どちらも「モノリシックなCSSからコンポーネントごとのCSSへ」の動き 5 3
5 3
CSS in JS 代表的なライブラリ: styled-components import {styled} from 'styled-components' type
Props = { text: string } const Component: React.VFC<Props> = (props) => { return <button>{props.string}</button> } const StyledButton = styled(Component)` > button { background-color: black; } ` export default StyledButton 5 4 5 4
CSS Module button.module.css .button { background-color: black; } import Styles
from './button.module.css' type Props = { text: string } const Component: React.VFC<Props> = (props) => { return <button className={Styles.button}>{props.string}</button> } export default Component 5 5 5 5
両者の⽐較(どちらも有⼒。。) CSS in JS JSの変数が使えるので状態に応じた表現⼒が⾼い ロジックと層を分ければ保守性アップが⾒込める CSS Modules JSとCSSファイルを分けることができるので分業しやすい(かも) クラス名にスタイリングを⼀任できるので⾒通しが良い
5 6 5 6
スタイリングの基本指針 コンポーネント単位でスタイリングしよう ロジックと切り離そう コンポーネントは外部からのレイアウトを(なるべく)意識しない スタイリングにするよう⼼がけよう (使われる側が使う側を知るのは良くない、関⼼の分離) ⾊定義などグローバルに使いまわせる定数は別ファイルに切り分けよう 5 7 5
7
まとめ Reactの怖さはJSXに拠るところが⼤きいけど、 仕組みを理解するとただのJSだと分かります。コワクナイヨ Reactはエコシステムが肥⼤化しているので把握が難しいけど、 それって実は「React以外」をどうにかするための試⾏錯誤でしかない。コワクナイヨ React基礎知識をある程度⾝に付けた後は、 結局、設計パターンをどうするかが問題になると思います。 ⼀般的な開発と⼤差ありませんし、OOPわかれば普通に戦えます。 5 8
5 8
おまけ:成果物紹介 https://kigo-betsu-haiku-cho.vercel.app/ https://zenn.dev/asazutaiga/articles/2046b0fbb1e934 5 9 5 9