react-international-phone、react-intl-tel-input、react-phone-input-2、react-phone-number-inputはすべて、国際電話番号の入力機能を提供するReactコンポーネントライブラリです。これらのライブラリは、ユーザーが国コードを選択し、電話番号を入力できるUIを提供し、国際的なフォーム実装を簡素化します。ただし、それぞれのライブラリは設計思想、バリデーション精度、カスタマイズ性、メンテナンス状況において大きな違いがあります。特に、react-intl-tel-inputは非推奨となっており、新規プロジェクトでの使用は推奨されません。他の3つのライブラリはアクティブにメンテナンスされており、プロジェクトの要件に応じて適切な選択が可能です。
国際電話番号を扱うUIコンポーネントは、フォーム実装でよく必要になります。しかし、それぞれのnpmパッケージには設計思想や技術的トレードオフが大きく異なります。この記事では、プロフェッショナルなフロントエンド開発者がアーキテクチャ選定を行う際に役立つ、実践的な観点から4つの主要パッケージを比較します。
react-international-phoneこのパッケージはシンプルでモダンなAPIを提供し、valueとonChangeによる制御型コンポーネントとして動作します。国コード(例: "JP")と電話番号(例: "9012345678")を別々に管理する設計です。
import { InternationalPhone } from 'react-international-phone';
import 'react-international-phone/style.css';
function App() {
const [phone, setPhone] = useState({ country: 'JP', value: '' });
return (
<InternationalPhone
defaultCountry="JP"
value={{ country: phone.country, phone: phone.value }}
onChange={(data) => setPhone({ country: data.country, value: data.phone })}
/>
);
}
react-intl-tel-input注意:このパッケージは非推奨(deprecated)です。 公式npmページおよびGitHubリポジトリに明確な非推奨通知があり、新規プロジェクトでの使用は避けるべきです。代わりにメンテナンスされている代替品を検討してください。
// 非推奨のため、新規プロジェクトでは使用しないでください
import IntlTelInput from 'react-intl-tel-input';
import 'react-intl-tel-input/dist/main.css';
<IntlTelInput
preferredCountries={['jp']}
onSelectFlag={(countryCode) => console.log(countryCode)}
onPhoneNumberChange={(status, value, countryData) => {
// 複雑なコールバック引数
}}
/>
react-phone-input-2非常にカスタマイズ性の高いコンポーネントで、電話番号全体を1つの文字列(例: "+819012345678")として扱います。多くのpropsオプションがあり、細かい見た目や動作の調整が可能です。
import PhoneInput from 'react-phone-input-2';
import 'react-phone-input-2/lib/style.css';
function App() {
const [phone, setPhone] = useState('');
return (
<PhoneInput
country={'jp'}
value={phone}
onChange={(phone, country, e, formattedValue) => setPhone(phone)}
inputClass="custom-input"
buttonClass="custom-button"
/>
);
}
react-phone-number-inputこのパッケージは電話番号のバリデーションとフォーマットに特化しており、libphonenumber-jsライブラリを内部で使用しています。電話番号はE.164形式(例: "+819012345678")で扱われ、正確なバリデーションが可能です。
import PhoneInput from 'react-phone-number-input';
import 'react-phone-number-input/style.css';
function App() {
const [phone, setPhone] = useState('');
return (
<PhoneInput
international
defaultCountry="JP"
value={phone}
onChange={setPhone}
/>
);
}
react-international-phone基本的なフォーマット機能はありますが、厳密な電話番号バリデーションは含まれていません。独自にバリデーションルールを追加する必要があります。
react-intl-tel-input(非推奨)内部でlibphonenumberを使用していましたが、非推奨のため信頼性に問題があります。
react-phone-input-2フォーマット表示は優れていますが、バリデーション機能は限定的です。isValid propで基本チェックは可能ですが、完全な国際標準準拠ではありません。
<PhoneInput
isValid={(value, country) => {
// カスタムバリデーションが必要
return value.length > 10;
}}
/>
react-phone-number-input最も正確なバリデーションを提供します。 libphonenumber-jsを使用しているため、各国の電話番号形式に厳密に従ったバリデーションが可能です。
import { isValidPhoneNumber } from 'react-phone-number-input';
// バリデーション例
if (isValidPhoneNumber(phone)) {
// 有効な電話番号
}
react-international-phoneCSS Modulesを使用しており、スタイルのカスタマイズが比較的容易です。クラス名を指定して独自のスタイルを適用できます。
<InternationalPhone
inputClassName="my-custom-input"
dropdownClassName="my-custom-dropdown"
/>
react-phone-input-2最も豊富なスタイルカスタマイズオプションを提供します。inputClass、buttonClass、dropdownClassなど、各要素に対して個別にクラスを指定できます。
react-phone-number-inputスタイルのカスタマイズは可能ですが、他のパッケージと比べるとオプションが少ないです。主にCSSで上書きする必要があります。
react-international-phone言語ファイルをインポートすることで多言語対応が可能です。
import { InternationalPhone } from 'react-international-phone';
import 'react-international-phone/locales/ja';
react-phone-input-2localization propで言語をカスタマイズできます。
<PhoneInput
localization={{ jp: '日本' }}
/>
react-phone-number-input国名の翻訳はreact-phone-number-input/localeからインポート可能ですが、設定がやや複雑です。
import ja from 'react-phone-number-input/locale/ja.json';
<PhoneInput
labels={ja}
/>
| パッケージ | メンテナンス状況 | バリデーション精度 | カスタマイズ性 | 学習コスト |
|---|---|---|---|---|
react-international-phone | アクティブ | 低~中 | 中 | 低 |
react-intl-tel-input | 非推奨 | 中 | 中 | 中 |
react-phone-input-2 | アクティブ | 低 | 高 | 中 |
react-phone-number-input | アクティブ | 高 | 低~中 | 中 |
正確な電話番号バリデーションが必要な場合 → react-phone-number-inputが最適です。金融サービスや認証システムなど、データの正確性が重要な場面で活躍します。
見た目の細かいカスタマイズが必要な場合 → react-phone-input-2が最適です。デザインシステムに完全に統合したい場合や、ブランドに合わせたUIが必要な場合に適しています。
シンプルで軽量な実装が欲しい場合 → react-international-phoneが最適です。基本的な電話番号入力機能だけで十分な場合や、最小限の依存関係を保ちたい場合に適しています。
react-intl-tel-inputは非推奨のため、新規プロジェクトでは絶対に使用しないでください。
react-international-phoneは、シンプルでモダンなAPIを求めるプロジェクトに最適です。軽量で使いやすく、基本的な国際電話番号入力機能だけで十分な場合に適しています。ただし、厳密な電話番号バリデーションが必要な場合は、追加の実装が必要になる点に注意してください。CSS Modulesによるスタイルカスタマイズも比較的容易で、中規模以下のアプリケーションでの採用に向いています。
react-intl-tel-inputは公式に非推奨(deprecated)とされています。npmページおよびGitHubリポジトリに明確な非推奨通知があるため、新規プロジェクトでの使用は絶対に避けてください。既存プロジェクトで使用している場合は、早急に代替ライブラリへの移行を検討すべきです。このパッケージはメンテナンスされておらず、セキュリティや互換性の問題が発生する可能性があります。
react-phone-input-2は、高度なカスタマイズ性を求めるプロジェクトに最適です。UIの各要素に対して詳細なスタイル制御が可能で、デザインシステムに完全に統合したい場合や、ブランドガイドラインに厳密に従った見た目にしたい場合に適しています。ただし、電話番号のバリデーション精度は高くないため、正確なバリデーションが必要な場合は追加の実装が必要になります。
react-phone-number-inputは、電話番号の正確なバリデーションとフォーマットを重視するプロジェクトに最適です。内部でlibphonenumber-jsを使用しており、各国の電話番号形式に厳密に従ったバリデーションが可能です。金融サービス、認証システム、顧客データ管理など、データの正確性が重要な場面で特に有効です。ただし、UIのカスタマイズ性は他のライブラリと比べてやや制限がある点に注意してください。
🤙 International phone input component for React

$ npm i react-international-phone
import { useState } from 'react';
import { PhoneInput } from 'react-international-phone';
import 'react-international-phone/style.css';
const App = () => {
const [phone, setPhone] = useState('');
return (
<div>
<PhoneInput
defaultCountry="ua"
value={phone}
onChange={(phone) => setPhone(phone)}
/>
</div>
);
};
Find the full API reference on official documentation.
You can encounter some breaking changes after update between major versions.
Checkout migration documents that contain a list of breaking changes and ways to migrate:
Update from v3 to v4
Update from v2 to v3
Update from v1 to v2