Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/rob-blackbourn/jetblack-duckdb-react

Utilities for using DuckDB in react
https://github.com/rob-blackbourn/jetblack-duckdb-react

duckdb duckdb-wasm react

Last synced: about 1 month ago
JSON representation

Utilities for using DuckDB in react

Awesome Lists containing this project

README

        

# @jetblack/duckdb-react

A DuckDB context provider for React.

You can find an example app using vite [here](https://github.com/rob-blackbourn/demo-duckdb-react-vite),
webpack [here](https://github.com/rob-blackbourn/demo-duckdb-react-webpack).
and create-react-app [here](https://github.com/rob-blackbourn/demo-duckdb-react-cra)

## Development

If you are interested in the implementation, the library code is in [`lib`](./lib),
and an example application is in [`src`](./src). To use from source, clone the
project, install the packages, then run the example with `npm run dev`.

## Installation

Install from [npmjs](https://www.npmjs.com/package/@jetblack/duckdb-react).

```bash
npm install @jetblack/duckdb-react
```

## Usage

Use the `DuckDB` context provider to connect to the database.

Children of the `DuckDB` component will have access to the database context.

```typescript
import DuckDB, { useDuckDB } from '@jetblack/duckdb-react'

export default function App() {
return (



)
}

function HelloWorld() {
// Get the DuckDB context from the hook.
const { db, loading, error } = useDuckDB()

useEffect(() => {
if (loading || !db || error) {
return
}

// Do something with duckdb.

}, [loading, db, error])

return

Hello, World!

}

```

The `DuckDB` component takes the following properties:

* `bundles`: [`DuckDBBundles`](https://shell.duckdb.org/docs/interfaces/index.DuckDBBundles.html) `|` `undefined` - see the section on bundles below,
* `config`: [`DuckDBConfig`](https://shell.duckdb.org/docs/interfaces/index.DuckDBConfig.html) `|` `undefined` - Optional configuration to apply to the database.
* `logger`: [`Logger`](https://shell.duckdb.org/docs/interfaces/index.Logger.html) `|` `undefined` - defaults to the built in [`ConsoleLogger`](https://shell.duckdb.org/docs/classes/index.ConsoleLogger.html).

The properties returned by `useDuckDB` are:

* `db`: [`AsyncDuckDB`](https://shell.duckdb.org/docs/classes/index.AsyncDuckDB.html) `|` `undefined` - Set to the database when successfully instantiated.
* `progress`: [`InstantiationProgress`](https://shell.duckdb.org/docs/interfaces/index.InstantiationProgress.html) `|` `undefined` - This is updated during the database instantiation.
* `loading`: `boolean` - This is initially `false`, becoming `true` when either the `db` or `error` property is set.
* `error`: `string | Error | undefined` - Set to the error when instantiation has failed.

### Bundles

In order to create the context a wasm "bundle" may be provided. If a bundle is
not specified it will be downloaded from the JsDelivr CDN.

If specified the bundle is specific to the development environment. The following
gives the bundles defined by the [DuckDB documentation](https://duckdb.org/docs/api/wasm/instantiation).

#### No bundle

If no bundle is provided the bundle will be discovered from the JsDelivr CDN.

#### vite

For vite, create the following.

```typescript
import DuckDB from '@jetblack/duckdb-react'

import { DuckDBBundles } from '@duckdb/duckdb-wasm'
import duckdbMvpWasm from '@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm?url'
import duckdbMvpWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-mvp.worker.js?url'
import duckdbEHWasm from '@duckdb/duckdb-wasm/dist/duckdb-eh.wasm?url'
import duckdbEHWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js?url'

const VITE_BUNDLES: DuckDBBundles = {
mvp: {
mainModule: duckdbMvpWasm,
mainWorker: duckdbMvpWorker
},
eh: {
mainModule: duckdbEHWasm,
mainWorker: duckdbEHWorker
}
}

export default function App() {
return (

...

)
}
```

#### webpack

For webpack, create the following `bundle.ts`.

```typescript bundle.js
import DuckDB from '@jetblack/duckdb-react'

import { DuckDBBundles } from '@duckdb/duckdb-wasm'
import duckdbMvpWasm from '@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm'
import duckdbEHWasm from '@duckdb/duckdb-wasm/dist/duckdb-eh.wasm'

const WEBPACK_BUNDLES: DuckDBBundles = {
mvp: {
mainModule: duckdbMvpWasm,
mainWorker: new URL('@duckdb/duckdb-wasm/dist/duckdb-browser-mvp.worker.js', import.meta.url).toString(),
},
eh: {
mainModule: duckdbEHWasm,
mainWorker: new URL('@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js', import.meta.url).toString(),
}
}

export default function App() {
return (

...

)
}
```