vue3+vite+SQL.js如何讀取db3文件數(shù)據(jù)
vue3+vite+SQL.js讀取db3文件數(shù)據(jù)
最近遇到一個需求是讀取本地SQLite文件,還是花費(fèi)了點(diǎn)時間才實(shí)現(xiàn),沒怎么看到vite方面寫這個的文章,現(xiàn)在分享出來完整流程。
Tips:解決了打包后wasm文件404問題,在后續(xù)
1.pnpm下載SQL.js(什么都可以下)
pnpm add SQL.js
2.【重點(diǎn)】如果你執(zhí)行wasm文件時報錯404,請執(zhí)行:
pnpm add --save-dev @rollup/plugin-wasm
在vite.config,js中寫入:
...
build: {
rollupOptions: {
plugins: [
// 在這里添加 wasm 插件
wasm({
include: /\.wasm$/i // 這里可能需要調(diào)整為你的文件路徑和名稱
})
],
}
}
...
3.在使用的頁面中,你需要引入了,但是我在使用setup語法糖寫法時候報錯,因?yàn)閳?zhí)行順序的問題,這里有兩種解決辦法;
第一種:不使用語法糖,使用setup()形式;
第二種:使用語法糖,結(jié)合onMounted,nextTick解決,以下:
import { onMounted, nextTick, ref } from "vue";
import initSqlJs from "sql.js";
const databaseContent = ref(null);
let SQL, db;
onMounted(async (nextTick) => {
SQL = await initSqlJs({
locateFile: (file) => `/node_modules/sql.js/dist/${file}`
});
db = new SQL.Database();
});
4.添加選擇文件控件,選擇.db3文件,觸發(fā)onFileChange 方法
<input type="file" @change="onFileChange" />
<div>
<ul>
<li v-for="(item, index) in databaseContent" :key="index">
{{ item }}
</li>
</ul>
</div>
const onFileChange = (event) => {
const fileInput = event.target;
const file = fileInput.files[0];
if (file) {
const reader = new FileReader();
reader.onload = () => {
const Uints = new Uint8Array(reader.result);
db = new SQL.Database(Uints);
const result = db.exec("SELECT PhotoFile FROM Photo");
if (result && result.length) {
let table = result[0].values.flat().map((str) => {
let newRow = str.replace(".\\", "");
let newOvrRow = newRow + ".ovr";
return [newRow, newOvrRow];
});
databaseContent.value = table.flat();
}
};
reader.readAsArrayBuffer(file);
}
};
主要是這幾句:
const Uints = new Uint8Array(reader.result);
db = new SQL.Database(Uints);
const result = db.exec("SELECT PhotoFile FROM Photo");
...
reader.readAsArrayBuffer(file);
這是db3數(shù)據(jù)庫的結(jié)構(gòu):

我取其中的PhotoFile值(.ovr不用看,我自己加的):

以上的操作在vue打包后再運(yùn)行會報錯
因?yàn)閣asm文件沒有被打包進(jìn)去,經(jīng)過排查,主要是sql-wasm.wasm這個文件
1.將該文件復(fù)制出來,放在public下,我的路徑是public-vender-sql-wasm.wasm

2.import引入該文件
import sqlWasm from "/vender/sql-wasm.wasm";
onMounted(async (nextTick) => {
SQL = await initSqlJs({
locateFile: (file) => sqlWasm
});
});
3.此時依舊會報錯,需修改vite.config.js配置
添加
assetsInclude: ["**/*.wasm"] publicDir: "public", publicPath: "./", base: "/", // hash模式 ./ 歷史模式 /
總結(jié)
完美解決!
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何在Vue3中實(shí)現(xiàn)文件上傳功能結(jié)合后端API
文件上傳的功能實(shí)現(xiàn)是我們做Web應(yīng)用時候最為常見的應(yīng)用場景,下面這篇文章主要給大家介紹了關(guān)于如何在Vue3中實(shí)現(xiàn)文件上傳功能結(jié)合后端API的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
Vue請求代理地址localhost報錯:[HPM] Error occurred whi
這篇文章主要介紹了在前后端聯(lián)調(diào)測試Vue時遇到的請求超時問題,通過排查發(fā)現(xiàn)是由于Vue請求的后端服務(wù)只監(jiān)聽了IPv4,而Vue發(fā)送的localhost地址請求被解析為IPv6的回環(huán)地址導(dǎo)致的,通過修改hosts文件將localhost改為127.0.0.1,并將Vue代理請求更換成127.0.0.1,解決了問題2026-02-02
vue相關(guān)配置文件詳解及多環(huán)境配置詳細(xì)步驟
這篇文章主要介紹了vue相關(guān)配置文件詳解及多環(huán)境配置的教程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
vue父元素點(diǎn)擊事件與子元素點(diǎn)擊事件沖突問題
這篇文章主要介紹了vue父元素點(diǎn)擊事件與子元素點(diǎn)擊事件沖突問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
Vue項(xiàng)目的甘特圖組件之dhtmlx-gantt使用教程和實(shí)現(xiàn)效果展示(推薦)
文章介紹了如何使用dhtmlx-gantt組件來實(shí)現(xiàn)公司的甘特圖需求,并提供了一個簡單的Vue組件示例,文章還分享了一些配置項(xiàng),如格式化表頭日期、設(shè)置甘特圖尺寸、啟用只讀模式、設(shè)置表格列等,感興趣的朋友一起看看吧2025-02-02
vue中數(shù)據(jù)字典dicts的簡單說明和用法介紹
這篇文章主要給大家介紹了關(guān)于vue中數(shù)據(jù)字典dicts的簡單說明和用法的相關(guān)資料,如果您想在Vue中使用字典查詢,您可以使用Vue的計算屬性和方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01

