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
Datapiaのフロントエンドについて
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
danny
November 12, 2020
Programming
530
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Datapiaのフロントエンドについて
danny
November 12, 2020
More Decks by danny
See All by danny
新規サービスの技術選定と設計
f96q
1
18k
Vue.jsとRailsで作るWebアプリケーション
f96q
0
840
開発環境でDocker使ってみた
f96q
1
2.4k
2013年を振り返って
f96q
0
770
Git勉強会@KRAY
f96q
1
2.1k
等強Ruby会議10に参加しての感想
f96q
2
960
Inside Tripclip
f96q
2
1.6k
Other Decks in Programming
See All in Programming
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
280
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
260
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.6k
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
200
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.2k
dRuby over BLE
makicamel
2
340
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
2
680
Agentic UI
manfredsteyer
PRO
0
160
Vite+ Unified Toolchain for the Web
naokihaba
0
310
New "Type" system on PicoRuby
pocke
1
950
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
140
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
590
Test your architecture with Archunit
thirion
1
2.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
How to make the Groovebox
asonas
2
2.2k
Mobile First: as difficult as doing things right
swwweet
225
10k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
65
55k
Designing for humans not robots
tammielis
254
26k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
860
Transcript
Datapiaのフロントエンドについて 2020.11.12 コネヒトマルシェオンライン 宮城 史明
今日話すこと 2 ここ2年ほど開発してるDatapiaというプロ ダクトのフロントエンドについての話をし ます Datapiaとは • 複数クラウド(DB、ストレージ)に対 して、クエリ操作、データ転送、ワー クフロー、権限管理などをノンプログ
ラミングで実行できるクラウド型 iPaaSです
Datapiaについて 3 • フロントエンドがReactでバックエン ドがRuby on Rails • ログインページでログインした後は Single
Page Application構成 • フロントエンドの規模感 ◦ およそ3万4千桁 (TypeScript, TSX) ◦ React Component数は373
構成 フロントエンド • TypeScript • React • Redux ◦ React
Redux ◦ TypeScript FSA Reducers • React Router • styled-components • Apollo Client バックエンド • Ruby on Rails (GraphQL API Server)
Railsでwebpackを使う Webpackerを使わない理由 • フロントエンドエンジニアじゃなくても扱えるように整備された状態で使えるのはメ リットたが、その反面細かい部分まで調整したい場合はいじりずらい ◦ webpackの設定ファイルと書き方が違う ◦ webpackのあの設定、Webpackerだとどう設定するのかを調べないと分からない webpack-assets-pipleline
• webpackで生成したファイルのハッシュ値付きのURLが入ったmanifest.jsonを生成で きる ◦ Railsでassets precompileする必要がなくなる ◦ Railsでもwebpackを使って開発できるようになる 参考 • https://infinum.com/the-capsized-eight/squeezing-webpack-into-backend-fram eworks 5
Babelの設定 6 "presets": [ [ "@babel/preset-env", { "targets": { "chrome":
"75", "firefox": "68", "edge": "18" }, "useBuiltIns": "usage", "corejs": 3 } ], "@babel/preset-react", "@babel/preset-typescript" ] useBuildIns usage • 対応ブラウザのバージョンを定義して おくと、その定義をみて自動で必要な polyfillのみを使ってビルドされる
ESLintで禁止してるもの import/no-default-export • 任意の名前でインポートできるので後から名前を変えたり、使われてる箇所をさがすときに大変な ため no-restricted-syntax • TSEnumDeclaration ◦ 後から入ったエンジニアがenumかUnion型どっち使うのか混乱しないように
• TSInterfaceDeclaration ◦ 後から入ったエンジニアがtypeとinterfaceどっち使うのか混乱しないように ◦ interfaceは既存の定義されてる名前のまま拡張できるので公開するライブラリで使う方針 • ForInStatement, ForOfStatement, VariableDeclaration[kind='let'] ◦ 副作用が起きない書き方によせるため • LabeledStatement ◦ go to使われるとコード読みづらくなるため • WithStatement ◦ withで省略されると出どころが追いづらくなってコードが読みづらくなるため 参考 • https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base /rules/style.js#L339-L357 7
例外通知 8 componentDidCatch(error: Error, errorInfo: ErrorInfo): void { Sentry.withScope((scope) =>
{ scope.setExtras(errorInfo as any) Sentry.captureException(error) }) this.setState({ hasError: true }) } React Error Boundaryで補足した例外 をSentryに送る • Redux Storeの中身をsentryに送信 するような実装はしない ◦ 送ったほうがデバックはしやすくな るが、Redux Storeはバックエンド のAPIからユーザーの情報が入って いて、内容によっては外部のサービ スに送ってはまずいものが含まれて ることがあるため
React Hooksの使い方 9 const history = useHistory() const { id
} = useParams<{ id: string }>() const { currentOrganization, currentUser, user } = useSelector((state: RootState) => ({ currentOrganization: state.organization.currentOrganization, currentUser: state.user.currentUser, user: state.user.user, })) const dispatch = useDispatch() useEffect(() => { dispatch(actions.user.fetchUser({ id })) }, [id]) APIで取得した値をRedux Storeから取り出 して表示する • useHistory • useParams • useSelector • useDispatch
多言語化 10 <FormattedMessage id="models.organization.logo" /> 最初から多言語化することを前提で作って おく • 後から多言語化しようとすると、ほぼ すべての画面に影響が出るため手間が
大きい React Intl • ECMA Script標準の国際化APIのIntlを React Componentで扱える
アイコン、ロゴ画像 全てSVGで作成 • 同じ画像で@2xのような複数の画像サ イズの画像を用意する必要がなくなる • webpackでビルドした時のbundleサイ ズの軽量化 SVGR •
https://github.com/gregberge/svgr • SVGをReact Componentに変換
バックエンドとの通信 12 function errorLink(): ApolloLink { return onError((response: any) =>
{ if (response.networkError && response.networkError.statusCode === 401) { location.href = '/users/sign_in' } }) } Apollo Client • GraphQLクライアント SPA特有の問題 • ログインセッションが切れた状態で画 面を操作するとなにも反応がなくなっ てしまう ◦ ApploLinkでonErrorをハンドリングし てログインページにローケーション