dexie vs idb vs localforage
Webストレージライブラリ
dexieidblocalforage類似パッケージ:

Webストレージライブラリ

Webストレージライブラリは、ブラウザ内でデータを効率的に保存、取得、管理するためのツールです。これらのライブラリは、IndexedDB APIをラップし、開発者がより簡単にデータベース操作を行えるようにします。これにより、オフラインアプリケーションやデータ駆動型のウェブアプリケーションの開発が容易になります。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
dexie014,1653.23 MB5899時間前Apache-2.0
idb07,29582.8 kB571年前ISC
localforage025,769-2495年前Apache-2.0

機能比較: dexie vs idb vs localforage

APIの使いやすさ

  • dexie:

    Dexieは、シンプルで直感的なAPIを提供し、複雑なクエリを簡単に実行できます。Promiseベースの設計により、非同期処理が容易で、エラーハンドリングも簡単です。

  • idb:

    IDBは、IndexedDBの低レベルAPIを直接使用するため、APIはやや複雑ですが、細かい制御が可能です。非同期処理はPromiseを使用して行いますが、より多くのコードを書く必要があります。

  • localforage:

    LocalForageは、シンプルなAPIを提供し、ストレージのバックエンドを意識せずにデータを保存できます。非同期処理はPromiseまたはコールバックで行え、使いやすさが特徴です。

データのクエリ機能

  • dexie:

    Dexieは、強力なクエリ機能を持ち、複雑な条件でデータを検索できます。フィルタリング、ソート、集計などの機能が充実しており、データ操作が容易です。

  • idb:

    IDBは、クエリ機能が限られており、基本的な検索は可能ですが、複雑なクエリを実行するには手動での実装が必要です。

  • localforage:

    LocalForageは、基本的なキーと値のストレージを提供しますが、複雑なクエリ機能はありません。単純なデータの保存と取得に最適です。

パフォーマンス

  • dexie:

    Dexieは、インデックスを使用してデータの検索を高速化し、大量のデータを扱うアプリケーションにおいて優れたパフォーマンスを発揮します。

  • idb:

    IDBは、IndexedDBのパフォーマンスを直接利用するため、適切に設計すれば高いパフォーマンスを得られますが、開発者の実装に依存します。

  • localforage:

    LocalForageは、バックエンドに依存するため、パフォーマンスは選択したストレージにより異なりますが、一般的には良好です。

TypeScriptサポート

  • dexie:

    Dexieは、TypeScriptでの使用を前提に設計されており、型安全性が高く、開発者が安心して利用できます。

  • idb:

    IDBは、TypeScriptのサポートがありますが、型定義が不完全な場合があるため、注意が必要です。

  • localforage:

    LocalForageは、TypeScriptのサポートがありますが、型定義がやや不完全で、開発者が補完する必要がある場合があります。

ストレージの互換性

  • dexie:

    Dexieは、IndexedDBを使用しているため、ほとんどのモダンブラウザで動作しますが、古いブラウザではサポートされていない場合があります。

  • idb:

    IDBは、IndexedDBの低レベルAPIを直接使用するため、ブラウザの互換性に依存しますが、モダンブラウザでは広くサポートされています。

  • localforage:

    LocalForageは、IndexedDB、WebSQL、LocalStorageのバックエンドをサポートしており、ブラウザの互換性を考慮した柔軟な選択肢を提供します。

選び方: dexie vs idb vs localforage

  • dexie:

    Dexieは、簡潔で強力なAPIを提供し、複雑なクエリを簡単に実行できるため、データベース操作が多いアプリケーションに適しています。また、TypeScriptのサポートが充実しているため、型安全性を重視するプロジェクトに向いています。

  • idb:

    IDBは、IndexedDBの低レベルAPIを直接使用するため、細かい制御が必要な場合に適しています。シンプルで軽量なライブラリを求める開発者に最適です。

  • localforage:

    LocalForageは、異なるストレージバックエンドを抽象化し、簡単なAPIで使用できるため、ストレージの選択に迷いたくない場合に適しています。特に、データの保存方法を気にせずに、簡単にデータを扱いたい場合に便利です。

