electron-vite桌面端better-sqlite3跨平台兼容问题

之前开发桌面程序时遇到一个sqlite3的问题,本地启动没问题,打包后,mac和win系统不行,better-sqlite3打不进去,而且重新编译也不行,一直报错,后面经过多方面找文档和测试现在终于可以了

我自己用的版本

"better-sqlite3": "^9.6.0",

"electron": "21.3.4",

"electron-builder": "^25.1.8",

"electron-rebuild": "^3.2.9",

"electron-vite": "^4.0.0",

better-sqlite3.node版本准备

  1. 我目前准备了3个,这个在git(传送门)上有,需要根据自己的chromium内核版本来选择对应的better-sqlite3.node版本
  2. chrom内核版本是跟electron发行版本对应的,(网址:传送门),根据对应版本再去git上找better-sqlite3的版本
  1. 在src目录下新建resources文件夹
  2. 将下载的better-sqlite3.node放在对应的系统文件夹中

新增afterPack编译脚本

path.join需要提供完整的app资源路径,进行替换,mac和win是最终测试完成的,需要根据自己程序名称和路径调整

js 复制代码
const fs = require('fs')
const path = require('path')

function copyFileSync(destDirName, destPath) {
  const target = path.join(__dirname, `../resources/${destDirName}/better_sqlite3.node`)
  fs.copyFileSync(target, destPath)
}

exports.default = function (context) {
  const { appOutDir, outDir } = context
  let destPath = null
  if (context.packager.platform.nodeName === 'darwin') {
    // 具体枚举参考文档:https://www.electron.build/app-builder-lib.enumeration.arch
    if (context.arch === 1) {
      // x64
      // copyFileSync('darwin-x64', destPath)
      // console.log('【darwin-x64】 better-sqlite3拷贝成功')
      throw new Error('【darwin-x64】 当前平台暂不支持,请适配后打包')
      return
    } else if (context.arch === 3) {
      destPath = path.join(
        appOutDir,
        'test.app',
        'Contents',
        'resources',
        'app.asar.unpacked',
        'node_modules',
        'better-sqlite3',
        'build',
        'Release',
        'better_sqlite3.node'
      )
      // arm64
      copyFileSync('darwin-arm64', destPath)
      console.log('【darwin-arm64】 better-sqlite3拷贝成功')
      return
    }
  } else if (context.packager.platform.nodeName === 'win32') {
    if (context.arch === 1) {
      destPath = path.join(
        appOutDir,
        'resources',
        'app.asar.unpacked',
        'node_modules',
        'better-sqlite3',
        'build',
        'Release',
        'better_sqlite3.node'
      )
      // x64
      copyFileSync('win32-x64', destPath)
      console.log('【win32-x64】 better-sqlite3拷贝成功')
      return
    } else {
      destPath = path.join(
        appOutDir,
        'resources',
        'app.asar.unpacked',
        'node_modules',
        'better-sqlite3',
        'build',
        'Release',
        'better_sqlite3.node'
      )
      // x32
      copyFileSync('win32-x32', destPath)
      console.log('【win32-x32 better-sqlite3拷贝成功')
      return
    }
  } else if (context.packager.platform.nodeName === 'linux') {
    // copyFileSync('linux-x64', destPath)
    // console.log('【linux-x64】 better-sqlite3拷贝成功')
    throw new Error('【linux-x64】】 当前平台暂不支持,请适配后打包')
    return
  }
  throw new Error('当前平台暂不支持,请适配后打包')
}

electron-builder.yml 配置

配置需要将上面的脚步放在 afterPack:属性上, 其他的应该我没有别的改动

yml 复制代码
appId: com.test.stock.app
productName: test
directories:
  buildResources: build
files:
  - '!**/.vscode/*'
  - '!src/*'
  - '!server/*'
  - '!globel/*'
  - '!electron.vite.config.{js,ts,mjs,cjs}'
  - '!{.eslintcache,eslint.config.mjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}'
  - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}'
  - '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}'
asarUnpack:
  - resources/**
# 将脚本放在这
afterPack: './scripts/before-pack.js'
npmRebuild: false
win:
  executableName: stock-sync-plugin
  requestedExecutionLevel: requireAdministrator
  signAndEditExecutable: true
  #executableName: electron-app
  target:
    - target: nsis
      # arch:
      # - x64
      # - ia32
  icon: build/icon.ico
nsis:
  oneClick: false
  allowToChangeInstallationDirectory: true
  createStartMenuShortcut: true # 创建开始菜单快捷方式
  allowElevation: true #  一般情况下,此字段不会被直接使用,权限提升主要依赖于 perMachine 的设定。当perMachine为true,安装程序会请求管理员权限
  deleteAppDataOnUninstall: true # 如果设置为 true,卸载程序将删除AppData中的所有程序数据
  # shortcutName: Stock Sync Plugin # 快捷方式名称
  artifactName: ${name}-${version}-setup.${ext}
  shortcutName: ${productName}
  uninstallDisplayName: ${productName}
  createDesktopShortcut: always
mac:
  entitlementsInherit: build/entitlements.mac.plist
  extendInfo:
    - NSCameraUsageDescription: Application requests access to the device's camera.
    - NSMicrophoneUsageDescription: Application requests access to the device's microphone.
    - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder.
    - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.
  notarize: false
  icon: build/icon.icns
  # target:
  #   - target: default
  #     arch:
  #       - x64
  #       - arm64
dmg:
  artifactName: ${name}-${version}.${ext}
linux:
  target:
    - AppImage
    - snap
    - deb
  maintainer: electronjs.org
  category: Utility
appImage:
  artifactName: ${name}-${version}.${ext}
publish:
  provider: generic
  url: https://example.com/auto-updates
electronDownload:
  mirror: https://npmmirror.com/mirrors/electron/

目录结构

效果控制台展示


相关推荐
岛风风2 小时前
前端HTML导出PDF分页难题:10天踩坑后的终极方案,精细到每个像素点!!!
前端·javascript
alanAltman2 小时前
前端架构范式:意图系统构建web
前端·javascript
梦鱼2 小时前
我踩了 72 小时的 Electron webview PDF 灰色坑,只为告诉你:别写这行代码!
前端·javascript·electron
亭上秋和景清2 小时前
指针进阶: 回调函数
开发语言·前端·javascript
姜太小白3 小时前
【数据库】SQLite 时间加1天的方法总结
java·数据库·sqlite
豆苗学前端3 小时前
彻底讲透浏览器的事件循环,吊打面试官
前端·javascript·面试
来自上海的这位朋友3 小时前
从零打造一个无依赖的Canvas图片编辑器
javascript·vue.js·canvas
song5013 小时前
鸿蒙 Flutter 语音交互进阶:TTS/STT 全离线部署与多语言适配
分布式·flutter·百度·华为·重构·electron·交互
灰灰勇闯IT3 小时前
RN跨端适配与沉浸式体验:适配不同设备与系统
javascript·react native·react.js
i_am_a_div_日积月累_3 小时前
el-table实现自动滚动;列表自动滚动
开发语言·javascript·vue.js