上個月回來寫 React-native,想做點自己的小玩具玩。距離上次寫 React-native 已經是七年前的 kaif.io rn app 了,歲月如梭啊,在這期間,我竟然連一次都沒有想在手機上跑自己程式的想法,看來果然是被蘋果生態系禁錮太久了 XD (歡迎來到水果監獄)
為了要在 React-native 上使用 codemirror 這個網頁用的程式碼編輯器,我需要使用 react-native-webview,而且為了實作可互動的界面,我同樣需要在 webview 中使用 React.js
要如何實作呢?我們先從 react-native-webview 的 API 開始看起。
在 react-native-webview 提供兩種 API 可以執行 JavaScript 程式碼:
source
Attribute: 可以給網址或是 HTML 原始碼因為我想要讓我的 webview 能夠離線執行,所以勢必要把 JavaScript 和 HTML 一起打包進 React Native App 裡面。
翻了翻其他使用 webview 客製的案例,以 react-native-webview-leaflet
來說,就是直接把 build 完的 html 原始碼 commit 進 repo 裡,作為一位已經被現代網頁開發工具慣壞了的工程師,這種行為當然不可以發生!而且要怎麼 Hot Reload?
值得一題,我同時還使用了 Expo 這套 React Native 開發框架。Expo 把許多 React Native 的原生 Library 都包進框架裡面(包含 react-native-webview),帶來最無縫最容易最絲滑順暢的 React Native 開發體驗,要怎麼把自定的 WebView JavaScript Bundling 和 Expo 無縫整合呢?
vite-plugin-singlefile
, 以及一點點的 gluing scripts因為一些大人的因素,完整的程式碼還沒開源,我這邊就貼部分的程式碼出來。
首先先準備好 webview 要用的 html (/webivew/index.html
):
以及對應的 vite 設定檔(/vite.config.js
)
此時每次 vite build 後會輸出到 /dist/webview/index.html
,我再寫了一個簡單的腳本,複製 index.html
到 react-native 的 /assets
目錄去(欸對就這麼簡單還要寫 JavaScript 幹嘛 XDD 為了跨平臺辣)
然後寫一個 react hook 去讀 HTML 內容:
最後丟給 react-native-webview
:
只要 Assets 檔案有改,Reload app 的話 html 也會重新載入,超級舒適!!
難得的技術小筆記。其實最近弄 Blast Launcher 比較多,方才打開草稿記錄夾,發現這篇也躺了快一個月,趕忙在還沒忘記的時候記錄一下。
關於流程其實也有改進的地方,比如複製檔案那邊,應該要讓 vite 直接輸出到 assets
資料夾就好,這樣 incremental build 也會有更舒服的體驗,不過當時沒有足夠的時間研究出來,就算是留下一個改進的伏筆了 (=ↀωↀ=)✧