Upgrade DuckDB-Wasm di CF Pages
Mengatasi ukuran file melebihi batas
Sore ini, pustaka @duckdb/duckdb-wasm diperbarui. Versi anyar ini sudah lama saya tunggu-tunggu karena memungkinkan penggunaan ekstensi duckdb penting seperti JSON dan spatial.
Saya upgrade npm. Bisa berjalan di lokal.
Naas, ketika deploy ke Cloudflare Pages, saya mendapat:
19:40:41.898 ✘ [ERROR] Error: Pages only supports files up to 26.2 MB in size
19:40:41.898
19:40:41.898 _app/immutable/assets/duckdb-eh.ee0056b2.wasm is 33.3 MB in size
File .wasm
melebihi batas ukuran yang diperbolehkan oleh Cloudflare.
Di file duckdb.js
SvelteKit saya coba muat duckdb dengan:
import * as duckdb from 'https://cdn.jsdelivr.net/npm/@duckdb/[email protected]/+esm'
Yang ternyata tak diperbolehkan:
|- Error: Cannot find module 'https://cdn.jsdelivr.net/npm/@duckdb/[email protected]/+esm'
Saya utak-atik file +page.svelte
, mencoba cara di REPL ini, juga tak berhasil.
Akhirnya, saya ke GH Actions duckdb-wasm, lalu mengunduh berkas duckdb-wasm-packages
dari artefak.
Buka direktori duckdb-wasm
, hapus semua file .wasm
yang berukuran besar, lalu npm pack
. Unggah pustaka ke Cloudflare R2, lalu instal.
"@duckdb/duckdb-wasm": "https://storage.sekuel.com/duckdb-duckdb-wasm-1.28.1-dev91.0.tgz",
Coba jalankan di lokal, berhasil. Deploy ulang ke CF Pages, sukses!
Begini isi file duckdb.js
yang saya pakai untuk inisiasi DuckDB-WASM:
import * as duckdb from '@duckdb/duckdb-wasm';
const initDB = async () => {
const JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();
// Select a bundle based on browser checks
const bundle = await duckdb.selectBundle(JSDELIVR_BUNDLES);
const worker_url = URL.createObjectURL(
new Blob([`importScripts("${bundle.mainWorker}");`], { type: 'text/javascript' })
);
// Instantiate the asynchronus version of DuckDB-wasm
const worker = new Worker(worker_url);
const logger = new duckdb.ConsoleLogger();
const db = new duckdb.AsyncDuckDB(logger, worker);
await db.instantiate(bundle.mainModule, bundle.pthreadWorker);
URL.revokeObjectURL(worker_url);
return db;
};
export { initDB, duckdb };