feat: MetonaSqlark v0.1.12 — 前端TypeScript关系型数据库
- 4种存储引擎:Memory / IndexedDB / OPFS / Hybrid - 完整SQL:SELECT/INSERT/UPDATE/DELETE/JOIN/GROUP BY/HAVING/DISTINCT - Query Builder链式API + TypeScript泛型 - 聚合/事务/插件/发布订阅/迁移/导入导出 - React/Vue集成,264测试,93.46%覆盖率,零运行时依赖
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# metona-sqlark
|
||||
# MetonaSqlark
|
||||
|
||||
<p align="center">
|
||||
<img src="https://img.shields.io/badge/version-0.1.12-blue?style=flat-square" alt="version">
|
||||
@@ -11,35 +11,74 @@
|
||||
|
||||
---
|
||||
|
||||
## ✨ 核心特性
|
||||
|
||||
- 🧠 **双模式存储** — Memory / Disk / Hybrid,内存极速 + 磁盘持久化
|
||||
- ⚡ **完整 SQL** — SELECT / INSERT / UPDATE / DELETE / JOIN / GROUP BY / HAVING / DISTINCT
|
||||
- 🔗 **Query Builder** — 链式 API,TypeScript 类型友好
|
||||
- 📊 **聚合函数** — COUNT / SUM / AVG / MIN / MAX
|
||||
- 🔒 **事务支持** — 原子性操作,失败自动回滚
|
||||
- 🧩 **插件系统** — 14 种生命周期钩子
|
||||
- 📡 **发布订阅** — 表级变更监听
|
||||
- 🔄 **数据迁移** — 版本化 migration 系统
|
||||
- 📤 **导入导出** — JSON 格式全库/单表导入导出
|
||||
- ⚛️ **React / Vue** — 原生 hooks & composables
|
||||
- 📦 **零运行时依赖** — 纯 TypeScript,约 42KB min+gzip
|
||||
|
||||
---
|
||||
|
||||
## 📦 安装
|
||||
|
||||
```bash
|
||||
npm install @metona-team/metona-sqlark
|
||||
```
|
||||
|
||||
```typescript
|
||||
// ESM / TypeScript
|
||||
import { MetonaSqlark, MeSqlark } from '@metona-team/metona-sqlark';
|
||||
> 如果提示找不到包,先配置 scope registry(一次性):
|
||||
> ```bash
|
||||
> npm config set @metona-team:registry https://git.metona.cn/api/packages/MetonaTeam/npm/
|
||||
> ```
|
||||
|
||||
// Browser UMD
|
||||
### CDN / 直接下载
|
||||
|
||||
```html
|
||||
<!-- UMD 格式,暴露 window.MetonaSqlark 和 window.MeSqlark -->
|
||||
<script src="https://git.metona.cn/MetonaTeam/MetonaSqlark/raw/branch/master/dist/metona-sqlark.min.js"></script>
|
||||
```
|
||||
|
||||
或从 [`dist/`](./dist/) 目录下载:
|
||||
- `metona-sqlark.js` — UMD 开发版(含 sourcemap)
|
||||
- `metona-sqlark.min.js` — UMD 压缩版(~42KB)
|
||||
- `metona-sqlark.esm.js` — ES Module
|
||||
- `metona-sqlark.cjs.js` — CommonJS
|
||||
- `metona-sqlark.d.ts` — TypeScript 类型声明
|
||||
|
||||
---
|
||||
|
||||
## 🚀 引入方式
|
||||
|
||||
### ESM / TypeScript
|
||||
|
||||
```typescript
|
||||
import { MetonaSqlark } from '@metona-team/metona-sqlark';
|
||||
// 别名
|
||||
import { MeSqlark } from '@metona-team/metona-sqlark';
|
||||
|
||||
const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });
|
||||
```
|
||||
|
||||
### CommonJS
|
||||
|
||||
```javascript
|
||||
const { MetonaSqlark } = require('@metona-team/metona-sqlark');
|
||||
|
||||
(async () => {
|
||||
const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });
|
||||
})();
|
||||
```
|
||||
|
||||
### Browser UMD
|
||||
|
||||
```html
|
||||
<script src="metona-sqlark.min.js"></script>
|
||||
// → window.MetonaSqlark / window.MeSqlark
|
||||
<script>
|
||||
(async () => {
|
||||
const db = await window.MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });
|
||||
// 或 window.MeSqlark(完全等价)
|
||||
})();
|
||||
</script>
|
||||
```
|
||||
|
||||
### ES Module in Browser
|
||||
|
||||
```html
|
||||
<script type="module">
|
||||
import { MetonaSqlark } from './metona-sqlark.esm.js';
|
||||
const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });
|
||||
</script>
|
||||
```
|
||||
|
||||
---
|
||||
@@ -49,11 +88,10 @@ import { MetonaSqlark, MeSqlark } from '@metona-team/metona-sqlark';
|
||||
```typescript
|
||||
import { MetonaSqlark } from '@metona-team/metona-sqlark';
|
||||
|
||||
// 创建数据库
|
||||
const db = await MetonaSqlark.create({
|
||||
name: 'my-app',
|
||||
mode: 'hybrid',
|
||||
diskEngine: 'indexeddb',
|
||||
mode: 'hybrid', // 'memory' | 'disk' | 'hybrid'
|
||||
diskEngine: 'indexeddb', // 'indexeddb' | 'opfs'
|
||||
});
|
||||
|
||||
// 定义表
|
||||
@@ -69,9 +107,12 @@ 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 users = db.table('users');
|
||||
await users.insert({ id: '2', name: 'Bob', age: 25, email: 'bob@demo.com' });
|
||||
const result = await users.select().where({ age: { $gt: 18 } }).orderBy('age', 'desc').execute();
|
||||
const result = await db.table('users')
|
||||
.select(['name', 'age'])
|
||||
.where({ age: { $gt: 18 } })
|
||||
.orderBy('age', 'desc')
|
||||
.limit(10)
|
||||
.execute();
|
||||
|
||||
// JOIN
|
||||
await db.query(`SELECT u.name, o.product FROM users u INNER JOIN orders o ON u.id = o.user_id`);
|
||||
@@ -116,7 +157,8 @@ await db.transaction(async (trx) => {
|
||||
| `db.table(name)` | 获取表操作对象 |
|
||||
| `db.defineTable(name, cols)` | 定义表结构 |
|
||||
| `db.transaction(fn)` | 执行事务 |
|
||||
| `db.exportTable(name)` / `db.exportAll()` | 导出数据 |
|
||||
| `db.exportTable(name)` / `db.exportAll()` | 导出数据 JSON |
|
||||
| `db.importTable(name, data)` | 导入数据 |
|
||||
| `db.addMigration(v, fn)` / `db.migrateTo(v)` | 数据迁移 |
|
||||
| `db.subscribe(table, fn)` | 订阅表变更 |
|
||||
| `db.on(hook, fn)` | 注册钩子 |
|
||||
@@ -135,6 +177,19 @@ const { data, loading, refresh } = useSqlarkQuery(db, 'SELECT * FROM users');
|
||||
|
||||
---
|
||||
|
||||
## 🛠 开发
|
||||
|
||||
```bash
|
||||
npm install # 安装依赖
|
||||
npm run dev # 开发模式(localhost:3001)
|
||||
npm run build # 生产构建(生成 dist/)
|
||||
npm test # 运行测试
|
||||
npm run lint # 代码检查
|
||||
npm run typecheck # 类型检查
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 项目状态
|
||||
|
||||
| 指标 | 数值 |
|
||||
@@ -147,19 +202,6 @@ const { data, loading, refresh } = useSqlarkQuery(db, 'SELECT * FROM users');
|
||||
|
||||
---
|
||||
|
||||
## 🛠 开发
|
||||
|
||||
```bash
|
||||
npm install # 安装依赖
|
||||
npm run dev # 开发模式(localhost:3001)
|
||||
npm run build # 生产构建
|
||||
npm test # 运行测试
|
||||
npm run lint # 代码检查
|
||||
npm run typecheck # 类型检查
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📂 项目结构
|
||||
|
||||
```
|
||||
@@ -181,4 +223,4 @@ src/
|
||||
|
||||
## 📄 License
|
||||
|
||||
MIT © [MetonaTeam](https://git.metona.cn/MetonaTeam)
|
||||
MIT © [MetonaTeam](https://git.metona.cn/MetonaTeam/MetonaSqlark)
|
||||
|
||||
Reference in New Issue
Block a user