Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Vanilla JavaScript はマルチプラットフォームの夢を見るか
Search
Mitsuharu Emoto
May 17, 2024
Programming
0
220
Vanilla JavaScript はマルチプラットフォームの夢を見るか
YUMEMI.grow Mobile #13
https://yumemi.connpass.com/event/317381/
Mitsuharu Emoto
May 17, 2024
Tweet
Share
More Decks by Mitsuharu Emoto
See All by Mitsuharu Emoto
macOS なしで iOS アプリを開発する(※ただし xxx に限る)
mitsuharu
1
150
メーカー製 SDK は不要!標準フレームワークだけで作るサーマルプリンターの印刷アプリ
mitsuharu
0
16
Bluetooth 制御で業務用サーマルプリンター対応アプリを作ろう
mitsuharu
0
34
iOS デバイスから始める Bluetooth 制御の業務用サーマルプリンター対応アプリの作り方
mitsuharu
0
60
iOS 開発で便利なツールたち
mitsuharu
0
220
「ゆめみ大技林 ’24」の紹介
mitsuharu
0
51
技適警察24時
mitsuharu
0
180
iOS アプリ開発におけるデータストリーム超入門
mitsuharu
0
180
オープンソースで作る自己紹介ソリューション
mitsuharu
0
76
Other Decks in Programming
See All in Programming
イマのCSSでできる インタラクション最前線 + CSS最新情報
clockmaker
5
3.7k
Enabling DevOps and Team Topologies Through Architecture: Architecting for Fast Flow
cer
PRO
0
410
layerx_20241129.pdf
kyoheig3
1
180
今からはじめるAndroidアプリ開発 2024 / DevFest 2024
star_zero
0
440
大規模サイトリビルドの現場から:成功と失敗のリアルな教訓 / Site Rebuild,Real Lessons Learned from Successes and Failures_JJUG Fall 2024
techtekt
0
190
Swift Testing - iPlayground
chiaoteni
0
140
Contemporary Test Cases
maaretp
0
160
Criando Commits Incríveis no Git
marcelgsantos
1
110
新規学習のハードルを下げる方法とは?/ How to Make Learning Something New Easier?
nobuoooo
1
130
Djangoの開発環境で工夫したこと - pre-commit / DevContainer
hiroki_yod
1
550
TypeScript でバックもやるって実際どう? 実運用で困ったこと3選
yuichiro_serita
17
7k
14 Years of iOS: Lessons and Key Points
seyfoyun
0
380
Featured
See All Featured
Designing the Hi-DPI Web
ddemaree
280
34k
BBQ
matthewcrist
85
9.3k
Building an army of robots
kneath
302
43k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Testing 201, or: Great Expectations
jmmastey
40
7.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
0
57
Visualization
eitanlees
145
15k
Raft: Consensus for Rubyists
vanstee
136
6.7k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
400
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.2k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
How GitHub (no longer) Works
holman
310
140k
Transcript
7BOJMMB+BWB4DSJQU ϚϧνϓϥοτϑΥʔϜͷເΛݟΔ͔ ߐຊޫ :6.&.*HSPX.PCJMF 1
ࣗݾհ w ͑ͱΈͭΔ w גࣜձࣾΏΊΈJ04ςοΫϦʔυ w ٕज़ಉਓࢽʮΏΊΈେٕྛ`ʯʹهࣄΛدߘ͠·ͨ͠ w ٕॻതʢऴྃʣɺٕज़ॻయͰ͠·͢ w
ిࢠ൛͋Γ·͢ 2
+BWB4DSJQU.VMUJ1MBUGPSNͷઓ w ྲྀߦΓͷ,.1Λ࢝Ίͱͨ͠ϚϧνϓϥοτϑΥʔϜ։ൃ w J04"OESPJEͷ྆ํͰ͑Δݴޠ$ +BWB4DSJQU͕͋Δ w ࠓճJ04Ͱ+BWB4DSJQUຊʹಋೖͰ͖Δͷ͔ʁ w ͍ͪ͝͝Ͳ͏ͳͷ͔ʁΛௐ·ͨ͠
දهͷҙ w +BWB4DSJQU+4 w ύοέʔδϥΠϒϥϦ 3
+4ϥΠϒϥϦͷ४උ w +4ϥΠϒϥϦཧπʔϧOQN͔ΒՃ͢Δ͜ͱ͕Ͱ͖·͢ w IUUQTXXXOQNKTDPN w ࢲZBSO͍ͳͷͰɺ࣍ͷΑ͏ͳײ͡Ͱ४උ͠·ͨ͠ cd js-packages yarn
init yarn add hoge 4
+4ؔͷ࣮ߦ w +4$POUFYUͰKTϑΝ ΠϧΛಡΈࠐΉ w ໊ؔΛࢦఆͯ͠ɺؔ Λऔಘ࣮ͯ͠ߦ͢Δ w ͓ؔΑͼΓ +47BMVFͱ͍͏ܕͰ
ѻ͏ import JavaScriptCore guard let path = Bundle.main.path(forResource: "bundle", ofType: "js"), let contents = try? String(contentsOfFile: path) else { return } let context: JSContext = JSContext(virtualMachine: JSVirtualMachine()) context.evaluateScript(contents) guard let function = context.objectForKeyedSubscript(name: "func_name") else { return } let arguments = ؔͷҾʢจࣈɺࣈɺྻͳͲ [Any] ͷܕʣ let result = function.call(withArguments: [arguments]) return result 5
ΤϥʔϋϯυϦϯά w +4ϑΝΠϧͷಡΈࠐΈ࣮ؔߦͷΤϥʔεϩʔ͞Εͳ͍ w +4$POUFYUͷΤϥʔϋϯυϦϯάؔΛཔΓʹݪҼΛٻͯ͠मਖ਼͢Δ w ຯ͕ͩɺͱͯॏཁͳϝιουͰ͢ context.exceptionHandler = {
context, error in guard let error = error, let message = error.toString() else { return } print("JSContext#exceptionHandler Error: \(message)") } 6
+4ϑΝΠϧͱJ04ϓϩδΣΫτ w +4ͰʮIPHFJOEFYKTʯʮQJZPJOEFYKTʯͳͲɺಉ໊ϑΝΠϧ͕ڞ ଘͰ͖Δ͕ɺJ04ΞϓϦͷϓϩδΣΫτͰಉ໊ϑΝΠϧ͑ͳ͍ w ϥΠϒϥϦ͕ଞͷϥΠϒϥϦʹґଘ͍ͯ͠Δ߹͋Δ w ෳͷ+4ϥΠϒϥϦΛJ04։ൃϓϩδΣΫτʹՃ͢Δͷ͍͠ 7
8FCQBDLͰ̍ͭͷϑΝΠϧʹ w ෳͷϑΝΠϧΛ̍ͭͷϑΝΠϧʹ·ͱΊͯ͘Ε ΔϞδϡʔϧόϯυϥ w ྫ͑ɺ#SJEHFͱͳΔJOEFYKTΛ࡞ͯ͠ɺͦ ΕΛରʹͯ͠CVOEMFϑΝΠϧΛ࡞͢Δ w ઃఆϑΝΠϧXFCQBDLDPO fi
HKTͳͲॻ͖ํল ུʢͷ63-Λݟ͍ͯͩ͘͞ʣ yarn add -D webpack wepback-cli yarn webpack // index.js import hoge from "hoge" import piyo from "piyo" export class Bridge { static hoge(arg) { return hoge(arg) } static piyo(arg) { return piyo(arg) } } 8
Ϟδϡʔϧ࡞ޙͷಡΈࠐΈ w όϯυϧϑΝΠϧ͕ϞδϡʔϧԽ͞ΕͨͷͰɺؔऔಘ·Ͱͷεςοϓ͕ ૿͕͑ͨɺ͜Ε·Ͱ͍ํͱมΘΒͳ͍ guard let module = context.objectForKeyedSubscript("module_name"), let
bridge = module.objectForKeyedSubscript("bridge_name"), let function = bridge.objectForKeyedSubscript("function_name") else { return } let arguments = ؔͷҾʢจࣈɺࣈɺྻͳͲ [Any] ͷܕʣ let result = function.call(withArguments: [arguments]) return result 9
σϞ w +VTUͱ͍͏+4ͷศརϥΠϒϥϦΛJ04 ͷதͰͬͯΈͨ w ฏۉܭࢉʢ+VTUNFBOʣ w ཚબʢ+VTUSBOEPNʣ w ͜͜Ͱɺ+VTUఆ൪ϥΠϒϥϦMPEBTI
ͷஔީิͷ̍ͭͱݺΕΔϥΠϒϥϦ w IUUQTHJUIVCDPNBOHVTDKVTU 10
ධՁɿ,.1ͷΑ͏ʹͳΔʁˠͳΒͳ͍ w +BWB4DSJQUϥΠϒϥϦ͕ଟ͘ॆ࣮ͯ͠Δͷ͔͕֬ͩɺΘ͟Θ͟ J04ͷதͰಈ͔͢ཧ༝ബ͍ w +47BMVFԿʹͰͳΔܕɺؔҾ"OZͳͷͰɺܕ҆શͳ։ൃͰ ͖ͳ͍ w ॲཧڞ௨Խ͍ͨ͠߹ɺૉ 7BOJMMB
ͷ+4Ͱͳ͘ɺ3FBDU/BUJWFͳͲ ͷϚϧνϓϥοτϑΥʔϜରԠͷϑϨʔϜϫʔΫΛར༻͢ΔͱΑ͍ w ʢλΠτϧճऩʣ 11
ͰɺͲ͏ͯ͠+4Λಈ͔͍ͨ͠ͷ͔ w ໘നͦ͏͔ͩͬͨΒ w +BWB4DSJQUͰॻ͔Εͨ044ΛJ04ΞϓϦͷதͰಈ͔͔ͨͬͨ͠ w ͱ͋ΔௐΛ͍ͯͯ͠ɺͦͷศརπʔϧ͕͋Δ͜ͱΛͬͨ w ͨͩ͠ɺͦΕ+BWB4DSJQUͰ͋Γɺ4XJGUͳͲͷҠ২ͳ͔ͬͨ w
ͦ͏͍͑ɺJ04+BWB4DSJQU$PSF͕͋Δͳ͋ʜ͕ΩοΧέ w ಈ࡞֬ೝࡁΈͰɺػձ͕͋ΕJ04%$ͷύϯϑϨοτهࣄͰॻ͖͍ͨ 12
·ͱΊ w ·ͬͨ͘ɺ+4࠷ߴͩͥ w IUUQTHJUIVCDPNNJUTVIBSV6TF+BWB4DSJQU1BDLBHFT 13