◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-03-27上級

Rork Max × Expo Modules API でカスタムネイティブモジュールを作り、npm で配布する

Expo Modules APIでカスタムネイティブモジュールを作り、Rork Maxアプリのネイティブ機能を拡張する上級ガイドです。SwiftとKotlinそれぞれの実装、TypeScript APIレイヤーの設計、テスト戦略、npmでの配布までを一通り解説します。

Rork Max236Expo Modules APIネイティブモジュール9React Native239Swift48Kotlin4npm配布

✦ プレミアム記事

取り組みの背景 — なぜカスタムネイティブモジュールが必要なのか

Rork Max は AI 駆動のコード生成と Expo エコシステムにより、多くのアプリ開発ニーズをカバーしています。しかし、プロダクション品質のアプリを構築する段階になると、既存のライブラリだけでは対応しきれない場面が必ず訪れます。

たとえば、独自のハードウェアセンサーへのアクセス、特定の OS API との高速なブリッジ通信、あるいはサードパーティ SDK のラッパー実装など、ネイティブコードを直接書く必要があるケースは少なくありません。

Expo Modules API は、こうした課題に対するモダンな解決策です。従来の React Native Bridge と比較して、型安全性・パフォーマンス・開発体験のすべてにおいて大きく進化しています。

加速度センサーを読むだけの小さなモジュールを題材に、Swift と Kotlin の実装、TypeScript レイヤーの設計、テスト、そして npm 配布までを順に追っていきます。後半には、私が実機で動かして初めて気づいた設計上の落とし穴も併せて記しました。

この記事の対象読者:

  • Rork Max でアプリをリリース済み、またはリリース間近の開発者
  • React Native の基本を理解しており、ネイティブ拡張に踏み込みたい方
  • 自作モジュールを npm で公開して再利用性を高めたい方

Expo Modules API の設計思想とアーキテクチャ

従来の Bridge との違い

React Native の従来のブリッジ(Legacy Bridge)は、JavaScript とネイティブ間の通信を JSON シリアライゼーションで行っていました。この方式は柔軟ではあるものの、いくつかの根本的な問題を抱えていました。

Legacy Bridge の課題:

  • 非同期 JSON シリアライズによるオーバーヘッド
  • 型安全性の欠如(ランタイムエラーが発生しやすい)
  • iOS と Android で別々の実装パターンが必要

Expo Modules API の解決策:

  • JSI(JavaScript Interface)ベースの同期通信で高速化
  • Swift/Kotlin のネイティブ型がそのまま使える型安全設計
  • 両プラットフォーム共通の宣言的 API
// Legacy Bridge(旧方式)— JSON を介した非同期通信
// NativeModules.MyModule.doSomething(callback)
 
// Expo Modules API(新方式)— JSI ベースの同期呼び出し
import { requireNativeModule } from 'expo-modules-core';
const MyModule = requireNativeModule('MyModule');
const result = MyModule.doSomething(); // 同期的に結果を取得

モジュールのライフサイクル

Expo Modules API で作成したモジュールは、以下のライフサイクルに従います。

  1. Registration(登録): expo-module.config.json によるモジュール自動検出
  2. Definition(定義): Swift/Kotlin で Module クラスを継承しモジュールを定義
  3. Linking(リンク): Expo の autolinking が自動的にネイティブプロジェクトに統合
  4. Runtime(実行): JSI を通じて JavaScript から直接呼び出し
✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦Expo Modules API の設計思想と Swift/Kotlin でのモジュール実装手順を体系的に理解できる
✦カスタムネイティブモジュールのユニットテスト・E2Eテスト戦略を実践できる
✦作成したモジュールを npm パッケージとして公開・配布するワークフローを習得できる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-05-06
Rork アプリに Expo Dev Client を導入する手順 — ネイティブモジュールが Expo Go で動かなくなったときの最初の一手
Rork で生成したアプリにネイティブモジュールを足したら Expo Go で開けなくなった。そんなときの Expo Dev Client(カスタム開発ビルド)の導入手順と、prebuild の落とし穴・リビルドの判断基準・EAS Update との関係を整理します。
⬡ 開発ツール2026-04-28
Rork Max でスクリーンタイム制御アプリを実装する手順 — Family Controls / DeviceActivity / ManagedSettings
Rork Max でスクリーンタイム系アプリを実装する実践ガイド。Family Controls の認可、DeviceActivity の時間帯監視、ManagedSettings によるアプリブロックを Rork のカスタムネイティブモジュールに組み込む全工程を、ハマりどころとともに解説します。
⬡ 開発ツール2026-04-27
Rork Max × Apple TipKit 実装ガイド — オンボーディング離脱を減らすアプリ内ガイダンス設計
Rork Maxのネイティブモジュール経由でiOS 17以降のTipKitを組み込み、オンボーディング離脱を減らすアプリ内ガイダンスを設計します。Eligibilityルールによるタイミング制御、SwiftUI連携、4言語運用のローカライゼーション、CloudKit同期まで実装します。