Repolode
pocket-nexus

pocket-nexus/pocketjs

DOMやWebViewを使わず、携帯機・デスクトップ・組み込み画面にネイティブ描画するTypeScript UIランタイム。

スター
1,837
フォーク
104
未解決の Issue
93
最終コミット
22 時間前

これは何?

PocketJSは、ブラウザーエンジンではなくネイティブ描画でインターフェースを構築するためのアプリケーションランタイムです。アプリケーションはSolid、Vue Vapor、Octaneのコンポーネントを使ってTypeScriptで記述し、いずれのアダプターも単一のネイティブツリーに描画します。QuickJSゲストがアプリケーションを実行し、Rustコアが単一プロセス内の単一スレッドでFlexboxレイアウトと描画を行うため、処理経路にDOM、CSSエンジン、WebViewはありません。

スタイリングには固定されたTailwindサブセットを使用し、ビルド時にスタイルテーブルへ埋め込みます。そのため、端末上ではクラス属性を検索で解決でき、カスケード、詳細度の解決、リフローは発生しません。アプリの契約ファイル(pocket.app.json)でビューポートと必要なAPIを宣言でき、ひとつのバンドルを異なるピクセル密度のターゲットに合わせて検証できます。キーフレームのタイムラインとスプリングカーブも同じテーブルに埋め込まれ、Rustコア独自のクロックで進むため、フレームごとにJavaScriptを実行せずに画面をアニメーションできます。

ランタイムはアプリケーションをframe(buttons)の呼び出しごとに1フレーム進め、時間をフレームカウンターとして扱います。これにより、非同期エフェクトはフレーム境界で実行され、セッションをバイト単位で再生できるため、テストの再現性も確保できます。PSP、PS Vita、iOS、macOS、Symbian、PocketBookの電子ペーパーリーダー、ESP32-P4ハードウェア、およびWebAssemblyコア経由のブラウザーで起動実績があります。リポジトリには、ハードウェアネイティブな3DスタックのPocket3Dと、TypeScriptのビューおよびモデルからRustへAOTコンパイルするMicroTSも含まれています。

主な機能

  • 01Solid、Vue Vapor、Octaneの各アダプターは、同じQuickJSゲスト上で単一のネイティブツリーに描画します。
  • 02固定されたTailwindサブセットをビルド時にスタイルテーブルへ埋め込み、CSSパーサーやリフローを使わずに検索で解決します。
  • 03キーフレームのタイムラインとスプリングカーブはRustコアのクロックで進むため、アニメーションにフレームごとのJavaScript実行は不要です。
  • 04アプリケーションはframe(buttons)の呼び出しごとに1フレーム進み、非同期エフェクトはフレーム境界にキューイングされるため、決定論的に再生できます。
  • 05ネイティブモジュールはカーネルドライバーのように読み込まれ、net、audio、3Dなど、アプリが必要とするコアだけがビルドに含まれます。
  • 06pocket.app.jsonの契約ファイルでビューポートと必要なAPIを宣言できるため、ひとつのバンドルを異なるピクセル密度の画面に対応させられます。

ユースケース

  • PSP、PS Vita、Nintendo 3DSなどの携帯機向けに、UIアプリケーションやゲームインターフェースを構築する。
  • ESP32-P4のようなマイコンや電子ペーパーリーダー向けに、オーバーヘッドの小さいインターフェースを構築する。
  • WebViewを介さず、単一プロセス内でネイティブ描画するデスクトップアプリを配布する。
  • CIで実時間のタイミングによる不安定さを避け、決定論的にフレームを再生するUIテストを実行する。

クイックスタート

  1. 1

    PocketJS CLIで新しいアプリを作成する

    pocket create my-app
  2. 2

    PSPなどの対象デバイスでアプリを確認する

    pocket check --target psp

使う前に知っておきたいこと

  • MicroTSのAOTコンパイラーは現在も開発中です。
  • デスクトップでは、READMEによると、エディターがキー入力のたびにドキュメント全体を再度折り返すため、ドキュメントが長くなるほどCPU使用率が上がります。

収録されている特集

トピック

よくある質問

pocketjs とは?
DOMやWebViewを使わず、携帯機・デスクトップ・組み込み画面にネイティブ描画するTypeScript UIランタイム。 PocketJSは、ブラウザーエンジンではなくネイティブ描画でインターフェースを構築するためのアプリケーションランタイムです。アプリケーションはSolid、Vue Vapor、Octaneのコンポーネントを使ってTypeScriptで記述し、いずれのアダプターも単一のネイティブツリーに描画します。QuickJSゲストがアプリケーションを実行し、Rustコアが単一プロセス内の単一スレッドでFlexboxレイアウトと描画を行うため、処理経路にDOM、CSSエンジン、WebViewはありません。
pocketjs は無料で使えますか?ライセンスは?
pocketjs は MIT ライセンスのオープンソースです。商用製品で使う前にライセンス条件を確認してください。
pocketjs は今もメンテナンスされていますか?
活発にメンテナンス中。pocketjs の最終コミットは 2026年11月6日 です。
pocketjs は何に使えますか?
PSP、PS Vita、Nintendo 3DSなどの携帯機向けに、UIアプリケーションやゲームインターフェースを構築する。 ESP32-P4のようなマイコンや電子ペーパーリーダー向けに、オーバーヘッドの小さいインターフェースを構築する。 WebViewを介さず、単一プロセス内でネイティブ描画するデスクトップアプリを配布する。 CIで実時間のタイミングによる不安定さを避け、決定論的にフレームを再生するUIテストを実行する。
pocketjs のインストール方法は?
PocketJS CLIで新しいアプリを作成する: pocket create my-app PSPなどの対象デバイスでアプリを確認する: pocket check --target psp
pocketjs はどこで入手できますか?
ソースコードとインストール手順は GitHub にあります:https://github.com/pocket-nexus/pocketjs

概要はプロジェクトの README をもとに AI が生成しています。GitHub の数値は毎日更新されます。

関連プロジェクト