使用JavaScript进行一次编写,跨平台运行
傻瓜
車輪の再発明したくない(見飽きた、モチベーションあがんない)
スマホとかOSのアップデートとかに引っ張られてアプリの保守したくない
同じビジネスロジックをいろんな環境(プログラミング言語)で書きたくない
サービスの本質の部分に時間を割きたい
極力作りたくない病(保守するものが増える)
想做的事情 zuò de shì
-
- パラメータ受け取ってJSONを返す関数(ビジネスロジック)を共通化
色々な環境からコールができる、古いコードも動くJavaScriptが良さげ(サーバサイド、フロントエンド、ネイティブコール、デスクトップアプリ化)
Firebaseぽくローカルとサーバのデータを同期させたい(オフラインでも動く)
速度?セキュリティ?なにそれおいしいの?
Java?いえ、知らない子ですね
我想要改變環境。 (Wǒ .)
-
- Rest APIとして提供(NodeJS)
-
- ブラウザ(Chrome,Mobile Safari,IE)
-
- スマートフォンネイティブ(iOS,Android)
- デスクトップアプリ(Windows,Mac OSX)
实现方式
-
- ビジネスロジックはNodeJSのモジュールとして記述し、Browserifyでブラウザモジュール化
-
- iOS、AndroidはWebView経由でJavaScript関数コール
-
- ストレージはlocalStorageDBでローカル保存、サーバ同期
Electronでデスクトップアプリ化
形象
为什么选择localStorageDB?
-
- SQLiteとかだとそれぞれの環境でDB呼び出しの実装が必要(めんどいというか本末転倒)
-
- localStorageだと守備範囲広い
単純なlocalStorageだとKVSなので検索とかしたいし
少し工夫したらNodeJSでも使えたのでブラウザ間とのデータ同期に使えそう
ブラウザにもよるけどlocalStorageの上限5MBほどらしいのでイメージとかバイナリ保存には向いてない
试试看
样例代码链接在GitHub上:https://github.com/teradonburi/bridge。
发放的物品
-
- NodeJSサンプル(Rest API)
-
- ブラウザサンプル
-
- iOS、Androidサンプル(WebView経由で呼び出し)
- PCアプリサンプル(Electron)
使用gulp进行自动化
一旦对代码进行修正后,繁琐的工作可以通过gulp自动化完成。
-
- NodeJSサーバ再起動(execSync)
-
- ブラウザ再読み込み(gulp-webserver)
-
- 単体テスト(jasmine-node)
-
- コードレビュー(grunt-plato)
-
- APIドキュメント作成(gulp-yuidoc)
-
- ブラウザコード化(Browserify)
- PCアプリ生成(electron-packager)
数据同步机制
-
- ページ表示にサーバからデータ同期(全ユーザデータ読み取り)
-
- オンライン状態はローカルデータ書き込み時にサーバに自ユーザデータを同期
-
- オフライン→オンライン時にサーバとデータ同期
-
- 他ユーザデータが更新されたらWebSocketでプッシュ受信でローカルデータ更新
- 自ローカルで他ユーザ更新はやらない(同期時にデータ整合性取れなくなるので)
真的只能写一次吗?
-
- WebViewからの呼び出し部分はOS依存(iOS、Android)
- Electronのバージョンアップに依存
修正範围虽然变窄了,但如果操作系统版本升级了,保证是不可能的。
挑战
-
- HTMLをローカルファイルにして提供するとクロスドメインの問題が・・・(サーバ側でCORS許可するかローカルファイルやめてHTMLページをサーバ提供に?)
-
- 別のPCアプリからElectronアプリのAPIコール(プロセス間通信)したい場合、どうすりゃいいの?・・・(いっそElectronのメインプロセス側にNodeJSのHTTPサーバを立てる?)
- GUIコンポーネントもライブラリ化したい