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
iOS エンジニアが考える Webアプリ開発
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Muukii
April 25, 2018
Programming
530
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
iOS エンジニアが考える Webアプリ開発
Muukii
April 25, 2018
More Decks by Muukii
See All by Muukii
Problem Solving from the Abstraction Layer
muukii0803
1
67
Pairs iOSとトレンドの技術
muukii0803
0
1k
Thoughts about build flow
muukii0803
2
360
スマホアプリ開発で大切なこと
muukii0803
3
190
エンジニアとして働くために
muukii0803
0
210
Q. Textureは部分的に導入できますか?
muukii0803
3
2.6k
安定したチャットを実現するための アプリとAPI設計
muukii0803
17
8.5k
快適なUIを持つアプリを作るために できること
muukii0803
12
2.8k
AutoLayout以外の選択肢
muukii0803
13
5.4k
Other Decks in Programming
See All in Programming
AIで効率化できた業務・日常
ochtum
0
140
AI 輔助遺留系統現代化的經驗分享
jame2408
1
220
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
140
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
6
1.3k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.3k
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
Agentic UI
manfredsteyer
PRO
0
170
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
180
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
240
OSもどきOS
arkw
0
570
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
Featured
See All Featured
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
320
Paper Plane
katiecoart
PRO
1
51k
Exploring anti-patterns in Rails
aemeredith
3
410
GitHub's CSS Performance
jonrohan
1033
470k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How to build a perfect <img>
jonoalderson
1
5.7k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Designing for Timeless Needs
cassininazir
1
260
First, design no harm
axbom
PRO
2
1.2k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Transcript
iOS ΤϯδχΞ͕ߟ͑Δ WebΞϓϦ։ൃ muukii
About Me ‣ muukii <Hiroshi Kimura> ‣ iOS Engineer at
eureka, Inc. ‣ Pairs Global Team ‣ GitHub : @muukii ‣ https://muukii.me ☕ ⌚
None
1BJSTʹ͍ͭͯ !4
4PVUI,PSFB Japan Taiwan No.1 2017 release No.1 !5 1BJSTʹ͍ͭͯ ల։ࠃ
̐ͭͷϓϥοτϑΥʔϜ CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy
None
Agenda › ࠷ۙͪΐͬͱͨ͠WebΞϓϦΛ࡞ΔҊ͕͖݅ͬͯ·ͨ͠ › ͔ͤͬ͘ͳͷͰେنͳΞϓϦΛ࡞ΔέʔεΛఆͯͬͯ͠Έ͍ͨ › ΄ͱΜͲ͕ࣝͳ͍ঢ়ଶͳͷͰɺ৭ʑௐͨ͜ͱ › iOSΞϓϦͷUIΛ࡞Γଓ͚͖ͯͨܦݧΛݩʹɺ࠷ۙΠϯϓοτͯ͠ ͍ΔWebΞϓϦ։ൃͷࣝͰɺେنͳΞϓϦΛ࡞ΔͳΒʮ͜Μͳ
ײ͡ʹ࡞͍͖͍ͬͯͨͳʔʯͱࢥ͏·ͱΊɻ
ݱঢ়ͷ › Gatsby + Netlify Ͱ੩తαΠτΛ࡞͍ͬͯΔ › React › styled-components
ͳͲ › TypeScript › VSCode
WebΞϓϦ։ൃΛ࢝ΊΔલͷঢ়ଶ › ࠓ·ͰͣͬͱSwiftΛॻ͍͖ͯͨ › Webͷۀܦݧͳ͠
WebΞϓϦ։ൃΛ࢝ΊΔલͷঢ়ଶ › ࣝͱͯͦ͠ΕͳΓʹΩϟονΞοϓ͍ͯͨ͠ › Ϗϧυπʔϧͷಈͱ͔ › ΞʔΩςΫνϟͱ͔ › ωΠςΟϒΞϓϦ։ൃWebΞϓϦͷςΫϊϩδʔʹΠϯεύ ΠΞ͞ΕΔ͜ͱ͕ଟ͍ͨΊ
WebΞϓϦ։ൃΛ࢝ΊΔલͷঢ়ଶ › JS͋·Γৄ͘͠ͳ͍ › SwiftͰfunctional-programmingͷงғؾʹ৮Ε͍ͯͨ͜ͱͰॿ ͔Δ෦ଟ͔ͬͨ
WebΞϓϦ։ൃΛ࢝ΊΔલͷঢ়ଶ › CSSཧղ͍ͯ͠ΔͭΓʹͳ͍ͬͯΔ › ʮiOSΞϓϦ։ൃͰFlexboxϨΠΞτ৮͍ͬͯΔ͠େৎͰ͠ΐ ͏ʯ
࠷ॳʹ໎ͬͨ͜ͱ › ViewϨΠϠʔͷϑϨʔϜϫʔΫͲ͏͢Δ? › Vue? React? › AngularҰ୴͓͍͓ͯ͘ɻ
࠷ॳʹ໎ͬͨ͜ͱ › ViewपลͷΞʔΩςΫνϟ? › PairsͷGlobal൛iOSΞϓϦͰFluxʹ͍ۙ͜ͱ͍ͬͯΔ › ʮ։ൃ͍ͯ͠Δ͏ͪʹFlux, Reduxͱ͔Λߟ͑࢝ΊΔͩΖ͏ ͳʔʯͱߟ͑Δͷޙճ͠ʹ
࠷ॳʹ໎ͬͨ͜ͱ › Ͱ͖ΕJSͰʮ੩తܕ͚ʯཉ͍͚͠Ͳ › TypeScript? › Flow?
ࣗͳΓͷཧղͷਐΊํ › iOSΞϓϦ։ൃͷࣝʹͯΊͯࣗͳΓʹೲಘ͍ͯ͘͠ελΠϧ
› JSͷڍಈͷཧղ › runkit.com͕Α͔ͬͨ › ૉΒ͍͠Playground ✨ › JSͷΦϒδΣΫτͷಈ͖Λ࣮ࡍʹίʔυΛಈ͔࣮ͯ͠ݧ͍ͯ͘͠ ›
ʮObjective-CSwiftͰ͍͏ɺ͜͏͍͏ಈ͖ํʯΈ͍ͨͳΠϯϓοτ ࣗͳΓͷཧղͷਐΊํ
› Ϗϧυπʔϧͷ͍ͬͯΔ͜ͱ͕ຐ๏ʹݟ͑Δ › ͍ΖΜͳϏϧυπʔϧ͋Δ͠ɺ͍ΖΜͳ͜ͱ͕࣮ߦ͞Ε͗ͯ͢ཧղͰ͖Δؾ͕͠ͳ͍... › ͦͦ͜Μͳෳࡶͳ͜ͱ͠ͳ͍ͱWebΞϓϦͬͯ࡞Εͳ͍ͷʁͭΒ͍ͳɻͱࢥͬͨ ͜ͱɻ › ͔͠͠ɺiOSΞϓϦͰϏϧυπʔϧෳଘࡏ͢Δ͠ɺϏϧυͷෳࡶ͍ ›
Xcode͕Θ͔Γ͘͢ݟ͍ͤͯΔ͚ͩ › ͦΕͳΒWebͰવى͖ΔࣄͳΜͩɻͱཧղ ࣗͳΓͷཧղͷਐΊํ
› developϏϧυͩͱେৎ͚ͩͲreleaseϏϧυͩͱڍಈ͕ҧ͏ › SwiftͰ࠷దԽίϯύΠϧͰى͜ΓಘΔ ࣗͳΓͷཧղͷਐΊํ
› τϨϯυͷҠΓมΘΓ͕ૣ͗͢Δ!? › ·͊ɺୀ۶͠ͳͯ͘ྑ͍͔ʂ › ΑΓྑ͍Ξϓϩʔν͕ϘϯϘϯొ͢Δڥຊʹ͍͢͜͝ͱͩͱ ࢥ͏ › ΈΜͳͷΞΠσΞ͕٧Ίࠐ·Εຏ͔Ε͍ͯ͘εϐʔυ͕͍͢͝ɻ ›
ίϛϡχςΟͷڊେ͞ʹײಈ ࣗͳΓͷཧղͷਐΊํ
› HTMLͷΈํCSS FlexboxͷϨΠΞτ › iOSΞϓϦ։ൃͰYoga, Textureʹ৮Ε͍ͯͨͷͰɺͦͦ͜͜Πϝʔδ௨ΓʹϨΠ Ξτ͕Ίͨɻ › ͔͠͠ɺதͷElement͕͏·͍͜ͱΒΜͰ͘Εͳ͍ͱ͔ࠔΔ͜ͱ࣌ʑ ͋ͬͨɻ
› InstagramPinterestͷߏΛಡΉ͜ͱ͕Ͱ͖Δ͔Βࢀߟʹͳͬͨɻ › Webͷͱͯྑ͍ͱ͜ΖɻωΠςΟϒΞϓϦͰ͜Ε͍͠ ࣗͳΓͷཧղͷਐΊํ
Vue? React? › ࠷ॳVue.jsΛͬͨ › ͔͠͠ɺࣗʹͲͷΑ͏ʹಈ͍͍ͯΔͷ͔Α͘Θ͔Βͳ͔ͬͨ
ͱΓ͋͑ͣReactΛબ › ࠓͳΒVueཧղͰ͖Δ͔͠Εͳ͍
ͱΓ͋͑ͣReactΛબ › ίϯϙʔωϯτΫϥεͷఆ͕ٛࣗతʹಡΈ͔ͬͨ͢ɻ › ཧղ͕ਐΊ͔ͬͨ͢ɻComponentΫϥεiOSΞϓϦͷUIViewͩͱࢥ͏ͱָʹͳͬͨ › Componentʹશ͕ͯଘࡏ͢Δ › iOSͰΧελϜϏϡʔUIViewΫϥεͷαϒΫϥεΛ࡞Γɺͦ͜ʹϓϩύςΟ(ঢ়ଶ)ɾϨΠΞτɾελΠϧΛ ఆ͍ٛͯ͘͠
› React => DOM-tree iOS => UIView-tree ʹ૬͢Δ › iOSͱҟͳΔͷ͕ɺrender › renderͰฦ٫͢ΔJSXView࣮ମͰͳ͘DOM-NodeΛ࡞Γ্͛ΔͨΊͷઃܭॻɻ(͋ͬͯΔʁ ʣ › UIViewͰৗʹ࣮ମΛѻ͏ɻ DOMΛૢ࡞͢Δײ͡ʹ͍ۙͱࢥ͏
JavaScript? TypeScript? Flow? › ʮ੩తܕ͚ʯཉ͔ͬͨ͠ › ੩తܕ͚ݴޠͷಛɺʮؒҧͬͨίʔυΛίϯύΠϧ࣌ʹ։ ൃऀڭ͑Δ͜ͱ͕Ͱ͖ΔΈΛ։ൃऀ͕࡞Δ͜ͱ͕Ͱ͖Δʯ ͜ͱ ›
ίϯύΠϧΤϥʔʹͰ͖Δ
JavaScript? TypeScript? Flow? › FlowͬͯΈ͚ͨͲɺTypeScriptʹΓ·ͨ͠ɻ › VSCodeͷαϙʔτTypeScriptͷํ͕ڧྗͩͬͨͷ͕େ͖͍ › ·ͨɺαϙʔτ͞Ε͍ͯΔϥΠϒϥϦଟ͍ ›
࠷ॳؾʹͳΒͳ͔͚ͬͨͲɺͬͺΓ͋Δͱॿ͔Γ·͢ɻ › υΩϡϝϯτಡ·ͳͯ͘ɺఆٛϑΝΠϧΛݟΔ͚ͩͰͳΜͱͳ ͍͘ํ͕͔Δ (ϔομϑΝΠϧΛಡΉײ֮)
Scoped CSS (CSS in JS) › ݁ styled-componentsͱReactඪ४ͷinline-styleΛར༻
Scoped CSS (CSS in JS) › ࣗͷܦݧ্Ͱ͕͢ɺࣗࣾαʔϏεͷϓϩμΫτʹ͓͍ͯStyleΛ ʮΈΔʯ͜ͱݱ࣮తͰͳ͍ › ελΠϧͷྫ֎͕͍ͬͺ͍ଘࡏ͢Δ͠ɺͲΜͲΜվળߦΘΕͯ
͍͘ › ͦͷதͰ͏·͘ߏԽ͞ΕͨCSSΛ࡞Γ্͛Δͷ͍͠
Scoped CSS (CSS in JS) › ී௨ʹCSSΛΉͱେྔͷidclass͕ొ › मਖ਼࣌ʹӨڹൣғΛؾʹͯ͠ɺ৽͍͠id,classΛՃ͢Δѱ॥ʹɻ ›
ͦΕͳΒDRYΛڐ༰͠ScopedͳCSSΛॻ͍ͨํ͕ྑ͍ › ͱͯ͠ɺUIͷ࣮ʹ͓͍ͯDRYؾʹ͗ͯ͢͠ͳΒͳ͍ɻͲ͏ͤॻ ͖ΘΔ͔ΒDRYͷͨΊͷઃܭΛߟ͑Δ࣌ؒͷํ͕ແବʹͳΓ͔Ͷͳ͍ɻ › ·ͱΊΔ͖ͱ֬৴͕࣋ͯͨ࣌ʹίʔυΛ࠷దԽ͢Δ
σεΫτοϓ & ϞόΠϧରԠ › iOSͰ͍͏ͱ͜ΖͷɺiPhone ͱ iPadͷUniversalͳରԠ › ࣗʹͱͬͯCSSͰDesktop ->
Mobile·ͰͷϨΠΞτΛΈΔͷແཧ ήʔͩͱײͨ͡ › ࠓͷ݁ͱͯ͠ɺrenderͷ࣌ʹσΟεϓϨΠαΠζΛݟͯฦ٫͢ΔJSXΛ੍ޚ ͢Δख๏Λͱͬͨ › ଟ͜ΕΛΞμϓςΟϒϨΠΞτͱݺͿ…? › contra/react-responsive
import * as React from 'react' const MediaQuery = require('react-responsive').default
export namespace Lazy { export interface Props { children?: () => JSX.Element | string | number } const Query = (props: any) => { return ( <MediaQuery {...props}> {(isMatching: boolean) => { if (isMatching) { return props.children() } else { return null } }} </MediaQuery> ) } }
export namespace Lazy { export const Desktop = (props: Props)
=> { return <Query {...props} minWidth={769} /> } export const TabletMobile = (props: Props) => { return <Query {...props} maxWidth={769} /> } }
import * as Layout from 'src/layout' export default class Top
extends React.Component<Props, {}> { render() { return ( <> <Layout.Lazy.Desktop> {() => <……/>} </Layout.Lazy.Desktop> <Layout.Lazy.TabletMobile> {() => <……/>} </Layout.Lazy.TabletMobile> </> ) } } αΠζ͝ͱͷJSXఆٛΛClosureʹแΜͰ͓͖ɺϚο νͨ͠λΠϛϯάͰ࣮ߦͯ͠JSXΛฦ٫ (Ԇॲཧ) Desktop࣌ͷJSX Tablet & Mobile࣌ͷJSX
ωΠςΟϒΞϓϦͷݟ׆͔ͤΔ › CSSͷΈํ › ݴ͏͜ͱ͕ޮ͔ͳ͍ϨΠΞτ֊Λ૿͢ͳͲͷͰ៉ྷ ʹ࣮ݱͰ͖Δ › HTMLͰ͍͏จॻߏཚΕΔ͚Ͳɺํͷͳ͍͜ͱͳͷ Ͱʁͱɺͻͱ·ͣఘΊͨ
ωΠςΟϒΞϓϦͷݟ׆͔ͤΔ › ύϑΥʔϚϯεͷߟྀ › ϦετͰແݶʹεΫϩʔϧ͍ͯ͘͠UIͷ߹ɺPinterestͷΑ͏ʹDOMͷNode૿ͣ͞ දࣔΛߦ͏͖ › NodeΛ૿͞ͳ͍͜ͱͰϝϞϦͷফඅྔ͕͑ΒΕΔ › ࣮࣭ɺऔಘͨ͠σʔλྔͷΈ
› ϢʔβʔύϑΥʔϚϯεΛΩʔϓͨ͠··ͣͬͱӾཡͰ͖Δ › ͜ͷΑ͏ͳ࣮ωΠςΟϒΞϓϦʹඪ४ίϯϙʔωϯτͱͯ͠ఏڙ͞Ε͍ͯΔ
None
WebΞϓϦ։ൃ໘ന͍ › WebΞϓϦ͔ΒiOSΞϓϦ։ൃʹ׆͔ͤΔ͜ͱͨ͘͞Μ͋Δͱײͨ͡ɻ › ReactͷStatelessͳComponentͳͲ (HOC) › ͦͯͦ͠ͷٯͨ͘͞Μ͋Γͦ͏ʂ › ͬͱWebΤϯδχΞͱωΠςΟϒΤϯδχΞͰใަΛ͍ͯ͘͠
͜ͱͰɺࠓ·Ͱʹͳ͍৽͍͠Ξϓϩʔν͕ݟ͚ͭΒΕΔͷͰʁͱࢥͬ ͨ
Thank you