Vibe Codingで一作目のウェブポータル「Sushipo!」を作り終えて、次はどんなサービスを作ってみようか考えている中でウェブアプリではなく、iOSとAndroidのアプリもやってみたいと思い調べてみました。

昨今は便利なものでひとつのコードでiOS、Android両方に対応したアプリを開発できるサービスがあるようでその中でもFlutter、React Nativeという2つのサービスのシェアが圧倒的みたいです。

この2つのサービスについて、Cursorを使ってAIにコードを書いてもらうならどっちが良さそうか、ChatGPTとやり取りして、最後にまとめてもらったの下記です。

1. はじめに

クロスプラットフォーム開発を検討する際、重要なのは「パフォーマンス」「開発効率」「学習コスト」などさまざまな観点から評価することです。特に、今回のようにAIにコード作成を担わせる(Cursorを利用する)場合、フレームワークの言語仕様や自動生成されたコードのメンテナンスのしやすさ、デバッグ環境、そしてコミュニティのサポートが大きく影響します。以下では、FlutterとReact Nativeそれぞれの長所と短所を整理し、初心者かつAI駆動開発に適した選択肢について考察します。


2. Flutterの特徴と評価

主な特徴

  • 独自のウィジェットシステム:
    Flutterはすべてがウィジェットで構成されるため、UIのカスタマイズ性が非常に高く、どのプラットフォームでも一貫した見た目を実現できます。
    (参考:​、​)
  • Dart言語:
    言語自体はシンプルで習得しやすい面がありますが、JavaScriptやTypeScriptに慣れている開発者にとっては新たな学習コストとなる可能性があります。
  • パフォーマンス:
    ネイティブコードへコンパイルされるため、高いパフォーマンスを発揮します。また、独自レンダリングエンジンによりUIが一貫して描画されます。
    (参考:​、​)
  • ホットリロード:
    開発中にリアルタイムで変更を反映できるため、試行錯誤が容易です。

AI駆動開発(Cursor利用)との相性

  • メリット:
    • 一貫性の高いコード生成: ウィジェットという明確な概念に基づいたコードは、AIが生成する場合でも構造が一定しており、修正や拡張がしやすいと考えられます。
    • テスト・デバッグ環境: Flutterは公式ツールが豊富で、生成されたコードの動作確認やデバッグが比較的容易です。
  • デメリット:
    • 言語習得の壁: Dartが未経験の場合、AIが生成したコードの理解や修正が困難になる可能性があります。
    • エコシステムの成熟度: JavaScriptに比べると、外部ライブラリやプラグインの選択肢はやや少ない面もあるため、特殊な機能実装時に調整が必要となる場合があります。

3. React Nativeの特徴と評価

主な特徴

  • JavaScript/TypeScriptの利用:
    多くの開発者が馴染みのある言語を利用でき、Web開発の延長線上で取り組みやすい点が魅力です。
  • ネイティブコンポーネントの活用:
    実際のプラットフォームが提供するUIコンポーネントを活用するため、ネイティブ感のある操作性や見た目が実現できます。
  • 豊富なライブラリとコミュニティ:
    すでに成熟したエコシステムがあり、多種多様なライブラリやサードパーティ製のプラグインが存在します。

AI駆動開発(Cursor利用)との相性

  • メリット:
    • 広い利用者層: JavaScript/TypeScriptの普及により、AIコード生成ツールも比較的豊富な事例を参考にでき、生成コードの品質も期待しやすいです。
    • 柔軟な拡張性: 豊富なライブラリにより、生成されたコードに対して各種拡張やカスタマイズがしやすい傾向があります。
  • デメリット:
    • ブリッジの存在: ネイティブコンポーネントとの橋渡しの仕組み(ブリッジ)によって、AIが自動生成したコードに不具合が出る可能性があり、デバッグが複雑になる場合があります。
    • 一貫性の課題: プラットフォームごとに若干のUI差異が出る場合があり、AI生成コードが全ての端末に最適化されているかどうかのチェックが必要です。

4. 技術的比較と違い

項目FlutterReact Native
言語DartJavaScript/TypeScript
UI構築方法独自のウィジェットで一貫したUI構築ネイティブコンポーネントを利用
パフォーマンスネイティブコードコンパイルにより高いパフォーマンスブリッジの影響で場合によりパフォーマンス低下可能
開発ツールホットリロードや公式ツールが充実エコシステム(Expo含む)の充実、ただしブリッジ有
コミュニティ急速に拡大中だがJSほどの規模ではない非常に大きく、情報も豊富

