立即体验
v0.1.14 已发布 — 生产加固:事务原子性 · 多标签页感知 · 幂等 init

前端的 SQL 数据库

TypeScript 原生构建,内存与磁盘双模式,支持完整 SQL 查询。
零运行时依赖,开箱即用。

📦 安装引入

多种方式,按需选择

📦

npm (Gitea Registry)

# 配置 registry npm config set @metona-team:registry https://git.metona.cn/api/packages/MetonaTeam/npm/ # 安装 npm install @metona-team/metona-sqlark
🌐

CDN / Browser UMD

<!-- 直接引用 dist 产物 --> <script src="metona-sqlark.min.js"></script> <script> const db = await window.MetonaSqlark.create({...}); // 或 window.MeSqlark(别名) </script>

ESM / TypeScript

import { MetonaSqlark, MeSqlark } from '@metona-team/metona-sqlark'; const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid', });
🔧

CommonJS

const { MetonaSqlark } = require('@metona-team/metona-sqlark'); (async () => { const db = await MetonaSqlark.create({...}); })();

为什么选择 MetonaSqlark

专为前端打造的数据库引擎

🧠

双模式存储

Memory(内存)保证极致速度,Disk(IndexedDB / OPFS)提供持久化。Hybrid 模式 write-through 策略,读写均在微秒级完成。

完整 SQL 解析器

手写递归下降 SQL 解析器。SELECT / INSERT / UPDATE / DELETE / JOIN / GROUP BY / HAVING / DISTINCT / 子查询。

🔒

事务回滚 NEW

beginTransaction / commitTransaction / rollbackTransaction 三件套。失败自动回滚,Memory 快照 + IndexedDB 延迟写入。

🔍

子查询 NEW

IN (SELECT ...) + 标量子查询。递归执行,自动将子查询结果替换为具体值。

🔗

外键级联 NEW

references + ON DELETE CASCADE / SET NULL / RESTRICT。递归级联删除,自动维护引用完整性。

🏊

连接池 NEW

MetonaSqlark.connect() 单例复用,引用计数管理。避免重复打开 IndexedDB,自动释放资源。

🧩

插件系统

14 种生命周期钩子:beforeCreateTable / afterInsert / beforeQuery / afterTransaction……按优先级注册。

📦

零运行时依赖

纯 TypeScript 实现,不依赖任何第三方库。Tree-shakable,UMD/ESM/CJS 多格式输出,~10KB gzip。

📊

聚合 & 分组

COUNT / SUM / AVG / MIN / MAX 五大聚合函数,GROUP BY + HAVING 子句,DISTINCT 去重。

🔄

数据迁移

内置版本迁移系统,addMigration + migrateTo API。导入导出支持单表/全库 JSON 序列化。

📡

发布订阅 + 框架集成

subscribe() 订阅表变更。React useQuery / Vue useSqlarkQuery 开箱即用。

🔗

Query Builder

链式 API + TypeScript 泛型。.select().where().innerJoin().orderBy().limit() — 类型安全,IDE 友好。

🏗 架构设计

清晰的分层结构,各模块职责单一

  ┌─────────────────────────────────────────────────────┐
  │                  MetonaSqlark / MeSqlark                  │
  │              create() · query() · table() · tx()     │
  ├──────────┬──────────┬──────────┬──────────┬─────────┤
  │ SQL ParserQueryBuilderTransactionPluginMigration │
  │ Lexer →   │ .select() │ Manager  │ Manager  │ System  │
  │ Parser    │ .where()  │          │ 14 hooks │         │
  ├──────────┴──────────┴──────────┴──────────┴─────────┤
  │              QueryExecutor (AST → Results)               │
  │         JOIN · GROUP BY · HAVING · DISTINCT          │
  ├─────────────────────────────────────────────────────┤
  │              IStorageEngine Interface                   │
  ├──────────┬──────────┬──────────┬───────────────────┤
  │ Memory    IndexedDB OPFS     Hybrid            │
  │ Engine   │ Engine   │ Engine   │ Engine            │
  │ (Map)    │ (IDB)    │ (File)   │ (Write-through)   │
  └──────────┴──────────┴──────────┴───────────────────┘

5 行代码开始

像写 SQL 一样操作前端数据 — v0.1.13 新增子查询、外键级联、事务回滚

// 创建数据库 — MeSqlark 是别名,完全等价
const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });

// 定义表结构 — 支持外键级联
await db.defineTable('users', {
  id: { type: 'string', primaryKey: true },
  name: { type: 'string', required: true },
  age: { type: 'number', default: 0 },
  email: { type: 'string', unique: true, index: true },
});

// SQL 查询
await db.query("INSERT INTO users VALUES ('1', 'Alice', 30, 'alice@demo.com')");
const rows = await db.query('SELECT * FROM users WHERE age > 18 ORDER BY name');

// Query Builder — 类型安全,链式调用
const rows2 = await db.table('users')
  .select(['name', 'age']).where({ age: { $gt: 18 } })
  .orderBy('name').limit(10).execute();

// JOIN 多表关联
await db.query(`SELECT u.name, o.product, o.amount
  FROM users u INNER JOIN orders o ON u.id = o.user_id
  WHERE o.amount > 100`);

// GROUP BY 聚合分析
await db.query(`SELECT dept, COUNT(*) as cnt, AVG(salary) as avg
  FROM employees GROUP BY dept HAVING COUNT(*) > 1`);

// 事务 — 失败自动回滚
await db.transaction(async (trx) => {
  await trx.table('users').insert({ id: '3', name: 'Charlie' });
  await trx.table('orders').insert({ id: 'o1', userId: '3', amount: 99 });
  // 任何一步失败 → 自动回滚
});

// 子查询 — IN (SELECT ...)
await db.query(`SELECT * FROM users
  WHERE id IN (SELECT user_id FROM orders WHERE amount > 100)`);

// 连接池 — 单例复用,避免重复打开 IndexedDB
const db1 = await MetonaSqlark.connect({ name: 'my-app' });
const db2 = await MetonaSqlark.connect({ name: 'my-app' });
// db1 === db2(复用已有实例)
await db2.disconnect(); // 引用计数 -1,归零时自动 close

数字说话

MetonaSqlark 的核心指标

264+
测试用例
93.5%
代码覆盖率
~10KB
gzip 体积
4
存储引擎
29
SQL 关键字
15
测试套件