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
75
Pairs iOSとトレンドの技術
muukii0803
0
1k
Thoughts about build flow
muukii0803
2
360
スマホアプリ開発で大切なこと
muukii0803
3
200
エンジニアとして働くために
muukii0803
0
220
Q. Textureは部分的に導入できますか?
muukii0803
3
2.6k
安定したチャットを実現するための アプリとAPI設計
muukii0803
17
8.6k
快適なUIを持つアプリを作るために できること
muukii0803
12
2.8k
AutoLayout以外の選択肢
muukii0803
13
5.5k
Other Decks in Programming
See All in Programming
What We Talk About When We Talk About XP
m_seki
2
530
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
610
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
56
38k
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
130
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
180
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
150
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
120
Webの地図
yosuke_furukawa
PRO
6
4.2k
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.2k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Prompt Engineering for Job Search
mfonobong
0
450
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
480
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Git: the NoSQL Database
bkeepers
PRO
432
67k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
530
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
330
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
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