dexie のREADME

Dexie.js

NPM Version Build Status Join our Discord

Dexie.js is a wrapper library for indexedDB - the standard database in the browser. https://dexie.org.

Why Dexie.js?

IndexedDB is the portable database for all browser engines. Dexie.js makes it fun and easy to work with.

But also:

  • Dexie.js is widely used by 100,000 of web sites, apps and other projects and supports all browsers, Electron for Desktop apps, Capacitor for iOS / Android apps and of course pure PWAs.
  • Dexie.js works around bugs in the IndexedDB implementations, giving a more stable user experience.
  • Need sync? Dexie Cloud adds real-time sync, auth, and collaboration on top of Dexie.js — no backend needed.

Hello World (vanilla JS)

<!DOCTYPE html>
<html>
  <head>
    <script type="module">
      // Import Dexie
      import { Dexie } from 'https://unpkg.com/dexie/dist/modern/dexie.mjs';

      //
      // Declare Database
      //
      const db = new Dexie('FriendDatabase');
      db.version(1).stores({
        friends: '++id, age'
      });

      //
      // Play with it
      //
      try {
        await db.friends.add({ name: 'Alice', age: 21 });

        const youngFriends = await db.friends
            .where('age')
            .below(30)
            .toArray();

        alert(`My young friends: ${JSON.stringify(youngFriends)}`);
      } catch (e) {
        alert(`Oops: ${e}`);
      }
    </script>
  </head>
</html>

Yes, it's that simple. Read the docs to get into the details.

Hello World (legacy script tags)

<!DOCTYPE html>
<html>
  <head>
    <script src="https://unpkg.com/dexie/dist/dexie.js"></script>
    <script>

      //
      // Declare Database
      //
      const db = new Dexie('FriendDatabase');
      db.version(1).stores({
        friends: '++id, age'
      });

      //
      // Play with it
      //
      db.friends.add({ name: 'Alice', age: 21 }).then(() => {
        return db.friends
          .where('age')
          .below(30)
          .toArray();
      }).then(youngFriends => {
        alert (`My young friends: ${JSON.stringify(youngFriends)}`);
      }).catch (e => {
        alert(`Oops: ${e}`);
      });

    </script>
  </head>
</html>

Hello World (React + Typescript)

Real-world apps are often built using components in various frameworks. Here's a version of Hello World written for React and Typescript. There are also links below this sample to more tutorials for different frameworks...

import React from 'react';
import { Dexie, type EntityTable } from 'dexie';
import { useLiveQuery } from 'dexie-react-hooks';

// Typing for your entities (hint is to move this to its own module)
export interface Friend {
  id: number;
  name: string;
  age: number;
}

// Database declaration (move this to its own module also)
export const db = new Dexie('FriendDatabase') as Dexie & {
  friends: EntityTable<Friend, 'id'>;
};
db.version(1).stores({
  friends: '++id, age',
});

// Component:
export function MyDexieReactComponent() {
  const youngFriends = useLiveQuery(() =>
    db.friends
      .where('age')
      .below(30)
      .toArray()
  );

  return (
    <>
      <h3>My young friends</h3>
      <ul>
        {youngFriends?.map((f) => (
          <li key={f.id}>
            Name: {f.name}, Age: {f.age}
          </li>
        ))}
      </ul>
      <button
        onClick={() => {
          db.friends.add({ name: 'Alice', age: 21 });
        }}
      >
        Add another friend
      </button>
    </>
  );
}

Tutorials for React, Svelte, Vue, Angular and vanilla JS

API Reference

Samples

Performance

Dexie has kick-ass performance. Its bulk methods take advantage of a lesser-known feature in IndexedDB that makes it possible to store stuff without listening to every onsuccess event. This speeds up the performance to a maximum.

Supported operations

