Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
iOS エンジニアが考える Webアプリ開発
Search
Muukii
April 25, 2018
Programming
540
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
82
Pairs iOSとトレンドの技術
muukii0803
0
1.1k
Thoughts about build flow
muukii0803
2
370
スマホアプリ開発で大切なこと
muukii0803
3
200
エンジニアとして働くために
muukii0803
0
230
Q. Textureは部分的に導入できますか?
muukii0803
3
2.6k
安定したチャットを実現するための アプリとAPI設計
muukii0803
17
8.7k
快適なUIを持つアプリを作るために できること
muukii0803
12
2.8k
AutoLayout以外の選択肢
muukii0803
13
5.5k
Other Decks in Programming
See All in Programming
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
1.6k
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3k
No More NoSuchMethodError
exoego
1
120
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
290
sbt 2.0: takeoff
eed3si9n
0
170
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
200
phperだってパンチカードでコーディングしたい
o0h
PRO
0
480
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
160
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
12
10k
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
160
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
Crafting Experiences
bethany
1
390
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Done Done
chrislema
187
17k
The Cost Of JavaScript in 2023
addyosmani
55
10k
The SEO identity crisis: Don't let AI make you average
varn
0
610
Faster Mobile Websites
deanohume
310
32k
Designing for Timeless Needs
cassininazir
1
530
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
280
What's in a price? How to price your products and services
michaelherold
247
13k
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