特に、どちらのフレームワークもUIのホットリロード機能は備えていますが、Flutterは自身のレンダリングエンジンを使うため、プラットフォーム固有の違いが出にくいのが強みです。一方、React Nativeは実際のネイティブコンポーネントを使用するため、プラットフォーム特有の調整が必要な場合もあります。


5. Cursorを用いた初心者向け開発における適性評価

Flutterが適している理由

  • コードの一貫性:
    ウィジェット中心の構造は、AIが生成する場合でも整然としたコードが生成されやすく、予期せぬ挙動を抑制できます。
  • 開発環境の統一感:
    ホットリロードやエミュレーター上での動作確認がスムーズなため、生成コードの検証が容易です。
  • UIのカスタマイズ性:
    ビジュアル面での一貫性が高いので、異なるプラットフォーム間で見た目のギャップが少なく、初心者が作成したコードでもプロフェッショナルな仕上がりが期待できます。

React Nativeが適している理由

  • 広範な知見と情報:
    JavaScriptの豊富な学習資料、サンプルコード、コミュニティのサポートにより、AI生成コードの不具合発生時でも参考になる情報が多いです。
  • 既存の資産との親和性:
    もしWebサービスや他のJSベースのプロジェクトとの連携が必要な場合、その延長として取り組みやすいというメリットがあります。

総合評価と推奨

  • 初心者でAI駆動での開発の場合:
    • Flutterの推奨理由:
      AIがコード生成する場合、明確なウィジェットベースの設計は予測可能であり、デバッグサイクルも短く、初心者でも動作確認がしやすい点は大きなメリットです。さらに、統一感のあるUI提供という点でも、サービスの品質維持に寄与します。
      • 留意点: Dartの基礎知識は事前に学習しておくと、AIコードの修正・理解が容易になります。
    • React Nativeの場合:
      JavaScriptやReactの既存知識がある場合には、迅速な開発が可能ですが、ネイティブブリッジの部分でAIが生成するコードの調整が必要になるリスクも考慮する必要があります。

総じて、今後の展開やデザインの一貫性、そしてAIによる自動コード生成の安定性を重視するなら、Flutterがより適していると考えられます。ただし、すでにJavaScriptに精通している場合や、将来的にWeb技術と連携する可能性が高い場合は、React Nativeも有力な選択肢です。


6. 結論

  • Flutter:
    • メリット: 高いUI一貫性、優れたパフォーマンス、ホットリロードによる効率的な開発
    • デメリット: Dartの習得が必要、エコシステムの規模がJavaScriptほどではない
    • AI駆動開発との相性: コード生成の予測可能性とデバッグのしやすさで初心者に優しい
  • React Native:
    • メリット: JavaScriptの普及と情報量、既存のWeb技術との親和性、豊富なライブラリ
    • デメリット: ネイティブブリッジの問題、プラットフォーム固有の調整が必要になる可能性
    • AI駆動開発との相性: 広いコミュニティのサポートがメリットだが、生成コードの微調整が必要となる可能性が高い

最終的に、AIがほぼすべてのコードを生成するという前提なら、明確な構造とデバッグのしやすさが求められるため、初心者であればFlutterの方がリスクが少なく、安定的に成果物を得やすいと結論付けられます。もちろん、既にJavaScriptの知識がある場合はReact Nativeも十分検討に値しますが、Cursorでのコード生成という視点ではFlutterのメリットが際立つと考えられます。

以上の理由から、AI駆動開発で初心者が取り組むクロスプラットフォームアプリケーションは、まずはFlutterで試してみることを推奨します


以上がChatGPTのまとめです。

ChatGPTの回答以外にもいろんな方のブログ記事を読んでみましたが、個人的にはFlutterをまず使ってみるのが良さそうだという意見で一致しました。

Next.jsを使って1ヶ月近くウェブアプリを作ってきたので、javascriptの少しの知見を活かすにはReact Nativeの方なのでしょうが、正直このくらいの知識は0でも変わらないレベルかなと思い、デバッグがしやすくiOSとAndroidでも統一感のあるUIが実装でき、設計もウィジェットベースで理解しやすい、というFlutterに惹かれました。

また、次に作るサービスはサービス内にもAIを組み込んでみたく、Googleのサービスで統一した方が便利そうという理由もあります。Flutter、gemini、Firebaseなど次はGoogleのサービスで統一してみてどれだけ楽になるかを試してみたいと思っています。

というわけで、実際に作ってみないとわからないことだらけなので、あれこれ考えずとりあえず作ってみて使いにくかったらReact Nativeを試してみます。

感想や制作工程はまたブログやTwitterにアップしていきますので、よかったらフォローしてくださいまし。

それでは!

Categorized in: