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/

目录结构

效果控制台展示


相关推荐
苦藤新鸡7 小时前
27.合并有序链表,串葫芦
前端·javascript·链表
_OP_CHEN7 小时前
【前端开发之HTML】(四)HTML 标签进阶:表格、表单、布局全掌握,从新手到实战高手!
前端·javascript·css·html·html5·网页开发·html标签
谢尔登7 小时前
Vue3底层原理——keep-alive
javascript·vue.js·ecmascript
Deca~7 小时前
VueVirtualLazyTree-支持懒加载的虚拟树
前端·javascript·vue.js
2501_944526427 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 主题切换实现
android·开发语言·javascript·python·flutter·游戏·django
爱上妖精的尾巴7 小时前
7-11 WPS JS宏 对象的属性值为函数的写法与用法
前端·javascript·wps·js宏·jsa
爱上妖精的尾巴7 小时前
7-12 WPS JS宏 this、return用构造函数自定义类-1:对象内部函数,外部调用的写法
前端·javascript·wps·js宏·jsa
HIT_Weston7 小时前
106、【Ubuntu】【Hugo】搭建私人博客:模糊搜索 Fuse.js(二)
linux·javascript·ubuntu
冲刺逆向7 小时前
【js逆向案例六】创宇盾(加速乐)通杀模版
java·前端·javascript
我穿棉裤了7 小时前
文字换行自动添加换行符“-”
前端·javascript·vue.js