vue3+vite+SQL.js 读取db3文件数据

前言:好久没写博客了,最近一直在忙,没时间梳理。最近遇到一个需求是读取本地SQLite文件,还是花费了点时间才实现,没怎么看到vite方面写这个的文章,现在分享出来完整流程。

Tips:解决了打包后wasm文件404问题,在后续

1.pnpm下载SQL.js(什么都可以下)

pnpm add SQL.js

2.【重点】如果你执行wasm文件时报错404,请执行:

pnpm add --save-dev @rollup/plugin-wasm

在vite.config,js中写入:

...
   build: {
    	rollupOptions: {
        plugins: [
          // 在这里添加 wasm 插件
          wasm({
            include: /\.wasm$/i // 这里可能需要调整为你的文件路径和名称
          })
        ],
	}
}
...

3.在使用的页面中,你需要引入了,但是我在使用setup语法糖写法时候报错,因为执行顺序的问题,这里有两种解决办法;
第一种:不使用语法糖,使用setup()形式;
第二种:使用语法糖,结合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文件,触发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数据库的结构:

在这里插入图片描述
我取其中的PhotoFile值(.ovr不用看,我自己加的):
在这里插入图片描述


以上的操作,在vue打包后再运行会报错,因为wasm文件没有被打包进去,经过排查,主要是sql-wasm.wasm这个文件

1.将该文件复制出来,放在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模式 ./ 历史模式 /

完美解决

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 和 Vite 是现代前端开发中的热门组合,Vite 是一个由尤雨溪(Vite的开发者)创建的高性能前端构建工具,它提供了快速的热更新和预构建能力。在使用 Vite 构建 Vue 项目时,你可能会遇到需要在 `vite.config.js` 文件中配置本地代理的情况,以便访问在开发环境下运行的 API 或静态资源。 在 `vite.config.js` 中,你可以使用 `define` 函数定义一个名为 `proxy` 的对象,这个对象的键是你希望访问的服务路径,值是一个配置对象。以下是一个基本的配置示例: ```javascript export default defineConfig({ // ...其他配置 // 本地代理配置 proxy: { '/api': { target: 'http://localhost:8080', // 你要代理的目标服务器地址 changeOrigin: true, // 允许跨域请求 pathRewrite: { '^/api' : '' } // 将请求的路径前缀 '/api' 替换为空字符串 } } }); ``` 在这个例子中: - `/api` 是你在前端应用中想访问的路径,例如 `/api/data`。 - `target` 指定了代理请求发送到的服务器地址。 - `changeOrigin` 设置为 `true`,意味着 Vite 会在发送请求时自动添加 `Origin` 头,处理跨域问题。 - `pathRewrite` 部分用于重写路径,这里将所有以 `/api` 开始的路径映射到目标服务器的根路径。 如果你有多个代理规则,可以在 `proxy` 对象中添加更多条目,每个条目对应不同的服务或路径。 相关问题: 1. Vite 的代理功能是如何实现的? 2. 当我们在生产环境中部署时,是否还需要设置这样的代理配置? 3. 如何在 Vite 中处理动态生成的代理路径?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值