もうライブラリ不要? 標準APIで置き換えられるnpmパッケージ総まとめ (2026年版)
この記事では「有名ライブラリはあるが、標準で十分になった」領域を、ブラウザとNode.jsの両面から網羅的に整理する。対象はNode.js 24 LTS (Krypton)以降と、主要ブラウザで利用可能になったWeb APIとする。
TL;DR
- ブラウザでは
fetch・structuredClone・crypto.randomUUID()・URLSearchParams・Setメソッド・Iteratorヘルパー等が標準で使える。axiosやlodashの多くのユースケースは不要になった - Node.jsではグローバル
fetch・node:test・--watch・--env-file・fs.glob・util.styleText・--strip-typesがLTSで安定した。node-fetchやnodemon・dotenv・chalk・ts-nodeを代替できる - 「標準に寄せる」最大のメリットは依存数の削減によるサプライチェーンリスクの低減とバンドルサイズの削減。ただしインターセプター等、標準では難しい領域も残る
背景: axiosサプライチェーン攻撃と「標準に寄せる」意義
2026年3月31日、週間1億ダウンロードを超えるHTTPクライアントaxiosがサプライチェーン攻撃を受けた。北朝鮮に関連する脅威アクターがnpmアカウントを侵害し、悪意あるバージョン(1.14.1, 0.30.4)を公開。これらは偽の依存パッケージplain-crypto-jsを通じてクロスプラットフォームRAT(遠隔操作ツール)を自動インストールするものだった。axiosはクラウド環境の約80%に存在するとされ、影響範囲は甚大だった。
この事件が象徴するのは「標準で代替できるのにライブラリを使い続けるリスク」だ。fetchがブラウザとNode.jsの両方でグローバル利用可能になった今、単純なHTTPリクエストのためにaxiosを依存に含める必要性は薄い。依存が1つ減れば、攻撃対象面が1つ減る。
こうした背景のもと、JavaScript/TypeScriptのエコシステムは「標準に機能を取り込む」方向に動いている。
ブラウザ側では、主要4エンジン(Chrome, Firefox, Safari, Edge)で共通して動作するAPIが増えた。ECMAScript 2025ではSetメソッドやIteratorヘルパーが標準化され、2026年3月にはTemporalがStage 4に到達した。
Node.js側では、v18でグローバルfetchとnode:test、v20で--env-fileと--watchが追加された。v22でfs.globとutil.styleText、v24でTypeScript型ストリッピングとURLPatternのグローバル化が実現した。Node.js 24 LTSの時点で、開発時に必要だった多くのnpmパッケージが組み込み機能で代替できる。
この記事のスタンスは「標準で済むなら標準に寄せる」。依存を減らすことはバンドルサイズの削減やメンテナンスコストの低減だけでなく、サプライチェーン攻撃の対象面を直接的に減らす効果がある。
ブラウザ編
fetch: axiosの代替
MDN: Fetch API / Node.js: Global fetch
fetchは全ブラウザで標準利用可能であり、Node.js 18以降ではグローバルに利用可能(内部的にはundici)。axiosを使う主な理由だった「ブラウザ/Node両対応」は、もはや標準だけで成立する。
タイムアウトはAbortSignal.timeout() (MDN)で簡潔に書ける(2024年に主要ブラウザ対応済み)。
複数のシグナルを組み合わせたい場合はAbortSignal.any()(同じく2024年対応済み)を使う。
ただし、リクエスト/レスポンスのインターセプターや自動リトライ、進捗イベントはfetchにない。これらが必要ならaxiosか、より軽量なky(~2KB)を検討する。単純なAPI呼び出しならfetchで十分。
structuredClone: lodash.cloneDeep / deepmergeの代替
MDN: structuredClone() / Node.js: structuredClone()
structuredClone()は全ブラウザ・Node.js 17以降で標準利用可能。ディープコピーが1行で書ける。
ただし、関数やDOMノード、Errorオブジェクト、プロトタイプチェーンはコピーできない。クラスインスタンスのコピーにはlodashが引き続き必要。JSONシリアライズ可能なデータ構造であればstructuredCloneで十分。
crypto.randomUUID: uuidパッケージの代替
MDN: Crypto.randomUUID() / Node.js: crypto.randomUUID()
crypto.randomUUID()はv4 UUIDを生成する。ブラウザとNode.js 19以降で利用可能。
ただし、v4 UUID以外(v1, v5, v7等)が必要な場合はuuidパッケージが必要。v4だけなら標準で十分。
URLSearchParams: query-stringの代替
MDN: URLSearchParams / Node.js: URLSearchParams
URLSearchParamsは全ブラウザ・Node.jsで標準利用可能。
ただし、URLSearchParamsは配列値の扱いがquery-stringと異なる(foo=1&foo=2の場合、getAll("foo")を使う必要がある)。複雑なクエリ文字列の解析が必要でなければ標準で十分。
Object.groupBy / Map.groupBy: lodash.groupByの代替
Object.groupByはES2024で標準化され、主要ブラウザで利用可能になった。
キーにオブジェクトを使いたい場合はMap.groupByを使う。
Setメソッド: 手動実装やlodashの代替
ES2025でSetに数学的な集合演算メソッドが追加され、主要ブラウザで利用可能になった。
以前は[...a].filter(x => b.has(x))のような手動実装やlodashの_.intersectionが必要だったが、ネイティブで高速に動作する。
Iteratorヘルパー: lodash系チェーンの代替
ES2025のIteratorヘルパー(2025年3月に主要ブラウザ対応済み)で、遅延評価のチェーン処理が標準で書ける。
Iterator.from()でジェネレータや任意のiterableにも使える。大量データの処理で中間配列を作らないため、メモリ効率がよい。
Temporal: moment/dayjsの代替
MDN: Temporal / TC39: proposal-temporal
2026年3月にTC39 Stage 4に到達し、Chrome 144+とFirefox 139+でネイティブサポートされた。日付・時刻の不変(immutable)な操作が標準で可能になる。
ただし、SafariとEdgeではまだフラグ付きのため、プロダクションではpolyfill(temporal-polyfill)との併用を推奨する。ブラウザがネイティブ対応していればpolyfillはスキップされる。全ブラウザでの安定利用は2026年後半の見込み。
URLPattern: path-to-regexpの代替
MDN: URLPattern / Node.js: URLPattern
URLPatternは2025年9月に主要ブラウザで対応済み。Node.js 24ではグローバルに利用可能。
フレームワークなしでルーティングを実装する場合や、Service Worker内でのリクエストマッチングに有用。
Node.js編
グローバルfetch: node-fetchの代替
Node.js 18以降、fetchはグローバルに利用可能(内部的にundiciベース)。
node-fetchパッケージはもう不要。ただし、undici固有の高度な機能(接続プール制御、HTTP/2等)が必要な場合はimport { request } from "undici"を直接使う。
node:test: Jest/Mocha/Vitestの代替候補
Node.js 18以降で安定。ゼロ依存のテストランナーがnode:testで利用可能。
ライブラリやCLIツール、バックエンドのユニットテストに向いている。依存ゼロのためCI高速化やDockerイメージの軽量化に有効。ただし、スナップショットテストや豊富なマッチャー、UIモード、ブラウザテストが必要ならVitest/Jestに優位性がある。新規のNode.jsライブラリ開発ではnode:testを第一候補に検討する価値がある。
--watch: nodemonの代替
Node.js 18.11以降で--watchフラグが利用可能(Node.js 22+で安定)。
特定のパスだけを監視する場合は--watch-pathを使う。
ただし、.nodemonrcによる細かい設定(ignore, delay, ext指定等)が必要ならnodemonに優位性がある。シンプルな再起動だけなら--watchで十分。
--env-file: dotenvの代替
Node.js 20.6以降で--env-fileフラグが利用可能。
アプリケーションコードにdotenvのインポートが不要になり、package.jsonのスクリプトに書くだけでよい。
package.json
fs.glob: globパッケージの代替
fs.globとfs.promises.globはNode.js 22.0で追加され、22.17 LTSで安定した。
標準のfs.globはAsyncIterableを返すため、配列で欲しい場合はfor await...ofで収集する必要がある。globパッケージのようなoption(ignore等)のサポートは限定的だが、シンプルなパターンマッチなら標準で十分。
fs.rm: rimrafの代替
fs.rmは{ recursive: true, force: true }オプションでディレクトリの再帰削除ができる(Node.js 14.14以降)。
シェルスクリプトでも同様。
rimrafの存在意義だったWindows互換の再帰削除は、fs.rmで解決済み。
util.styleText: chalkの代替
util.styleTextはNode.js 20.12で追加され、22.17 LTSで安定した。
ただし、テンプレートリテラルでの複雑なスタイリングやカスタムテーマが必要ならchalkに優位性がある。単純な色付きログ出力ならutil.styleTextで十分。
TypeScript型ストリッピング: ts-node/tsxの代替
Node.js 22.6で--experimental-strip-typesとして導入され、Node.js 24 LTSでは.tsファイルに対してデフォルトで有効になった。
型注釈を除去するだけで、トランスパイルは行わない。enumやnamespace、コンストラクタのパラメータプロパティ(public x: number)等、JavaScriptコード生成が必要な構文はランタイムエラーになる。
ただし、enumやパスエイリアス(paths)を使っている場合、またはNode.js 22以前を対象とする場合はtsxが引き続き必要になる。新規プロジェクトではenumを避けてas constを使い、Node.js標準の型ストリッピングに対応する設計を推奨する。
まとめ
2026年現在、「標準で十分」な領域は着実に広がっている。以下の表で対応関係を整理する。
| 従来のライブラリ | 標準の代替 | 環境 |
|---|---|---|
| axios (単純なリクエスト) | fetch + AbortSignal.timeout() | Browser + Node 18+ |
| lodash.cloneDeep / deepmerge | structuredClone | Browser + Node 17+ |
| uuid (v4) | crypto.randomUUID() | Browser + Node 19+ |
| query-string | URLSearchParams | Browser + Node |
| lodash.groupBy | Object.groupBy | Browser + Node 21+ |
| Set手動操作 | Set.prototype.intersection等 | Browser + Node 22+ |
| lodashチェーン | Iteratorヘルパー | Browser + Node 22+ |
| moment / dayjs | Temporal | Chrome 144+, Firefox 139+ |
| path-to-regexp | URLPattern | Browser + Node 24+ |
| node-fetch | グローバルfetch | Node 18+ |
| nodemon | node --watch | Node 22+ |
| dotenv | node --env-file | Node 20.6+ |
| glob | fs.glob | Node 22+ |
| rimraf | fs.rm | Node 14.14+ |
| chalk | util.styleText | Node 22+ |
| ts-node / tsx | node --strip-types | Node 24+ |
| jest / mocha | node:test | Node 18+ |
各セクションで触れたとおり、標準APIには制約もある。ただし、依存を減らすことはセキュリティ・パフォーマンス・メンテナンスすべてに効く。新規プロジェクトではまず標準APIで書き始め、足りない場合にだけライブラリを足すアプローチを推奨する。