countries-list、country-code-lookup、country-data、country-list、i18n-iso-countries、iso-3166-1-alpha-2 は、すべて国名、国コード、関連データを提供する npm パッケージですが、それぞれ設計思想と機能範囲が異なります。i18n-iso-countries は多言語対応に強く、ISO 標準に準拠しています。countries-list と country-list は軽量なデータ提供に特化しています。country-code-lookup はコード変換に焦点を当てています。country-data は豊富なメタデータを含みますが、メンテナンス状況に注意が必要です。iso-3166-1-alpha-2 は特定の ISO コード形式に特化しています。
フロントエンド開発で国別データ(国名、コード、通貨、言語など)を扱う際、どの npm パッケージを選ぶべきか迷うことはよくあります。countries-list、country-code-lookup、country-data、country-list、i18n-iso-countries、iso-3166-1-alpha-2 の 6 パッケージは、それぞれ異なる設計思想と機能範囲を持っています。本稿では、実務的な観点から各パッケージを深く比較します。
各パッケージはデータの提供方法が異なります。これがコードの書き方とバンドルサイズに直接影響します。
countries-list はオブジェクト形式で国データをエクスポートします。
import { countries } from 'countries-list';
// 全国家リストの取得
Object.values(countries).forEach(country => {
console.log(country.name, country.iso2, country.currency);
});
// 特定国の取得
console.log(countries.JP); // { name: 'Japan', iso2: 'JP', ... }
country-code-lookup は検索関数を中心に設計されています。
const countryLookup = require('country-code-lookup');
// ISO コードから国名
console.log(countryLookup.byIso('JP').country);
// 国名からコード
console.log(countryLookup.byCountry('Japan').iso2);
// 電話コードから国
console.log(countryLookup.byPhone('81').country);
country-data は豊富なメタデータを含む配列形式です。
const countries = require('country-data').countries;
// 配列としてイテレーション
countries.forEach(country => {
console.log(country.name, country.currencies, country.languages);
});
// 特定国の検索
const japan = countries.filter(c => c.alpha2 === 'JP')[0];
country-list はシンプルな配列形式を提供します。
const countries = require('country-list');
// 全国家リスト
console.log(countries.getCodes()); // ['AF', 'AL', ...]
console.log(countries.getName('JP')); // 'Japan'
console.log(countries.getCode('Japan')); // 'JP'
i18n-iso-countries は多言語対応の API を提供します。
const countries = require('i18n-iso-countries');
const ja = require('i18n-iso-countries/langs/ja.json');
countries.registerLocale(ja);
// 日本語で国名取得
console.log(countries.getName('JP', 'ja')); // '日本'
// 全国家リスト(日本語)
console.log(countries.getNames('ja')); // { JP: '日本', US: 'アメリカ合衆国', ... }
iso-3166-1-alpha-2 は 2 文字コードに特化しています。
const alpha2 = require('iso-3166-1-alpha-2');
// コード検証
console.log(alpha2.getCodes()); // ['AF', 'AL', ...]
console.log(alpha2.getCode('Japan')); // 'JP'
console.log(alpha2.getName('JP')); // 'Japan'
国際化アプリケーションでは、この違いが最も重要になります。
i18n-iso-countries が圧倒的に優れています。50 言語以上の翻訳データを含み、言語ごとに登録して切り替え可能です。
const countries = require('i18n-iso-countries');
const ja = require('i18n-iso-countries/langs/ja.json');
const en = require('i18n-iso-countries/langs/en.json');
const zh = require('i18n-iso-countries/langs/zh.json');
countries.registerLocale(ja);
countries.registerLocale(en);
countries.registerLocale(zh);
// 言語切り替え
console.log(countries.getName('FR', 'ja')); // 'フランス'
console.log(countries.getName('FR', 'en')); // 'France'
console.log(countries.getName('FR', 'zh')); // '法国'
countries-list は英語ベースですが、一部の国に現地語名を含みます。
import { countries } from 'countries-list';
console.log(countries.JP.name); // 'Japan'
console.log(countries.JP.native); // '日本'(一部国のみ)
country-code-lookup、country-data、country-list、iso-3166-1-alpha-2 は多言語対応が限定的または英語のみの場合が多く、国際化プロジェクトでは追加の実装が必要になります。
パッケージのメンテナンス状況は長期プロジェクトで重要な要素です。
country-data は 2018 年以降、大きな更新が確認されていません。npm ページや GitHub リポジトリで非推奨の明示はありませんが、アクティブなメンテナンスは確認できません。新しいプロジェクトでの採用は避けるべきです。
// ⚠️ 新規プロジェクトでは非推奨
const countries = require('country-data').countries;
// 代替: i18n-iso-countries または countries-list を検討
i18n-iso-countries はアクティブにメンテナンスされており、ISO 標準の更新にも追従しています。長期使用に最も安心できます。
countries-list、country-list、country-code-lookup、iso-3166-1-alpha-2 は比較的安定していますが、更新頻度はパッケージにより異なります。採用前に最新の npm ページと GitHub リポジトリを確認しましょう。
国コード、国名、電話コードなど、様々な形式での検索が必要になる場面があります。
country-code-lookup は検索機能に最も特化しています。
const countryLookup = require('country-code-lookup');
// ISO 2 文字コード
console.log(countryLookup.byIso('JP'));
// ISO 3 文字コード
console.log(countryLookup.byIso('JPN'));
// 国名(部分一致も可能)
console.log(countryLookup.byCountry('United'));
// 電話コード
console.log(countryLookup.byPhone('81'));
// 通貨コード
console.log(countryLookup.byCurrency('JPY'));
i18n-iso-countries はコード変換機能を提供します。
const countries = require('i18n-iso-countries');
// alpha-2 から alpha-3
console.log(countries.alpha2ToAlpha3('JP')); // 'JPN'
// alpha-3 から alpha-2
console.log(countries.alpha3ToAlpha2('JPN')); // 'JP'
// 数字コードから alpha-2
console.log(countries.numericToAlpha2('392')); // 'JP'
countries-list、country-list、iso-3166-1-alpha-2 は基本的なコード変換のみ対応し、電話コードや通貨コードでの検索はサポートされていません。
country-data は豊富なデータを含みますが、検索機能は自前で実装する必要があります。
国に関連する追加データが必要な場合、パッケージの選択が重要になります。
country-data が最も豊富なメタデータを含みます。
const countries = require('country-data').countries;
const japan = countries.filter(c => c.alpha2 === 'JP')[0];
console.log(japan.currencies); // [{ code: 'JPY', name: 'Yen' }]
console.log(japan.languages); // ['ja']
console.log(japan.topLevelDomain); // ['.jp']
console.log(japan.region); // 'Asia'
countries-list も通貨情報を含みます。
import { countries } from 'countries-list';
console.log(countries.JP.currency); // 'JPY'
console.log(countries.JP.languages); // ['ja']
console.log(countries.JP.continent); // 'AS'
i18n-iso-countries は通貨コードの変換を提供しますが、通貨名などの詳細データは含みません。
const countries = require('i18n-iso-countries');
// 通貨コード取得(一部バージョン)
console.log(countries.getAlpha2Code('Japan', 'en')); // 'JP'
country-code-lookup は通貨コードでの検索は可能ですが、通貨の詳細データは限定的です。
country-list、iso-3166-1-alpha-2 は国名とコードのみに焦点を当て、通貨や言語データは含みません。
✅ 推奨: i18n-iso-countries
理由:50 言語以上の対応、ISO 標準準拠、アクティブなメンテナンス。
const countries = require('i18n-iso-countries');
const ja = require('i18n-iso-countries/langs/ja.json');
const en = require('i18n-iso-countries/langs/en.json');
countries.registerLocale(ja);
countries.registerLocale(en);
// ユーザーの言語設定に応じて表示切り替え
function getCountryName(code, userLang) {
return countries.getName(code, userLang) || countries.getName(code, 'en');
}
✅ 推奨: country-list または countries-list
理由:軽量、シンプルな API、十分な機能。
const countries = require('country-list');
// React コンポーネント例
function CountrySelect({ value, onChange }) {
return (
<select value={value} onChange={onChange}>
{countries.getCodes().map(code => (
<option key={code} value={code}>
{countries.getName(code)}
</option>
))}
</select>
);
}
✅ 推奨: country-code-lookup
理由:多様な検索方法、コード変換に特化。
const countryLookup = require('country-code-lookup');
function validateAndNormalize(input) {
// 様々な形式の入力を正規化
const result = countryLookup.byIso(input) ||
countryLookup.byCountry(input) ||
countryLookup.byPhone(input);
return result ? result.iso2 : null;
}
⚠️ 注意: country-data 使用の場合は移行を検討
理由:メンテナンス停滞のリスク。
// 既存コード
const countries = require('country-data').countries;
// 移行先例(i18n-iso-countries)
const countries = require('i18n-iso-countries');
// API の違いに注意してリファクタリングが必要
| 機能 | countries-list | country-code-lookup | country-data | country-list | i18n-iso-countries | iso-3166-1-alpha-2 |
|---|---|---|---|---|---|---|
| 多言語対応 | 限定的 | 英語中心 | 英語中心 | 英語中心 | ✅ 50+ 言語 | 英語中心 |
| 通貨データ | ✅ | 検索のみ | ✅ 詳細 | ❌ | 限定的 | ❌ |
| 言語データ | ✅ | ❌ | ✅ 詳細 | ❌ | ❌ | ❌ |
| 電話コード検索 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| コード変換 | 基本 | ✅ 多様 | 自前実装 | 基本 | ✅ ISO 間 | 基本 |
| 保守状況 | 安定 | 安定 | ⚠️ 停滞 | 安定 | ✅ アクティブ | 安定 |
| バンドルサイズ | 小 | 小 | 中 | 最小 | 中(言語別) | 最小 |
パッケージ選択は、プロジェクトの要件と長期運用計画に基づいて行うべきです。
i18n-iso-countries を選ぶべき場合:
countries-list を選ぶべき場合:
country-code-lookup を選ぶべき場合:
country-list を選ぶべき場合:
country-data の扱い:
i18n-iso-countries または countries-listiso-3166-1-alpha-2 を選ぶべき場合:
6 パッケージ各有り一長一短がありますが、現代のフロントエンド開発では i18n-iso-countries が最もバランスの取れた選択と言えます。多言語対応、ISO 標準準拠、アクティブなメンテナンス、これら 3 つの要素が揃っているためです。
ただし、プロジェクトの要件によっては軽量な countries-list や country-list が適している場合もあります。バンドルサイズ、機能要件、保守計画を総合的に評価して選択しましょう。
最も重要なのは、パッケージのメンテナンス状況を確認し、長期運用を見据えた選択を行うことです。npm ページ、GitHub リポジトリ、最新のリリースノートを定期的にチェックする習慣をつけましょう。
countries-list を選ぶべきなのは、軽量でシンプルな国データが必要な場合です。国名、コード、通貨などの基本情報を含み、バンドルサイズを気にするプロジェクトに適しています。多言語対応は限定的ですが、英語ベースのアプリケーションでは十分機能します。大規模な i18n 要件がない場合に最適です。
country-code-lookup を選ぶべきなのは、国コードの変換と検索に特化した機能が必要な場合です。ISO コード間の相互変換、国名からのコード検索などが得意です。コード検証ロジックを自作したくないプロジェクトで価値を発揮します。ただし、豊富な国メタデータは期待できません。
country-data を選ぶべきなのは、国の通貨、言語、地域区分など豊富なメタデータが必要な場合です。ただし、メンテナンスが停滞している可能性があり、新しいプロジェクトでの採用は慎重に検討すべきです。既存プロジェクトで既に使用している場合は移行コストを考慮しましょう。
country-list を選ぶべきなのは、最小限の国名とコードリストが必要な場合です。非常に軽量で、ドロップダウン選択などのシンプルな UI 要件に適しています。機能は限定的ですが、その分理解しやすく、カスタマイズ也容易です。大規模なデータ要件には向きません。
i18n-iso-countries を選ぶべきなのは、多言語対応が必須のプロジェクトです。50 言語以上の翻訳をサポートし、ISO 3166 標準に完全に準拠しています。国際化アプリケーション、e コマース、SaaS プロダクトに最適です。アクティブにメンテナンスされており、長期使用に安心できます。
iso-3166-1-alpha-2 を選ぶべきなのは、ISO 3166-1 alpha-2 コード(2 文字コード)のみに焦点を当てたい場合です。特定形式のコード検証や変換が必要なプロジェクトで有用です。機能範囲は狭いですが、その分軽量で目的が明確です。包括的な国データが必要な場合は他パッケージを検討しましょう。
Continents & countries: ISO 3166-1 alpha-2 code (with alpha-2 to alpha-3 set), name, ISO 639-1 languages, capital and ISO 4217 currency codes, native name, calling codes. Lists are available in JSON, CSV and SQL formats. Also, contains separate JSON files with additional country Emoji flags data.
Version 3 comes with some data structure changes. It was completely reworked under the hood with TypeScript, ESM exports and Turborepo file structure.
Everything is strongly typed so you can easily use data with auto-complete in your IDE.
Note: If your projects depend on the old structure, carefully specify required versions in your dependencies.
Package is available via:
bun add countries-listnpm install countries-listcomposer require annexare/countries-listModule exports continents, countries, languages and utility functions.
// Interfaces and types
import type {
ICountry,
ICountryData,
ILanguage,
TContinentCode,
TCountryCode,
TLanguageCode,
} from 'countries-list'
// Main data and utils
import { continents, countries, languages } from 'countries-list'
// Utils
import { getCountryCode, getCountryData, getCountryDataList, getEmojiFlag } from 'countries-list'
// Minimal data in JSON
import countries2to3 from 'countries-list/minimal/countries.2to3.min.json'
import countries3to2 from 'countries-list/minimal/countries.3to2.min.json'
import languageNames from 'countries-list/minimal/languages.native.min'
getCountryCode('Ukraine') // 'UA'
getCountryCode('Україна') // 'UA'
getCountryData('UA') // ICountryData
Built files are in the dist directory of this repository, and packages/countries directory contains source data.
Note: JS build contains ES modules, CommonJS and IIFE (for now)
cjs/index.jsmjs/index.jsindex.iife.jsconst continents = {
AF: 'Africa',
AN: 'Antarctica',
AS: 'Asia',
EU: 'Europe',
NA: 'North America',
OC: 'Oceania',
SA: 'South America',
}
const countries = {
// ...
UA: {
name: 'Ukraine',
native: 'Україна',
phone: [380],
continent: 'EU',
capital: 'Kyiv',
currency: ['UAH'],
languages: ['uk'],
},
// ...
}
const languages = {
// ...
uk: {
name: 'Ukrainian',
native: 'Українська',
},
ur: {
name: 'Urdu',
native: 'اردو',
rtl: 1,
},
// ...
}
Everything is generated from strongly typed files in packages/countries/src, including SQL file.
Everything in dist is generated,
so please make data related changes ONLY to files from packages/countries, commit them.
Use bun run build (or turbo build, turbo test) command to build/test generated files.
Prepared by Annexare Studio from different public sources. Feel free to use it as you need in your apps or send updates into this public repository. It's under MIT license.