メニュー

公開日:
11 min read
エンジニアリング

初心者が陥る?Reactの罠/AI拡張型開発の実際

初心者が陥る?Reactの罠/AI拡張型開発の実際のイメージ

数か月前のこと、reactで初めてページを作成した。CRMのシステム共通設定画面である。 ここでconsoleに次のようなエラーが表示された。

chunk-ZSFERV6L.js?v=eaf86a9b:1248 Warning: [antd: Form.Item] A Form.Item with a name prop must have a single child element. For information on how to render more complex form items, see https://u.ant.design/complex-form-item.

AIに聞いてみた。

エラー箇所が特定できますか?

はい、このエラーは antd の Form コンポーネントから発生しており、Form.Item の使用方法に問題があることを示しています。

この警告が出る一般的な原因は、Form.Item に name プロパティが指定されているにもかかわらず、複数の子要素が含まれているか、あるいは単一のフォームコントロール以外の要素が含まれている場合です。 コードを確認すると、パスワード入力フィールドの部分に問題がある可能性があります:

   <Card title="PayPal設定" className="mb-4">
  <Form.Item name="paypal_client_id" label="Client ID" rules={[{ required: true }]}>
    <Input />  {/* Input.Password から Input に変更 */}
  </Form.Item>

  <Form.Item name="paypal_secret_key" label="Secret Key" rules={[{ required: true }]}>
    <Input />  {/* Input.Password から Input に変更 */}
  </Form.Item>

(的外れな修正の提案) これらの修正を適用して、警告が解消されるか確認してみてください。また、開発者ツールで警告が出ている時に該当するコンポーネントにマウスを合わせると、問題のある具体的な Form.Item が強調表示される場合があります。その情報も参考になるかもしれません。

何度もコードを検査した。タグの数は合っている。子要素は一つしかない。

GitHub Copilot エラーの原因を突き止めるために、以下の点を確認してください:

Form.Item の中に複数の子要素がないか確認する:

Form.Item の中に複数の子要素があるとエラーが発生します。例えば、文字列やコメントが含まれていないか確認してください。 条件付きレンダリングの確認:

条件付きレンダリングで複数の要素がレンダリングされていないか確認してください。 余分な空白や改行の確認:

Form.Item の中に余分な空白や改行が含まれていないか確認してください。

AIに修正を何度も依頼するも、AIは「修正した」と言いつつ、コードはなにも変更されていない。 目視でもおかしなところが見つからない。

直らない。こんな不毛なやりとりをもう数時間も続けている。どうすればいいのかわからない。

詰んだのか?reactって、こんなクソなのか?

ふと、なにげに、本当になんとなく、コメントを削除してみた。 そう、ベテランの勘、というやつだ。

エラーが消えた… はあ? なんでやねん!!!!!!?

AIに報告する。

コメントのせいでした!

なるほど、コメントが原因だったんですね!

Ant Design の Form.Item では、JSXのコメント({/* ... */})も子要素としてカウントされてしまうため、name プロパティを持つ Form.Item 内ではコメントを避ける必要があります。

修正前:

   <Form.Item name="paypal_client_id" label="Client ID" rules={[{ required: true }]}>
  <Input /> {/* Input.Password から Input に変更 */}
</Form.Item>

修正後:

   <Form.Item name="paypal_client_id" label="Client ID" rules={[{ required: true }]}>
  <Input />
</Form.Item>

このような細かい仕様は把握しづらいですよね。Reactでは一般的にJSXコメントはレンダリングされない要素として扱われますが、Ant Design の Form.Item は特殊な動作をするコンポーネントなので、このような制限があります。

今後の開発で覚えておくと良いポイントですね。

ふーん。なんか、reactって、やっかいなんだなあ。 ところで、Ant Designってなに?reactでよく使われるの?

Ant Designとは?

AIの回答はこうだ。

日本ではAnt Designは比較的マイナーな存在で、代わりにMaterial UI(MUI)やChakra UIの方がメジャーです。主な理由としては、日本語の情報が比較的少ないことや、ドキュメントの英語翻訳が完全ではないことが挙げられます。

なんでそんなもん使うねん???! マテリアルデザインをつかえや!

「今後の開発で覚えておくと良いポイントですね。」

二度と使わねーよ!!!!

ベトナムでの開発ではメジャーなのかもしれないが、日本でマイナーなフレームワークを使用されると、情報が少ないために、このようにAIを使用しても、ちょっとしたことに躓いてしまいます。だからこそ、採用するフレームワークは、使用される国でメジャーなものを使用するべきだと思いますが、開発元はそんなことをお構いなしです。

クレームしてやる!!!

補足すると、Ant Designは、Ant Group(アリババグループの金融関連会社)が開発した、エンタープライズ向けのUIデザインシステムだ。50以上の高品質なUIコンポーネントを提供し、TypeScriptに対応した包括的なライブラリである。海外、特に中国では非常に人気があり、Alibaba、Tencent、Baiduなどの大手企業で広く採用されている。GitHubでも高い評価を得ており、グローバルでは主要なReactコンポーネントライブラリの一つとして認知されている。

クレームしてみた

納品されたシステムは、Ant DesignというUIコンポーネントライブラリを使用しています。

Ant Designは、Ant Group(アリババグループの金融関連会社)が開発した、エンタープライズ向けのUIデザインシステムです。中国発のUIコンポーネントライブラリであることから、日本語の情報が比較的少ないため、国内での採用は非常に限定的です。日本ではMaterial UI(MUI)やChakra UIの方がメジャーで広く使われています。私も普段はMaterial UIを使っています。

そのため、機能追加で不要な苦労を強いられています。

なぜ日本でマイナーなUIコンポーネントライブラリをわざわざ使うのでしょうか?御社の見解を知りたいです。

開発会社から回答がきた。

開発効率を優先して、開発チームに一番やりやすい方法で開発してください、と指示したためです。

管理者SEに文句言っても始まらないか…そもそも、クライアントがこの開発会社を選んだ時点で、詰んでいたんだ。 私はクライアントと開発会社の双方の尻ぬぐい、後始末、消火作業をしているようなものだ。

つまり、開発会社はクライアントがこれから背負うであろう長期的な保守性よりも、開発側の都合を優先したのだ。 これはオフショア開発でしばしば見られる課題の一つである。 技術選定においては、開発効率だけでなく、保守のしやすさや地域特性も考慮することが重要なのだが、このような視点が抜けているのは、実装しない人間が実装を管理しているからとしか思えない。

だが、同じような問題はAIを活用した開発においても発生する。AIツールは問題解決をサポートしてくれますが、根本的な技術選定の誤りまでは解決できないのだ。 実際、EOLを過ぎたオープンソースや日本では普及していないフレームワークを提案されたことは、一度や二度ではない。

新しい人生を歩もう

で、一般的に、尻ぬぐいをさせた側って、その意識ないんですよね… 「あと始末なんて、お願いしたことありましたっけ?」と、きたもんだ。 もういやだ、こんなクライアント。 長い付き合いだが、ほとほと愛想が尽きた。 取引を終了しよう。