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 小时前
时间戳转换工具
开发语言·javascript·工具
这是个栗子7 小时前
【Vue代码分析】vue方法的调用与命名问题
前端·javascript·vue.js·this
全栈前端老曹7 小时前
【前端路由】Vue Router 动态导入与懒加载 - 使用 () => import(‘...‘) 实现按需加载组件
前端·javascript·vue.js·性能优化·spa·vue-router·懒加载
温宇飞7 小时前
高效的线性采样高斯模糊
javascript·webgl
POLITE37 小时前
Leetcode 160.相交链表 JavaScript (Day 9)
javascript·leetcode·链表
再睡一夏就好8 小时前
LInux线程池实战:单例模式设计与多线程安全解析
linux·运维·服务器·开发语言·javascript·c++·ecmascript
Beginner x_u8 小时前
从 Promise 到 async/await:一次把 JavaScript 异步模型讲透
javascript·ajax·promise·异步·async await
韩曙亮8 小时前
【Web APIs】移动端轮播图案例 ( 轮播图自动播放 | 设置无缝衔接滑动 | 手指滑动轮播图 | 完整代码示例 )
前端·javascript·css·html·轮播图·移动端·web apis
2501_946244788 小时前
Flutter & OpenHarmony OA系统图片预览组件开发指南
android·javascript·flutter
xu_duo_i9 小时前
vue3+element-plus图片上传,前端压缩(纯函数,无插件)
前端·javascript·vue.js