above(key): Collection;
aboveOrEqual(key): Collection;
add(item, key?): Promise;
and(filter: (x) => boolean): Collection;
anyOf(keys[]): Collection;
anyOfIgnoreCase(keys: string[]): Collection;
below(key): Collection;
belowOrEqual(key): Collection;
between(lower, upper, includeLower?, includeUpper?): Collection;
bulkAdd(items: Array): Promise;
bulkDelete(keys: Array): Promise;
bulkPut(items: Array): Promise;
clear(): Promise;
count(): Promise;
delete(key): Promise;
distinct(): Collection;
each(callback: (obj) => any): Promise;
eachKey(callback: (key) => any): Promise;
eachPrimaryKey(callback: (key) => any): Promise;
eachUniqueKey(callback: (key) => any): Promise;
equals(key): Collection;
equalsIgnoreCase(key): Collection;
filter(fn: (obj) => boolean): Collection;
first(): Promise;
get(key): Promise;
inAnyRange(ranges): Collection;
keys(): Promise;
last(): Promise;
limit(n: number): Collection;
modify(changeCallback: (obj: T, ctx:{value: T}) => void): Promise;
modify(changes: { [keyPath: string]: any } ): Promise;
noneOf(keys: Array): Collection;
notEqual(key): Collection;
offset(n: number): Collection;
or(indexOrPrimayKey: string): WhereClause;
orderBy(index: string): Collection;
primaryKeys(): Promise;
put(item: T, key?: Key): Promise;
reverse(): Collection;
sortBy(keyPath: string): Promise;
startsWith(key: string): Collection;
startsWithAnyOf(prefixes: string[]): Collection;
startsWithAnyOfIgnoreCase(prefixes: string[]): Collection;
startsWithIgnoreCase(key: string): Collection;
toArray(): Promise;
toCollection(): Collection;
uniqueKeys(): Promise;
until(filter: (value) => boolean, includeStopEntry?: boolean): Collection;
update(key: Key, changes: { [keyPath: string]: any }): Promise;

This is a mix of methods from WhereClause, Table and Collection. Dive into the API reference to see the details.

Dexie Cloud

Dexie Cloud is the easiest way to add sync, authentication, and real-time collaboration to your Dexie app. You keep writing frontend code with Dexie.js — Dexie Cloud handles the rest.

What you get:

  • 🔄 Sync across devices — changes propagate in real time, no polling needed
  • 🔐 Authentication — built-in user auth, no identity provider required
  • 🛡️ Access control — share data between users with fine-grained permissions
  • 📁 File & blob storage — store attachments alongside your structured data
  • ✈️ Offline-first — works fully offline, syncs when back online

Getting started is just a few lines:

npm install dexie-cloud-addon
import Dexie from 'dexie';
import dexieCloud from 'dexie-cloud-addon';

const db = new Dexie('MyDatabase', { addons: [dexieCloud] });
db.version(1).stores({ items: '@id, title' });
db.cloud.configure({ databaseUrl: 'https://<your-db>.dexie.cloud' });

That's it. Your existing Dexie app now syncs. Hosted cloud or self-hosted on your own infrastructure. 👋

Quickstart guide

Sample app:

Source: Dexie Cloud To-do app

Live demo: https://dexie.github.io/Dexie.js/dexie-cloud-todo-app/

Samples

https://dexie.org/docs/Samples

https://github.com/dexie/Dexie.js/tree/master/samples

Knowledge Base

https://dexie.org/docs/Questions-and-Answers

Website

https://dexie.org

Install via npm

npm install dexie

Download

For those who don't like package managers, here's the download links:

UMD (for legacy script includes as well as commonjs require):

https://unpkg.com/dexie@latest/dist/dexie.min.js

https://unpkg.com/dexie@latest/dist/dexie.min.js.map

Modern (ES module):

https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs

https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs.map

Typings:

https://unpkg.com/dexie@latest/dist/dexie.d.ts

Contributing

See CONTRIBUTING.md

Build

pnpm install
pnpm run build

Test

pnpm test

Watch

pnpm run watch

Browser testing via
TestMu AI (Formerly LambdaTest)