立即体验
v0.1.12 已发布

前端的 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 / CREATE TABLE / DROP TABLE / JOIN / GROUP BY / HAVING / DISTINCT。

🔗

Query Builder

链式 API + TypeScript 泛型支持。.select().where().innerJoin().orderBy().limit() — IDE 自动补全,类型安全。

🔒

事务支持

原子性操作,事务内任意步骤失败自动回滚。IndexedDB 引擎原生事务 + Memory 引擎模拟事务。

🧩

插件系统

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() 订阅表变更事件,emit() 触发通知。React useQuery / Vue useSqlarkQuery 开箱即用。

🏗 架构设计

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

  ┌─────────────────────────────────────────────────────┐
  │                  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 一样操作前端数据 — 或使用 Query Builder 链式 API

// 创建数据库 — 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 });
});

数字说话

MetonaSqlark 的核心指标

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